From 00b1ba1124037304880385f94dc42b0f94cff92e Mon Sep 17 00:00:00 2001 From: Rowan Goemans Date: Tue, 8 Oct 2019 11:20:26 +0200 Subject: [PATCH] irma/main#328 - Cleaned up project structure and removed various unused template stuff. - Added i18n lib and split moved all translations to seperate files. - Added very simple language selector. --- .bundle/config | 3 +- Gemfile | 3 +- Gemfile.lock | 37 +- _config.yml | 7 +- _i18n/de.yml | 232 + _i18n/en.yml | 232 + _i18n/nl.yml | 232 + _includes/block-cta-bar.html | 15 - _includes/block-feature-1.html | 17 - _includes/block-feature-2.html | 13 - _includes/block-footer-1.html | 5 - _includes/block-header-1.html | 23 - _includes/block-header-2.html | 18 - _includes/block-header-3.html | 9 - _includes/block-hero-1.html | 5 - _includes/block-hero-2.html | 20 - _includes/block-irma-1.html | 6 - .../{block-faq-1.html => block-irma-faq.html} | 8 +- _includes/block-irma-footer-2.html | 25 - _includes/block-irma-footer.html | 40 + ...a-header-1.html => block-irma-header.html} | 9 +- _includes/block-irma-hero-1.html | 6 + ...ock-irma-2.html => block-irma-hero-2.html} | 10 +- _includes/block-irma-three-column-1.html | 36 - _includes/block-irma-three-column.html | 28 + _includes/block-media-1.html | 10 - _includes/block-media-2.html | 22 - _includes/block-one-column-1.html | 10 - _includes/block-text-1.html | 12 - _includes/block-three-column-1.html | 37 - _includes/block-three-column-irma-1.html | 37 - _includes/block-two-column-1.html | 14 - _includes/head.html | 5 +- _includes/svg.html | 2 +- css/irma.css | 15 + index.md | 290 +- 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 103936 -> 0 bytes .../ruby/2.3.0/cache/colorator-1.1.0.gem | Bin 7168 -> 0 bytes vendor/bundle/ruby/2.3.0/cache/ffi-1.9.25.gem | Bin 867840 -> 0 bytes .../cache/forwardable-extended-2.6.0.gem | Bin 6656 -> 0 bytes .../bundle/ruby/2.3.0/cache/jekyll-3.6.3.gem | Bin 94208 -> 0 bytes .../ruby/2.3.0/cache/jekyll-feed-0.9.2.gem | Bin 15872 -> 0 bytes .../ruby/2.3.0/cache/jekyll-menus-0.6.0.gem | Bin 6656 -> 0 bytes .../cache/jekyll-sass-converter-1.5.2.gem | Bin 5632 -> 0 bytes .../ruby/2.3.0/cache/jekyll-watch-1.5.1.gem | Bin 6144 -> 0 bytes .../ruby/2.3.0/cache/kramdown-1.17.0.gem | Bin 260608 -> 0 bytes .../bundle/ruby/2.3.0/cache/liquid-4.0.1.gem | Bin 72704 -> 0 bytes .../bundle/ruby/2.3.0/cache/listen-3.1.5.gem | Bin 27648 -> 0 bytes .../ruby/2.3.0/cache/mercenary-0.3.6.gem | Bin 16896 -> 0 bytes .../ruby/2.3.0/cache/pathutil-0.16.1.gem | Bin 11776 -> 0 bytes .../ruby/2.3.0/cache/public_suffix-3.0.3.gem | Bin 96768 -> 0 bytes .../ruby/2.3.0/cache/rb-fsevent-0.10.3.gem | Bin 50688 -> 0 bytes .../ruby/2.3.0/cache/rb-inotify-0.9.10.gem | Bin 14848 -> 0 bytes .../bundle/ruby/2.3.0/cache/rouge-2.2.1.gem | Bin 281088 -> 0 bytes .../ruby/2.3.0/cache/ruby_dep-1.5.0.gem | Bin 11776 -> 0 bytes .../ruby/2.3.0/cache/safe_yaml-1.0.4.gem | Bin 30208 -> 0 bytes vendor/bundle/ruby/2.3.0/cache/sass-3.6.0.gem | Bin 320000 -> 0 bytes .../ruby/2.3.0/cache/sass-listen-4.0.0.gem | Bin 27136 -> 0 bytes .../2.3.0/ffi-1.9.25/ffi_c.bundle | Bin 185524 -> 0 bytes .../2.3.0/ffi-1.9.25/gem.build_complete | 0 .../2.3.0/ffi-1.9.25/gem_make.out | 140 - .../2.3.0/ffi-1.9.25/mkmf.log | 250 - .../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 115740 -> 0 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 - .../ruby/2.3.0/gems/ffi-1.9.25/.gitignore | 22 - .../ruby/2.3.0/gems/ffi-1.9.25/.gitmodules | 3 - .../ruby/2.3.0/gems/ffi-1.9.25/.travis.yml | 52 - .../ruby/2.3.0/gems/ffi-1.9.25/.yardopts | 5 - .../ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md | 74 - .../bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING | 49 - .../bundle/ruby/2.3.0/gems/ffi-1.9.25/Gemfile | 15 - .../bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE | 24 - .../ruby/2.3.0/gems/ffi-1.9.25/LICENSE.SPECS | 22 - .../ruby/2.3.0/gems/ffi-1.9.25/README.md | 112 - .../ruby/2.3.0/gems/ffi-1.9.25/Rakefile | 268 - .../ruby/2.3.0/gems/ffi-1.9.25/appveyor.yml | 22 - .../ffi-1.9.25/ext/ffi_c/.RUBYARCHDIR.time | 0 .../ffi-1.9.25/ext/ffi_c/AbstractMemory.c | 1109 -- .../ffi-1.9.25/ext/ffi_c/AbstractMemory.h | 175 - .../gems/ffi-1.9.25/ext/ffi_c/ArrayType.c | 162 - .../gems/ffi-1.9.25/ext/ffi_c/ArrayType.h | 59 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Buffer.c | 365 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.c | 520 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.h | 110 - .../gems/ffi-1.9.25/ext/ffi_c/ClosurePool.c | 283 - .../gems/ffi-1.9.25/ext/ffi_c/ClosurePool.h | 57 - .../gems/ffi-1.9.25/ext/ffi_c/DataConverter.c | 91 - .../ffi-1.9.25/ext/ffi_c/DynamicLibrary.c | 339 - .../ffi-1.9.25/ext/ffi_c/DynamicLibrary.h | 98 - .../gems/ffi-1.9.25/ext/ffi_c/Function.c | 1001 -- .../gems/ffi-1.9.25/ext/ffi_c/Function.h | 87 - .../gems/ffi-1.9.25/ext/ffi_c/FunctionInfo.c | 271 - .../gems/ffi-1.9.25/ext/ffi_c/LastError.c | 184 - .../gems/ffi-1.9.25/ext/ffi_c/LastError.h | 47 - .../gems/ffi-1.9.25/ext/ffi_c/LongDouble.c | 63 - .../gems/ffi-1.9.25/ext/ffi_c/LongDouble.h | 51 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Makefile | 263 - .../gems/ffi-1.9.25/ext/ffi_c/MappedType.c | 168 - .../gems/ffi-1.9.25/ext/ffi_c/MappedType.h | 59 - .../gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.c | 197 - .../gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.h | 53 - .../gems/ffi-1.9.25/ext/ffi_c/MethodHandle.c | 358 - .../gems/ffi-1.9.25/ext/ffi_c/MethodHandle.h | 55 - .../gems/ffi-1.9.25/ext/ffi_c/Platform.c | 129 - .../gems/ffi-1.9.25/ext/ffi_c/Platform.h | 45 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.c | 508 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.h | 63 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.c | 829 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.h | 106 - .../ffi-1.9.25/ext/ffi_c/StructByReference.c | 190 - .../ffi-1.9.25/ext/ffi_c/StructByReference.h | 50 - .../gems/ffi-1.9.25/ext/ffi_c/StructByValue.c | 150 - .../gems/ffi-1.9.25/ext/ffi_c/StructByValue.h | 55 - .../gems/ffi-1.9.25/ext/ffi_c/StructLayout.c | 698 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.c | 353 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.h | 95 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.c | 397 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.h | 62 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.c | 139 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.h | 89 - .../gems/ffi-1.9.25/ext/ffi_c/Variadic.c | 304 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/compat.h | 78 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.h | 9 - .../gems/ffi-1.9.25/ext/ffi_c/extconf.rb | 72 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi.c | 98 - .../gems/ffi-1.9.25/ext/ffi_c/ffi_c.bundle | Bin 185524 -> 0 bytes .../.libs/libffi.7.dylib | Bin 55212 -> 0 bytes .../.libs/libffi.dylib | 1 - .../libffi-universal-darwin18/.libs/libffi.la | 1 - .../.libs/libffi.lai | 41 - .../.libs/libffi_convenience.la | 1 - .../ffi_c/libffi-universal-darwin18/Makefile | 1809 --- .../libffi-universal-darwin18/config.log | 1318 -- .../libffi-universal-darwin18/config.status | 2436 --- .../libffi-universal-darwin18/fficonfig.h | 211 - .../include/Makefile | 604 - .../libffi-universal-darwin18/include/ffi.h | 511 - .../include/ffitarget.h | 1 - .../ffi_c/libffi-universal-darwin18/libffi.la | 41 - .../ffi_c/libffi-universal-darwin18/libffi.pc | 11 - .../libffi_convenience.la | 41 - .../ffi_c/libffi-universal-darwin18/libtool | 11813 -------------- .../ffi_c/libffi-universal-darwin18/local.exp | 2 - .../libffi-universal-darwin18/man/Makefile | 558 - .../src/.deps/.dirstamp | 0 .../libffi-universal-darwin18/src/.dirstamp | 0 .../libffi-universal-darwin18/src/closures.lo | 12 - .../src/java_raw_api.lo | 12 - .../libffi-universal-darwin18/src/prep_cif.lo | 12 - .../libffi-universal-darwin18/src/raw_api.lo | 12 - .../libffi-universal-darwin18/src/types.lo | 12 - .../src/x86/.deps/.dirstamp | 0 .../src/x86/.dirstamp | 0 .../src/x86/ffi64.lo | 12 - .../src/x86/ffiw64.lo | 12 - .../src/x86/unix64.lo | 12 - .../src/x86/win64.lo | 12 - .../ffi_c/libffi-universal-darwin18/stamp-h1 | 1 - .../testsuite/Makefile | 608 - .../gems/ffi-1.9.25/ext/ffi_c/libffi.bsd.mk | 40 - .../ffi-1.9.25/ext/ffi_c/libffi.darwin.mk | 105 - .../gems/ffi-1.9.25/ext/ffi_c/libffi.gnu.mk | 32 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.mk | 18 - .../gems/ffi-1.9.25/ext/ffi_c/libffi.vc.mk | 26 - .../gems/ffi-1.9.25/ext/ffi_c/libffi.vc64.mk | 26 - .../ffi-1.9.25/ext/ffi_c/libffi/.appveyor.yml | 50 - .../ffi_c/libffi/.github/issue_template.md | 10 - .../ffi-1.9.25/ext/ffi_c/libffi/.gitignore | 38 - .../ffi-1.9.25/ext/ffi_c/libffi/.travis.yml | 34 - .../ext/ffi_c/libffi/.travis/ar-lib | 270 - .../ext/ffi_c/libffi/.travis/build.sh | 34 - .../ext/ffi_c/libffi/.travis/compile | 351 - .../ext/ffi_c/libffi/.travis/install.sh | 22 - .../ext/ffi_c/libffi/.travis/moxie-sim.exp | 60 - .../ext/ffi_c/libffi/.travis/site.exp | 18 - .../ext/ffi_c/libffi/ChangeLog.libffi | 584 - .../ext/ffi_c/libffi/ChangeLog.libffi-3.1 | 6000 -------- .../ext/ffi_c/libffi/ChangeLog.libgcj | 40 - .../ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.v1 | 764 - .../gems/ffi-1.9.25/ext/ffi_c/libffi/LICENSE | 21 - .../ext/ffi_c/libffi/LICENSE-BUILDTOOLS | 352 - .../ffi-1.9.25/ext/ffi_c/libffi/Makefile.am | 166 - .../ffi-1.9.25/ext/ffi_c/libffi/README.md | 461 - .../ffi-1.9.25/ext/ffi_c/libffi/acinclude.m4 | 479 - .../ffi-1.9.25/ext/ffi_c/libffi/autogen.sh | 2 - .../ffi-1.9.25/ext/ffi_c/libffi/config.guess | 1466 -- .../ffi-1.9.25/ext/ffi_c/libffi/config.sub | 1836 --- .../ffi-1.9.25/ext/ffi_c/libffi/configure.ac | 390 - .../ext/ffi_c/libffi/configure.host | 289 - .../generate-darwin-source-and-headers.py | 203 - .../ext/ffi_c/libffi/include/Makefile.am | 9 - .../ext/ffi_c/libffi/include/ffi.h.in | 511 - .../ext/ffi_c/libffi/include/ffi_cfi.h | 55 - .../ext/ffi_c/libffi/include/ffi_common.h | 149 - .../ffi-1.9.25/ext/ffi_c/libffi/libffi.map.in | 80 - .../ffi-1.9.25/ext/ffi_c/libffi/libffi.pc.in | 11 - .../libffi/libffi.xcodeproj/project.pbxproj | 1043 -- .../ext/ffi_c/libffi/libtool-version | 29 - .../ffi-1.9.25/ext/ffi_c/libffi/m4/asmcfi.m4 | 13 - .../ext/ffi_c/libffi/m4/ax_append_flag.m4 | 71 - .../ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 | 194 - .../ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 | 122 - .../ffi_c/libffi/m4/ax_check_compile_flag.m4 | 74 - .../ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 | 87 - .../ext/ffi_c/libffi/m4/ax_configure_args.m4 | 70 - .../ext/ffi_c/libffi/m4/ax_enable_builddir.m4 | 302 - .../ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 | 263 - .../ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 | 89 - .../ext/ffi_c/libffi/m4/ax_require_defined.m4 | 37 - .../ext/ffi_c/libffi/man/Makefile.am | 8 - .../ffi-1.9.25/ext/ffi_c/libffi/man/ffi.3 | 41 - .../ext/ffi_c/libffi/man/ffi_call.3 | 103 - .../ext/ffi_c/libffi/man/ffi_prep_cif.3 | 68 - .../ext/ffi_c/libffi/man/ffi_prep_cif_var.3 | 73 - .../gems/ffi-1.9.25/ext/ffi_c/libffi/msvcc.sh | 328 - .../ext/ffi_c/libffi/src/aarch64/ffi.c | 941 -- .../ext/ffi_c/libffi/src/aarch64/ffitarget.h | 81 - .../ext/ffi_c/libffi/src/aarch64/internal.h | 67 - .../ext/ffi_c/libffi/src/aarch64/sysv.S | 438 - .../ext/ffi_c/libffi/src/alpha/ffi.c | 521 - .../ext/ffi_c/libffi/src/alpha/ffitarget.h | 57 - .../ext/ffi_c/libffi/src/alpha/internal.h | 23 - .../ext/ffi_c/libffi/src/alpha/osf.S | 282 - .../ext/ffi_c/libffi/src/arc/arcompact.S | 135 - .../ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffi.c | 266 - .../ext/ffi_c/libffi/src/arc/ffitarget.h | 53 - .../ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffi.c | 819 - .../ext/ffi_c/libffi/src/arm/ffitarget.h | 82 - .../ext/ffi_c/libffi/src/arm/internal.h | 7 - .../ext/ffi_c/libffi/src/arm/sysv.S | 383 - .../ext/ffi_c/libffi/src/avr32/ffi.c | 423 - .../ext/ffi_c/libffi/src/avr32/ffitarget.h | 55 - .../ext/ffi_c/libffi/src/avr32/sysv.S | 208 - .../ext/ffi_c/libffi/src/bfin/ffi.c | 196 - .../ext/ffi_c/libffi/src/bfin/ffitarget.h | 43 - .../ext/ffi_c/libffi/src/bfin/sysv.S | 179 - .../ext/ffi_c/libffi/src/closures.c | 966 -- .../ext/ffi_c/libffi/src/cris/ffi.c | 386 - .../ext/ffi_c/libffi/src/cris/ffitarget.h | 56 - .../ext/ffi_c/libffi/src/cris/sysv.S | 215 - .../ffi-1.9.25/ext/ffi_c/libffi/src/debug.c | 64 - .../ext/ffi_c/libffi/src/dlmalloc.c | 5166 ------- .../ext/ffi_c/libffi/src/frv/eabi.S | 128 - .../ffi-1.9.25/ext/ffi_c/libffi/src/frv/ffi.c | 292 - .../ext/ffi_c/libffi/src/frv/ffitarget.h | 62 - .../ext/ffi_c/libffi/src/ia64/ffi.c | 604 - .../ext/ffi_c/libffi/src/ia64/ffitarget.h | 56 - .../ext/ffi_c/libffi/src/ia64/ia64_flags.h | 40 - .../ext/ffi_c/libffi/src/ia64/unix.S | 567 - .../ext/ffi_c/libffi/src/java_raw_api.c | 374 - .../ext/ffi_c/libffi/src/m32r/ffi.c | 232 - .../ext/ffi_c/libffi/src/m32r/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/m32r/sysv.S | 121 - .../ext/ffi_c/libffi/src/m68k/ffi.c | 362 - .../ext/ffi_c/libffi/src/m68k/ffitarget.h | 54 - .../ext/ffi_c/libffi/src/m68k/sysv.S | 357 - .../ext/ffi_c/libffi/src/m88k/ffi.c | 400 - .../ext/ffi_c/libffi/src/m88k/ffitarget.h | 49 - .../ext/ffi_c/libffi/src/m88k/obsd.S | 209 - .../ext/ffi_c/libffi/src/metag/ffi.c | 330 - .../ext/ffi_c/libffi/src/metag/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/metag/sysv.S | 311 - .../ext/ffi_c/libffi/src/microblaze/ffi.c | 321 - .../ffi_c/libffi/src/microblaze/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/microblaze/sysv.S | 302 - .../ext/ffi_c/libffi/src/mips/ffi.c | 1130 -- .../ext/ffi_c/libffi/src/mips/ffitarget.h | 244 - .../ext/ffi_c/libffi/src/mips/n32.S | 663 - .../ext/ffi_c/libffi/src/mips/o32.S | 502 - .../ext/ffi_c/libffi/src/moxie/eabi.S | 101 - .../ext/ffi_c/libffi/src/moxie/ffi.c | 285 - .../ext/ffi_c/libffi/src/moxie/ffitarget.h | 52 - .../ext/ffi_c/libffi/src/nios2/ffi.c | 304 - .../ext/ffi_c/libffi/src/nios2/ffitarget.h | 52 - .../ext/ffi_c/libffi/src/nios2/sysv.S | 136 - .../ext/ffi_c/libffi/src/or1k/ffi.c | 328 - .../ext/ffi_c/libffi/src/or1k/ffitarget.h | 58 - .../ext/ffi_c/libffi/src/or1k/sysv.S | 107 - .../ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffi.c | 719 - .../ext/ffi_c/libffi/src/pa/ffitarget.h | 85 - .../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 | 566 - .../ffi_c/libffi/src/powerpc/aix_closure.S | 694 - .../ext/ffi_c/libffi/src/powerpc/asm.h | 125 - .../ext/ffi_c/libffi/src/powerpc/darwin.S | 378 - .../ffi_c/libffi/src/powerpc/darwin_closure.S | 571 - .../ext/ffi_c/libffi/src/powerpc/ffi.c | 173 - .../ext/ffi_c/libffi/src/powerpc/ffi_darwin.c | 1440 -- .../ffi_c/libffi/src/powerpc/ffi_linux64.c | 974 -- .../ffi_c/libffi/src/powerpc/ffi_powerpc.h | 94 - .../ext/ffi_c/libffi/src/powerpc/ffi_sysv.c | 923 -- .../ext/ffi_c/libffi/src/powerpc/ffitarget.h | 198 - .../ext/ffi_c/libffi/src/powerpc/linux64.S | 228 - .../libffi/src/powerpc/linux64_closure.S | 488 - .../ffi_c/libffi/src/powerpc/ppc_closure.S | 397 - .../ext/ffi_c/libffi/src/powerpc/sysv.S | 175 - .../ext/ffi_c/libffi/src/prep_cif.c | 261 - .../ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c | 267 - .../ext/ffi_c/libffi/src/riscv/ffi.c | 445 - .../ext/ffi_c/libffi/src/riscv/ffitarget.h | 68 - .../ext/ffi_c/libffi/src/riscv/sysv.S | 214 - .../ext/ffi_c/libffi/src/s390/ffi.c | 756 - .../ext/ffi_c/libffi/src/s390/ffitarget.h | 70 - .../ext/ffi_c/libffi/src/s390/internal.h | 11 - .../ext/ffi_c/libffi/src/s390/sysv.S | 325 - .../ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffi.c | 717 - .../ext/ffi_c/libffi/src/sh/ffitarget.h | 54 - .../ffi-1.9.25/ext/ffi_c/libffi/src/sh/sysv.S | 850 -- .../ext/ffi_c/libffi/src/sh64/ffi.c | 469 - .../ext/ffi_c/libffi/src/sh64/ffitarget.h | 58 - .../ext/ffi_c/libffi/src/sh64/sysv.S | 539 - .../ext/ffi_c/libffi/src/sparc/ffi.c | 468 - .../ext/ffi_c/libffi/src/sparc/ffi64.c | 608 - .../ext/ffi_c/libffi/src/sparc/ffitarget.h | 81 - .../ext/ffi_c/libffi/src/sparc/internal.h | 26 - .../ext/ffi_c/libffi/src/sparc/v8.S | 443 - .../ext/ffi_c/libffi/src/sparc/v9.S | 440 - .../ext/ffi_c/libffi/src/tile/ffi.c | 355 - .../ext/ffi_c/libffi/src/tile/ffitarget.h | 65 - .../ext/ffi_c/libffi/src/tile/tile.S | 360 - .../ffi-1.9.25/ext/ffi_c/libffi/src/types.c | 108 - .../ext/ffi_c/libffi/src/vax/elfbsd.S | 195 - .../ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffi.c | 276 - .../ext/ffi_c/libffi/src/vax/ffitarget.h | 49 - .../ext/ffi_c/libffi/src/x86/asmnames.h | 30 - .../ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi.c | 753 - .../ext/ffi_c/libffi/src/x86/ffi64.c | 884 -- .../ext/ffi_c/libffi/src/x86/ffitarget.h | 147 - .../ext/ffi_c/libffi/src/x86/ffiw64.c | 308 - .../ext/ffi_c/libffi/src/x86/internal.h | 29 - .../ext/ffi_c/libffi/src/x86/internal64.h | 22 - .../ext/ffi_c/libffi/src/x86/sysv.S | 1043 -- .../ext/ffi_c/libffi/src/x86/unix64.S | 525 - .../ext/ffi_c/libffi/src/x86/win64.S | 232 - .../ext/ffi_c/libffi/src/x86/win64_intel.S | 237 - .../ext/ffi_c/libffi/src/xtensa/ffi.c | 298 - .../ext/ffi_c/libffi/src/xtensa/ffitarget.h | 53 - .../ext/ffi_c/libffi/src/xtensa/sysv.S | 258 - .../ffi-1.9.25/ext/ffi_c/libffi/stamp-h.in | 1 - .../ext/ffi_c/libffi/testsuite/Makefile.am | 117 - .../ffi_c/libffi/testsuite/config/default.exp | 1 - .../ext/ffi_c/libffi/testsuite/lib/libffi.exp | 636 - .../libffi/testsuite/lib/target-libpath.exp | 283 - .../ffi_c/libffi/testsuite/lib/wrapper.exp | 45 - .../libffi/testsuite/libffi.bhaible/Makefile | 28 - .../libffi/testsuite/libffi.bhaible/README | 78 - .../libffi/testsuite/libffi.bhaible/alignof.h | 50 - .../testsuite/libffi.bhaible/bhaible.exp | 58 - .../testsuite/libffi.bhaible/test-call.c | 1745 --- .../testsuite/libffi.bhaible/test-callback.c | 2885 ---- .../testsuite/libffi.bhaible/testcases.c | 743 - .../testsuite/libffi.call/align_mixed.c | 46 - .../testsuite/libffi.call/align_stdcall.c | 46 - .../libffi/testsuite/libffi.call/call.exp | 43 - .../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_simple.c | 55 - .../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 - .../libffi/testsuite/libffi.call/cls_3float.c | 95 - .../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 | 132 - .../libffi.call/cls_align_longdouble_split2.c | 115 - .../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 | 61 - .../libffi/testsuite/libffi.call/cls_float.c | 42 - .../testsuite/libffi.call/cls_longdouble.c | 105 - .../testsuite/libffi.call/cls_longdouble_va.c | 61 - .../libffi.call/cls_many_mixed_args.c | 70 - .../libffi.call/cls_many_mixed_float_double.c | 55 - .../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 | 142 - .../libffi/testsuite/libffi.call/cls_schar.c | 44 - .../libffi/testsuite/libffi.call/cls_sint.c | 42 - .../libffi/testsuite/libffi.call/cls_sshort.c | 42 - .../testsuite/libffi.call/cls_struct_va1.c | 114 - .../libffi/testsuite/libffi.call/cls_uchar.c | 42 - .../testsuite/libffi.call/cls_uchar_va.c | 44 - .../libffi/testsuite/libffi.call/cls_uint.c | 43 - .../testsuite/libffi.call/cls_uint_va.c | 45 - .../testsuite/libffi.call/cls_ulong_va.c | 45 - .../testsuite/libffi.call/cls_ulonglong.c | 47 - .../libffi/testsuite/libffi.call/cls_ushort.c | 43 - .../testsuite/libffi.call/cls_ushort_va.c | 44 - .../testsuite/libffi.call/err_bad_abi.c | 36 - .../testsuite/libffi.call/err_bad_typedef.c | 26 - .../libffi/testsuite/libffi.call/ffitest.h | 138 - .../libffi/testsuite/libffi.call/float.c | 59 - .../libffi/testsuite/libffi.call/float1.c | 60 - .../libffi/testsuite/libffi.call/float2.c | 60 - .../libffi/testsuite/libffi.call/float3.c | 74 - .../libffi/testsuite/libffi.call/float4.c | 62 - .../libffi/testsuite/libffi.call/float_va.c | 107 - .../testsuite/libffi.call/huge_struct.c | 341 - .../ffi_c/libffi/testsuite/libffi.call/many.c | 59 - .../libffi/testsuite/libffi.call/many2.c | 57 - .../testsuite/libffi.call/many_double.c | 70 - .../libffi/testsuite/libffi.call/many_mixed.c | 78 - .../libffi/testsuite/libffi.call/negint.c | 52 - .../testsuite/libffi.call/nested_struct.c | 152 - .../testsuite/libffi.call/nested_struct1.c | 161 - .../testsuite/libffi.call/nested_struct10.c | 134 - .../testsuite/libffi.call/nested_struct11.c | 121 - .../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/offsets.c | 46 - .../libffi/testsuite/libffi.call/pr1172638.c | 127 - .../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 | 36 - .../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 - .../libffi/testsuite/libffi.call/strlen2.c | 49 - .../libffi/testsuite/libffi.call/strlen3.c | 49 - .../libffi/testsuite/libffi.call/strlen4.c | 55 - .../libffi/testsuite/libffi.call/struct1.c | 67 - .../libffi/testsuite/libffi.call/struct10.c | 57 - .../libffi/testsuite/libffi.call/struct2.c | 67 - .../libffi/testsuite/libffi.call/struct3.c | 60 - .../libffi/testsuite/libffi.call/struct4.c | 64 - .../libffi/testsuite/libffi.call/struct5.c | 66 - .../libffi/testsuite/libffi.call/struct6.c | 64 - .../libffi/testsuite/libffi.call/struct7.c | 74 - .../libffi/testsuite/libffi.call/struct8.c | 81 - .../libffi/testsuite/libffi.call/struct9.c | 68 - .../testsuite/libffi.call/testclosure.c | 70 - .../testsuite/libffi.call/uninitialized.c | 61 - .../testsuite/libffi.call/unwindtest.cc | 117 - .../libffi.call/unwindtest_ffi_call.cc | 54 - .../ffi_c/libffi/testsuite/libffi.call/va_1.c | 196 - .../libffi/testsuite/libffi.call/va_struct1.c | 121 - .../libffi/testsuite/libffi.call/va_struct2.c | 123 - .../libffi/testsuite/libffi.call/va_struct3.c | 125 - .../libffi.complex/cls_align_complex.inc | 91 - .../libffi.complex/cls_align_complex_double.c | 10 - .../libffi.complex/cls_align_complex_float.c | 10 - .../cls_align_complex_longdouble.c | 10 - .../testsuite/libffi.complex/cls_complex.inc | 42 - .../libffi.complex/cls_complex_double.c | 10 - .../libffi.complex/cls_complex_float.c | 10 - .../libffi.complex/cls_complex_longdouble.c | 10 - .../libffi.complex/cls_complex_struct.inc | 71 - .../cls_complex_struct_double.c | 10 - .../libffi.complex/cls_complex_struct_float.c | 10 - .../cls_complex_struct_longdouble.c | 10 - .../libffi.complex/cls_complex_va.inc | 80 - .../libffi.complex/cls_complex_va_double.c | 10 - .../libffi.complex/cls_complex_va_float.c | 16 - .../cls_complex_va_longdouble.c | 10 - .../testsuite/libffi.complex/complex.exp | 36 - .../testsuite/libffi.complex/complex.inc | 51 - .../libffi.complex/complex_defs_double.inc | 7 - .../libffi.complex/complex_defs_float.inc | 7 - .../complex_defs_longdouble.inc | 7 - .../testsuite/libffi.complex/complex_double.c | 10 - .../testsuite/libffi.complex/complex_float.c | 10 - .../testsuite/libffi.complex/complex_int.c | 86 - .../libffi.complex/complex_longdouble.c | 10 - .../libffi/testsuite/libffi.complex/ffitest.h | 1 - .../testsuite/libffi.complex/many_complex.inc | 78 - .../libffi.complex/many_complex_double.c | 10 - .../libffi.complex/many_complex_float.c | 10 - .../libffi.complex/many_complex_longdouble.c | 10 - .../libffi.complex/return_complex.inc | 37 - .../libffi.complex/return_complex1.inc | 41 - .../libffi.complex/return_complex1_double.c | 10 - .../libffi.complex/return_complex1_float.c | 10 - .../return_complex1_longdouble.c | 10 - .../libffi.complex/return_complex2.inc | 44 - .../libffi.complex/return_complex2_double.c | 10 - .../libffi.complex/return_complex2_float.c | 10 - .../return_complex2_longdouble.c | 10 - .../libffi.complex/return_complex_double.c | 10 - .../libffi.complex/return_complex_float.c | 10 - .../return_complex_longdouble.c | 10 - .../libffi/testsuite/libffi.go/aa-direct.c | 34 - .../libffi/testsuite/libffi.go/closure1.c | 28 - .../libffi/testsuite/libffi.go/ffitest.h | 1 - .../ffi_c/libffi/testsuite/libffi.go/go.exp | 36 - .../libffi/testsuite/libffi.go/static-chain.h | 19 - .../2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi.h | 57 - .../gems/ffi-1.9.25/ext/ffi_c/rbffi_endian.h | 59 - .../gems/ffi-1.9.25/ext/ffi_c/win32/stdbool.h | 8 - .../gems/ffi-1.9.25/ext/ffi_c/win32/stdint.h | 201 - .../ruby/2.3.0/gems/ffi-1.9.25/ffi.gemspec | 36 - .../ruby/2.3.0/gems/ffi-1.9.25/lib/ffi.rb | 20 - .../gems/ffi-1.9.25/lib/ffi/autopointer.rb | 203 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/buffer.rb | 4 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/callback.rb | 4 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/enum.rb | 296 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/errno.rb | 43 - .../ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/ffi.rb | 44 - .../ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/io.rb | 62 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/library.rb | 588 - .../gems/ffi-1.9.25/lib/ffi/managedstruct.rb | 84 - .../gems/ffi-1.9.25/lib/ffi/memorypointer.rb | 1 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/platform.rb | 164 - .../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 - .../lib/ffi/platform/mips64-linux/types.conf | 104 - .../ffi/platform/mips64el-linux/types.conf | 104 - .../lib/ffi/platform/mipsel-linux/types.conf | 102 - .../ffi/platform/mipsisa32r6-linux/types.conf | 102 - .../platform/mipsisa32r6el-linux/types.conf | 102 - .../ffi/platform/mipsisa64r6-linux/types.conf | 104 - .../platform/mipsisa64r6el-linux/types.conf | 104 - .../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 - .../lib/ffi/platform/sparc64-linux/types.conf | 102 - .../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 | 120 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/pointer.rb | 161 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/struct.rb | 371 - .../lib/ffi/struct_layout_builder.rb | 227 - .../lib/ffi/tools/const_generator.rb | 229 - .../ffi-1.9.25/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.25/lib/ffi/types.rb | 194 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/union.rb | 43 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/variadic.rb | 78 - .../2.3.0/gems/ffi-1.9.25/lib/ffi/version.rb | 3 - .../2.3.0/gems/ffi-1.9.25/samples/getlogin.rb | 8 - .../2.3.0/gems/ffi-1.9.25/samples/getpid.rb | 8 - .../gems/ffi-1.9.25/samples/gettimeofday.rb | 18 - .../2.3.0/gems/ffi-1.9.25/samples/hello.rb | 7 - .../2.3.0/gems/ffi-1.9.25/samples/inotify.rb | 60 - .../ruby/2.3.0/gems/ffi-1.9.25/samples/pty.rb | 76 - .../2.3.0/gems/ffi-1.9.25/samples/qsort.rb | 21 - .../gems/ffi-1.9.25/samples/sample_helper.rb | 6 - .../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 - .../ruby/2.3.0/gems/jekyll-3.6.3/.rubocop.yml | 163 - .../ruby/2.3.0/gems/jekyll-3.6.3/LICENSE | 21 - .../2.3.0/gems/jekyll-3.6.3/README.markdown | 61 - .../ruby/2.3.0/gems/jekyll-3.6.3/exe/jekyll | 57 - .../2.3.0/gems/jekyll-3.6.3/lib/jekyll.rb | 195 - .../gems/jekyll-3.6.3/lib/jekyll/cleaner.rb | 110 - .../jekyll-3.6.3/lib/jekyll/collection.rb | 230 - .../gems/jekyll-3.6.3/lib/jekyll/command.rb | 78 - .../jekyll-3.6.3/lib/jekyll/commands/build.rb | 102 - .../jekyll-3.6.3/lib/jekyll/commands/clean.rb | 43 - .../lib/jekyll/commands/doctor.rb | 153 - .../jekyll-3.6.3/lib/jekyll/commands/help.rb | 34 - .../jekyll-3.6.3/lib/jekyll/commands/new.rb | 156 - .../lib/jekyll/commands/new_theme.rb | 40 - .../jekyll-3.6.3/lib/jekyll/commands/serve.rb | 245 - .../lib/jekyll/commands/serve/servlet.rb | 62 - .../jekyll-3.6.3/lib/jekyll/configuration.rb | 410 - .../gems/jekyll-3.6.3/lib/jekyll/converter.rb | 54 - .../lib/jekyll/converters/identity.rb | 23 - .../lib/jekyll/converters/markdown.rb | 104 - .../converters/markdown/kramdown_parser.rb | 123 - .../converters/markdown/rdiscount_parser.rb | 35 - .../converters/markdown/redcarpet_parser.rb | 108 - .../lib/jekyll/converters/smartypants.rb | 36 - .../jekyll-3.6.3/lib/jekyll/convertible.rb | 251 - .../jekyll-3.6.3/lib/jekyll/deprecator.rb | 52 - .../gems/jekyll-3.6.3/lib/jekyll/document.rb | 507 - .../lib/jekyll/drops/collection_drop.rb | 22 - .../lib/jekyll/drops/document_drop.rb | 69 - .../jekyll-3.6.3/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.6.3/lib/jekyll/drops/url_drop.rb | 88 - .../jekyll-3.6.3/lib/jekyll/entry_filter.rb | 126 - .../gems/jekyll-3.6.3/lib/jekyll/errors.rb | 20 - .../gems/jekyll-3.6.3/lib/jekyll/excerpt.rb | 126 - .../gems/jekyll-3.6.3/lib/jekyll/external.rb | 74 - .../gems/jekyll-3.6.3/lib/jekyll/filters.rb | 430 - .../lib/jekyll/filters/grouping_filters.rb | 65 - .../lib/jekyll/filters/url_filters.rb | 60 - .../lib/jekyll/frontmatter_defaults.rb | 197 - .../gems/jekyll-3.6.3/lib/jekyll/generator.rb | 5 - .../gems/jekyll-3.6.3/lib/jekyll/hooks.rb | 104 - .../gems/jekyll-3.6.3/lib/jekyll/layout.rb | 62 - .../lib/jekyll/liquid_extensions.rb | 24 - .../lib/jekyll/liquid_renderer.rb | 49 - .../lib/jekyll/liquid_renderer/file.rb | 56 - .../lib/jekyll/liquid_renderer/table.rb | 96 - .../jekyll-3.6.3/lib/jekyll/log_adapter.rb | 147 - .../gems/jekyll-3.6.3/lib/jekyll/mime.types | 825 - .../gems/jekyll-3.6.3/lib/jekyll/page.rb | 187 - .../gems/jekyll-3.6.3/lib/jekyll/plugin.rb | 98 - .../jekyll-3.6.3/lib/jekyll/plugin_manager.rb | 113 - .../gems/jekyll-3.6.3/lib/jekyll/publisher.rb | 23 - .../gems/jekyll-3.6.3/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.6.3/lib/jekyll/regenerator.rb | 201 - .../jekyll-3.6.3/lib/jekyll/related_posts.rb | 52 - .../gems/jekyll-3.6.3/lib/jekyll/renderer.rb | 269 - .../gems/jekyll-3.6.3/lib/jekyll/site.rb | 472 - .../jekyll-3.6.3/lib/jekyll/static_file.rb | 162 - .../gems/jekyll-3.6.3/lib/jekyll/stevenson.rb | 61 - .../jekyll-3.6.3/lib/jekyll/tags/highlight.rb | 141 - .../jekyll-3.6.3/lib/jekyll/tags/include.rb | 215 - .../gems/jekyll-3.6.3/lib/jekyll/tags/link.rb | 37 - .../jekyll-3.6.3/lib/jekyll/tags/post_url.rb | 103 - .../gems/jekyll-3.6.3/lib/jekyll/theme.rb | 68 - .../jekyll-3.6.3/lib/jekyll/theme_builder.rb | 119 - .../2.3.0/gems/jekyll-3.6.3/lib/jekyll/url.rb | 161 - .../gems/jekyll-3.6.3/lib/jekyll/utils.rb | 340 - .../jekyll-3.6.3/lib/jekyll/utils/ansi.rb | 59 - .../jekyll-3.6.3/lib/jekyll/utils/exec.rb | 27 - .../lib/jekyll/utils/platforms.rb | 82 - .../jekyll-3.6.3/lib/jekyll/utils/rouge.rb | 21 - .../jekyll-3.6.3/lib/jekyll/utils/win_tz.rb | 75 - .../gems/jekyll-3.6.3/lib/jekyll/version.rb | 5 - .../jekyll-3.6.3/lib/site_template/.gitignore | 3 - .../jekyll-3.6.3/lib/site_template/404.html | 24 - .../lib/site_template/_config.yml | 43 - .../0000-00-00-welcome-to-jekyll.markdown.erb | 25 - .../jekyll-3.6.3/lib/site_template/about.md | 18 - .../jekyll-3.6.3/lib/site_template/index.md | 6 - .../lib/theme_template/CODE_OF_CONDUCT.md.erb | 74 - .../jekyll-3.6.3/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 - .../2.3.0/gems/jekyll-menus-0.6.0/Gemfile | 6 - .../jekyll-menus-0.6.0/lib/jekyll-menus.rb | 5 - .../jekyll-menus-0.6.0/lib/jekyll/menus.rb | 237 - .../lib/jekyll/menus/drops.rb | 13 - .../lib/jekyll/menus/drops/all.rb | 51 - .../lib/jekyll/menus/drops/item.rb | 71 - .../lib/jekyll/menus/drops/menu.rb | 50 - .../lib/jekyll/menus/hook.rb | 15 - .../lib/jekyll/menus/utils.rb | 24 - .../lib/jekyll/menus/version.rb | 9 - .../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-1.5.1/lib/jekyll-watch.rb | 5 - .../lib/jekyll-watch/version.rb | 7 - .../lib/jekyll/commands/watch.rb | 29 - .../jekyll-watch-1.5.1/lib/jekyll/watcher.rb | 118 - .../ruby/2.3.0/gems/kramdown-1.17.0/AUTHORS | 1 - .../2.3.0/gems/kramdown-1.17.0/CONTRIBUTERS | 65 - .../ruby/2.3.0/gems/kramdown-1.17.0/COPYING | 30 - .../ruby/2.3.0/gems/kramdown-1.17.0/README.md | 71 - .../ruby/2.3.0/gems/kramdown-1.17.0/Rakefile | 341 - .../ruby/2.3.0/gems/kramdown-1.17.0/VERSION | 1 - .../kramdown-1.17.0/benchmark/benchmark.rb | 43 - .../kramdown-1.17.0/benchmark/benchmark.sh | 74 - .../benchmark/generate_data.rb | 119 - .../kramdown-1.17.0/benchmark/mdbasics.text | 306 - .../kramdown-1.17.0/benchmark/mdsyntax.text | 888 -- .../gems/kramdown-1.17.0/benchmark/testing.sh | 12 - .../gems/kramdown-1.17.0/benchmark/timing.sh | 10 - .../2.3.0/gems/kramdown-1.17.0/bin/kramdown | 104 - .../data/kramdown/document.html | 22 - .../data/kramdown/document.latex | 50 - .../gems/kramdown-1.17.0/doc/_design.scss | 441 - .../2.3.0/gems/kramdown-1.17.0/doc/bg.png | Bin 56156 -> 0 bytes .../gems/kramdown-1.17.0/doc/default.scss | 217 - .../gems/kramdown-1.17.0/doc/default.template | 62 - .../kramdown-1.17.0/doc/documentation.page | 84 - .../doc/documentation.template | 36 - .../2.3.0/gems/kramdown-1.17.0/doc/index.page | 113 - .../kramdown-1.17.0/doc/installation.page | 88 - .../gems/kramdown-1.17.0/doc/links.markdown | 6 - .../2.3.0/gems/kramdown-1.17.0/doc/metainfo | 13 - .../2.3.0/gems/kramdown-1.17.0/doc/news.feed | 9 - .../2.3.0/gems/kramdown-1.17.0/doc/news.page | 29 - .../gems/kramdown-1.17.0/doc/options.page | 49 - .../gems/kramdown-1.17.0/doc/quickref.page | 603 - .../gems/kramdown-1.17.0/doc/sidebar.template | 22 - .../gems/kramdown-1.17.0/doc/sitemap.sitemap | 5 - .../gems/kramdown-1.17.0/doc/syntax.page | 1799 --- .../2.3.0/gems/kramdown-1.17.0/doc/tests.page | 104 - .../2.3.0/gems/kramdown-1.17.0/doc/virtual | 14 - .../gems/kramdown-1.17.0/lib/kramdown.rb | 10 - .../kramdown-1.17.0/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/katex.rb | 35 - .../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.17.0/lib/kramdown/document.rb | 141 - .../kramdown-1.17.0/lib/kramdown/element.rb | 522 - .../kramdown-1.17.0/lib/kramdown/error.rb | 17 - .../kramdown-1.17.0/lib/kramdown/options.rb | 681 - .../kramdown-1.17.0/lib/kramdown/parser.rb | 27 - .../lib/kramdown/parser/base.rb | 128 - .../lib/kramdown/parser/gfm.rb | 188 - .../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 | 69 - .../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 | 146 - .../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 | 170 - .../parser/kramdown/typographic_symbol.rb | 44 - .../lib/kramdown/parser/markdown.rb | 56 - .../kramdown-1.17.0/lib/kramdown/utils.rb | 46 - .../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.17.0/lib/kramdown/version.rb | 15 - .../gems/kramdown-1.17.0/man/man1/kramdown.1 | 420 - .../ruby/2.3.0/gems/kramdown-1.17.0/setup.rb | 1585 -- .../gems/kramdown-1.17.0/test/run_tests.rb | 46 - .../gems/kramdown-1.17.0/test/test_files.rb | 466 - .../kramdown-1.17.0/test/test_location.rb | 238 - .../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 - .../block/14_table/empty_tag_in_cell.html | 8 - .../block/14_table/empty_tag_in_cell.options | 1 - .../block/14_table/empty_tag_in_cell.text | 1 - .../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 - .../testcases/block/15_math/katex.html.19 | 2 - .../testcases/block/15_math/katex.options | 1 - .../test/testcases/block/15_math/katex.text | 2 - .../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 - .../test/testcases/span/math/katex.html.19 | 1 - .../test/testcases/span/math/katex.options | 1 - .../test/testcases/span/math/katex.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.1/History.md | 235 - .../ruby/2.3.0/gems/liquid-4.0.1/LICENSE | 20 - .../ruby/2.3.0/gems/liquid-4.0.1/README.md | 108 - .../2.3.0/gems/liquid-4.0.1/lib/liquid.rb | 79 - .../gems/liquid-4.0.1/lib/liquid/block.rb | 77 - .../liquid-4.0.1/lib/liquid/block_body.rb | 142 - .../gems/liquid-4.0.1/lib/liquid/condition.rb | 142 - .../gems/liquid-4.0.1/lib/liquid/context.rb | 226 - .../gems/liquid-4.0.1/lib/liquid/document.rb | 27 - .../gems/liquid-4.0.1/lib/liquid/drop.rb | 78 - .../gems/liquid-4.0.1/lib/liquid/errors.rb | 56 - .../liquid-4.0.1/lib/liquid/expression.rb | 49 - .../liquid-4.0.1/lib/liquid/extensions.rb | 74 - .../liquid-4.0.1/lib/liquid/file_system.rb | 73 - .../liquid-4.0.1/lib/liquid/forloop_drop.rb | 42 - .../gems/liquid-4.0.1/lib/liquid/i18n.rb | 39 - .../liquid-4.0.1/lib/liquid/interrupts.rb | 16 - .../gems/liquid-4.0.1/lib/liquid/lexer.rb | 55 - .../liquid-4.0.1/lib/liquid/locales/en.yml | 26 - .../liquid-4.0.1/lib/liquid/parse_context.rb | 38 - .../gems/liquid-4.0.1/lib/liquid/parser.rb | 90 - .../lib/liquid/parser_switching.rb | 31 - .../gems/liquid-4.0.1/lib/liquid/profiler.rb | 158 - .../liquid-4.0.1/lib/liquid/profiler/hooks.rb | 23 - .../liquid-4.0.1/lib/liquid/range_lookup.rb | 37 - .../lib/liquid/resource_limits.rb | 23 - .../lib/liquid/standardfilters.rb | 456 - .../gems/liquid-4.0.1/lib/liquid/strainer.rb | 66 - .../lib/liquid/tablerowloop_drop.rb | 62 - .../2.3.0/gems/liquid-4.0.1/lib/liquid/tag.rb | 43 - .../liquid-4.0.1/lib/liquid/tags/assign.rb | 51 - .../liquid-4.0.1/lib/liquid/tags/break.rb | 18 - .../liquid-4.0.1/lib/liquid/tags/capture.rb | 38 - .../gems/liquid-4.0.1/lib/liquid/tags/case.rb | 86 - .../liquid-4.0.1/lib/liquid/tags/comment.rb | 16 - .../liquid-4.0.1/lib/liquid/tags/continue.rb | 18 - .../liquid-4.0.1/lib/liquid/tags/cycle.rb | 57 - .../liquid-4.0.1/lib/liquid/tags/decrement.rb | 35 - .../gems/liquid-4.0.1/lib/liquid/tags/for.rb | 198 - .../gems/liquid-4.0.1/lib/liquid/tags/if.rb | 114 - .../liquid-4.0.1/lib/liquid/tags/ifchanged.rb | 18 - .../liquid-4.0.1/lib/liquid/tags/include.rb | 113 - .../liquid-4.0.1/lib/liquid/tags/increment.rb | 31 - .../gems/liquid-4.0.1/lib/liquid/tags/raw.rb | 47 - .../liquid-4.0.1/lib/liquid/tags/table_row.rb | 54 - .../liquid-4.0.1/lib/liquid/tags/unless.rb | 30 - .../gems/liquid-4.0.1/lib/liquid/template.rb | 254 - .../gems/liquid-4.0.1/lib/liquid/tokenizer.rb | 31 - .../gems/liquid-4.0.1/lib/liquid/utils.rb | 83 - .../gems/liquid-4.0.1/lib/liquid/variable.rb | 142 - .../lib/liquid/variable_lookup.rb | 82 - .../gems/liquid-4.0.1/lib/liquid/version.rb | 4 - .../liquid-4.0.1/test/fixtures/en_locale.yml | 9 - .../test/integration/assign_test.rb | 48 - .../test/integration/blank_test.rb | 106 - .../test/integration/block_test.rb | 12 - .../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 | 122 - .../test/integration/render_profiling_test.rb | 154 - .../test/integration/security_test.rb | 80 - .../test/integration/standard_filter_test.rb | 626 - .../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 | 245 - .../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 | 332 - .../test/integration/trim_mode_test.rb | 529 - .../test/integration/variable_test.rb | 96 - .../gems/liquid-4.0.1/test/test_helper.rb | 116 - .../liquid-4.0.1/test/unit/block_unit_test.rb | 58 - .../test/unit/condition_unit_test.rb | 166 - .../test/unit/context_unit_test.rb | 489 - .../test/unit/file_system_unit_test.rb | 35 - .../liquid-4.0.1/test/unit/i18n_unit_test.rb | 37 - .../liquid-4.0.1/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 | 164 - .../liquid-4.0.1/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/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.3/.gitignore | 11 - .../gems/public_suffix-3.0.3/.rubocop.yml | 36 - .../public_suffix-3.0.3/.rubocop_defaults.yml | 184 - .../gems/public_suffix-3.0.3/.ruby-gemset | 1 - .../gems/public_suffix-3.0.3/.travis.yml | 25 - .../2.3.0/gems/public_suffix-3.0.3/.yardopts | 1 - .../gems/public_suffix-3.0.3/2.0-Upgrade.md | 52 - .../gems/public_suffix-3.0.3/CHANGELOG.md | 340 - .../2.3.0/gems/public_suffix-3.0.3/Gemfile | 10 - .../gems/public_suffix-3.0.3/LICENSE.txt | 22 - .../2.3.0/gems/public_suffix-3.0.3/README.md | 202 - .../2.3.0/gems/public_suffix-3.0.3/Rakefile | 49 - .../gems/public_suffix-3.0.3/bin/console | 14 - .../gems/public_suffix-3.0.3/data/list.txt | 12659 ---------------- .../public_suffix-3.0.3/lib/public_suffix.rb | 175 - .../lib/public_suffix/domain.rb | 233 - .../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.3/public_suffix.gemspec | 25 - .../gems/public_suffix-3.0.3/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.3/test/psl_test.rb | 49 - .../public_suffix-3.0.3/test/test_helper.rb | 13 - .../gems/public_suffix-3.0.3/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.3/.gitignore | 13 - .../ruby/2.3.0/gems/rb-fsevent-0.10.3/Gemfile | 3 - .../2.3.0/gems/rb-fsevent-0.10.3/Guardfile | 8 - .../2.3.0/gems/rb-fsevent-0.10.3/LICENSE.txt | 22 - .../2.3.0/gems/rb-fsevent-0.10.3/README.md | 260 - .../2.3.0/gems/rb-fsevent-0.10.3/Rakefile | 33 - .../gems/rb-fsevent-0.10.3/bin/fsevent_watch | Bin 42376 -> 0 bytes .../2.3.0/gems/rb-fsevent-0.10.3/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.3/ext/fsevent_watch/cli.c | 201 - .../rb-fsevent-0.10.3/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.3/ext/rakefile.rb | 226 - .../gems/rb-fsevent-0.10.3/lib/otnetstring.rb | 85 - .../gems/rb-fsevent-0.10.3/lib/rb-fsevent.rb | 3 - .../lib/rb-fsevent/fsevent.rb | 157 - .../lib/rb-fsevent/version.rb | 5 - .../gems/rb-fsevent-0.10.3/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-2.2.1/Gemfile | 26 - .../ruby/2.3.0/gems/rouge-2.2.1/LICENSE | 186 - .../ruby/2.3.0/gems/rouge-2.2.1/bin/rougify | 17 - .../ruby/2.3.0/gems/rouge-2.2.1/lib/rouge.rb | 80 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/cli.rb | 395 - .../gems/rouge-2.2.1/lib/rouge/demos/abap | 6 - .../rouge-2.2.1/lib/rouge/demos/actionscript | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/apache | 21 - .../rouge-2.2.1/lib/rouge/demos/apiblueprint | 33 - .../rouge-2.2.1/lib/rouge/demos/applescript | 2 - .../gems/rouge-2.2.1/lib/rouge/demos/awk | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/biml | 38 - .../gems/rouge-2.2.1/lib/rouge/demos/bsl | 7 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/demos/c | 8 - .../gems/rouge-2.2.1/lib/rouge/demos/ceylon | 7 - .../gems/rouge-2.2.1/lib/rouge/demos/cfscript | 18 - .../gems/rouge-2.2.1/lib/rouge/demos/clojure | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/cmake | 7 - .../rouge-2.2.1/lib/rouge/demos/coffeescript | 5 - .../rouge-2.2.1/lib/rouge/demos/common_lisp | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/conf | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/console | 6 - .../gems/rouge-2.2.1/lib/rouge/demos/coq | 13 - .../gems/rouge-2.2.1/lib/rouge/demos/cpp | 8 - .../gems/rouge-2.2.1/lib/rouge/demos/csharp | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/css | 4 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/demos/d | 16 - .../gems/rouge-2.2.1/lib/rouge/demos/dart | 6 - .../gems/rouge-2.2.1/lib/rouge/demos/diff | 7 - .../gems/rouge-2.2.1/lib/rouge/demos/digdag | 19 - .../gems/rouge-2.2.1/lib/rouge/demos/docker | 9 - .../gems/rouge-2.2.1/lib/rouge/demos/dot | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/eiffel | 30 - .../gems/rouge-2.2.1/lib/rouge/demos/elixir | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/erb | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/erlang | 7 - .../gems/rouge-2.2.1/lib/rouge/demos/factor | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/fortran | 22 - .../gems/rouge-2.2.1/lib/rouge/demos/fsharp | 12 - .../gems/rouge-2.2.1/lib/rouge/demos/gherkin | 17 - .../gems/rouge-2.2.1/lib/rouge/demos/glsl | 14 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/demos/go | 7 - .../gems/rouge-2.2.1/lib/rouge/demos/gradle | 10 - .../gems/rouge-2.2.1/lib/rouge/demos/graphql | 17 - .../gems/rouge-2.2.1/lib/rouge/demos/groovy | 9 - .../gems/rouge-2.2.1/lib/rouge/demos/haml | 5 - .../rouge-2.2.1/lib/rouge/demos/handlebars | 7 - .../gems/rouge-2.2.1/lib/rouge/demos/haskell | 6 - .../gems/rouge-2.2.1/lib/rouge/demos/html | 8 - .../gems/rouge-2.2.1/lib/rouge/demos/http | 14 - .../gems/rouge-2.2.1/lib/rouge/demos/hylang | 10 - .../gems/rouge-2.2.1/lib/rouge/demos/idlang | 8 - .../gems/rouge-2.2.1/lib/rouge/demos/igorpro | 9 - .../gems/rouge-2.2.1/lib/rouge/demos/ini | 4 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/demos/io | 11 - .../gems/rouge-2.2.1/lib/rouge/demos/irb | 4 - .../rouge-2.2.1/lib/rouge/demos/irb_output | 2 - .../gems/rouge-2.2.1/lib/rouge/demos/java | 5 - .../rouge-2.2.1/lib/rouge/demos/javascript | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/jinja | 9 - .../gems/rouge-2.2.1/lib/rouge/demos/json | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/json-doc | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/jsonnet | 28 - .../gems/rouge-2.2.1/lib/rouge/demos/jsx | 17 - .../gems/rouge-2.2.1/lib/rouge/demos/julia | 11 - .../gems/rouge-2.2.1/lib/rouge/demos/kotlin | 3 - .../gems/rouge-2.2.1/lib/rouge/demos/lasso | 12 - .../gems/rouge-2.2.1/lib/rouge/demos/liquid | 11 - .../lib/rouge/demos/literate_coffeescript | 3 - .../lib/rouge/demos/literate_haskell | 7 - .../gems/rouge-2.2.1/lib/rouge/demos/llvm | 20 - .../gems/rouge-2.2.1/lib/rouge/demos/lua | 12 - .../gems/rouge-2.2.1/lib/rouge/demos/make | 6 - .../gems/rouge-2.2.1/lib/rouge/demos/markdown | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/matlab | 6 - .../rouge-2.2.1/lib/rouge/demos/moonscript | 16 - .../gems/rouge-2.2.1/lib/rouge/demos/mosel | 10 - .../gems/rouge-2.2.1/lib/rouge/demos/mxml | 22 - .../gems/rouge-2.2.1/lib/rouge/demos/nasm | 26 - .../gems/rouge-2.2.1/lib/rouge/demos/nginx | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/nim | 27 - .../gems/rouge-2.2.1/lib/rouge/demos/nix | 19 - .../rouge-2.2.1/lib/rouge/demos/objective_c | 18 - .../gems/rouge-2.2.1/lib/rouge/demos/ocaml | 12 - .../gems/rouge-2.2.1/lib/rouge/demos/pascal | 14 - .../gems/rouge-2.2.1/lib/rouge/demos/perl | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/php | 3 - .../rouge-2.2.1/lib/rouge/demos/plaintext | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/plist | 142 - .../gems/rouge-2.2.1/lib/rouge/demos/pony | 17 - .../rouge-2.2.1/lib/rouge/demos/powershell | 49 - .../gems/rouge-2.2.1/lib/rouge/demos/praat | 26 - .../gems/rouge-2.2.1/lib/rouge/demos/prolog | 9 - .../rouge-2.2.1/lib/rouge/demos/prometheus | 9 - .../rouge-2.2.1/lib/rouge/demos/properties | 7 - .../gems/rouge-2.2.1/lib/rouge/demos/protobuf | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/puppet | 6 - .../gems/rouge-2.2.1/lib/rouge/demos/python | 6 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/demos/q | 2 - .../gems/rouge-2.2.1/lib/rouge/demos/qml | 9 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/demos/r | 8 - .../gems/rouge-2.2.1/lib/rouge/demos/racket | 24 - .../gems/rouge-2.2.1/lib/rouge/demos/ruby | 9 - .../gems/rouge-2.2.1/lib/rouge/demos/rust | 12 - .../gems/rouge-2.2.1/lib/rouge/demos/sass | 3 - .../gems/rouge-2.2.1/lib/rouge/demos/scala | 3 - .../gems/rouge-2.2.1/lib/rouge/demos/scheme | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/scss | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/sed | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/shell | 2 - .../gems/rouge-2.2.1/lib/rouge/demos/sieve | 10 - .../gems/rouge-2.2.1/lib/rouge/demos/slim | 17 - .../rouge-2.2.1/lib/rouge/demos/smalltalk | 6 - .../gems/rouge-2.2.1/lib/rouge/demos/smarty | 12 - .../gems/rouge-2.2.1/lib/rouge/demos/sml | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/sql | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/swift | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/tap | 5 - .../gems/rouge-2.2.1/lib/rouge/demos/tcl | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/tex | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/toml | 9 - .../gems/rouge-2.2.1/lib/rouge/demos/tsx | 17 - .../gems/rouge-2.2.1/lib/rouge/demos/tulip | 13 - .../gems/rouge-2.2.1/lib/rouge/demos/turtle | 26 - .../gems/rouge-2.2.1/lib/rouge/demos/twig | 9 - .../rouge-2.2.1/lib/rouge/demos/typescript | 1 - .../gems/rouge-2.2.1/lib/rouge/demos/vala | 8 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/demos/vb | 4 - .../gems/rouge-2.2.1/lib/rouge/demos/verilog | 27 - .../gems/rouge-2.2.1/lib/rouge/demos/vhdl | 23 - .../gems/rouge-2.2.1/lib/rouge/demos/viml | 14 - .../gems/rouge-2.2.1/lib/rouge/demos/vue | 11 - .../gems/rouge-2.2.1/lib/rouge/demos/wollok | 11 - .../gems/rouge-2.2.1/lib/rouge/demos/xml | 2 - .../gems/rouge-2.2.1/lib/rouge/demos/yaml | 4 - .../gems/rouge-2.2.1/lib/rouge/formatter.rb | 75 - .../rouge-2.2.1/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-2.2.1/lib/rouge/formatters/null.rb | 19 - .../lib/rouge/formatters/terminal256.rb | 180 - .../gems/rouge-2.2.1/lib/rouge/guesser.rb | 55 - .../lib/rouge/guessers/filename.rb | 25 - .../lib/rouge/guessers/glob_mapping.rb | 46 - .../lib/rouge/guessers/mimetype.rb | 14 - .../lib/rouge/guessers/modeline.rb | 43 - .../rouge-2.2.1/lib/rouge/guessers/source.rb | 39 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/lexer.rb | 452 - .../gems/rouge-2.2.1/lib/rouge/lexers/abap.rb | 238 - .../lib/rouge/lexers/actionscript.rb | 195 - .../rouge-2.2.1/lib/rouge/lexers/apache.rb | 71 - .../lib/rouge/lexers/apache/keywords.yml | 764 - .../lib/rouge/lexers/apiblueprint.rb | 51 - .../lib/rouge/lexers/apple_script.rb | 367 - .../gems/rouge-2.2.1/lib/rouge/lexers/awk.rb | 161 - .../gems/rouge-2.2.1/lib/rouge/lexers/biml.rb | 41 - .../gems/rouge-2.2.1/lib/rouge/lexers/bsl.rb | 81 - .../gems/rouge-2.2.1/lib/rouge/lexers/c.rb | 217 - .../rouge-2.2.1/lib/rouge/lexers/ceylon.rb | 123 - .../rouge-2.2.1/lib/rouge/lexers/cfscript.rb | 153 - .../rouge-2.2.1/lib/rouge/lexers/clojure.rb | 112 - .../rouge-2.2.1/lib/rouge/lexers/cmake.rb | 206 - .../lib/rouge/lexers/coffeescript.rb | 174 - .../lib/rouge/lexers/common_lisp.rb | 345 - .../gems/rouge-2.2.1/lib/rouge/lexers/conf.rb | 24 - .../rouge-2.2.1/lib/rouge/lexers/console.rb | 136 - .../gems/rouge-2.2.1/lib/rouge/lexers/coq.rb | 191 - .../gems/rouge-2.2.1/lib/rouge/lexers/cpp.rb | 78 - .../rouge-2.2.1/lib/rouge/lexers/csharp.rb | 114 - .../gems/rouge-2.2.1/lib/rouge/lexers/css.rb | 273 - .../gems/rouge-2.2.1/lib/rouge/lexers/d.rb | 176 - .../gems/rouge-2.2.1/lib/rouge/lexers/dart.rb | 104 - .../gems/rouge-2.2.1/lib/rouge/lexers/diff.rb | 31 - .../rouge-2.2.1/lib/rouge/lexers/digdag.rb | 72 - .../rouge-2.2.1/lib/rouge/lexers/docker.rb | 50 - .../gems/rouge-2.2.1/lib/rouge/lexers/dot.rb | 68 - .../rouge-2.2.1/lib/rouge/lexers/eiffel.rb | 65 - .../rouge-2.2.1/lib/rouge/lexers/elixir.rb | 133 - .../gems/rouge-2.2.1/lib/rouge/lexers/erb.rb | 56 - .../rouge-2.2.1/lib/rouge/lexers/erlang.rb | 118 - .../rouge-2.2.1/lib/rouge/lexers/factor.rb | 302 - .../rouge-2.2.1/lib/rouge/lexers/fortran.rb | 176 - .../rouge-2.2.1/lib/rouge/lexers/fsharp.rb | 118 - .../rouge-2.2.1/lib/rouge/lexers/gherkin.rb | 137 - .../lib/rouge/lexers/gherkin/keywords.rb | 14 - .../gems/rouge-2.2.1/lib/rouge/lexers/glsl.rb | 135 - .../gems/rouge-2.2.1/lib/rouge/lexers/go.rb | 178 - .../rouge-2.2.1/lib/rouge/lexers/gradle.rb | 37 - .../rouge-2.2.1/lib/rouge/lexers/graphql.rb | 243 - .../rouge-2.2.1/lib/rouge/lexers/groovy.rb | 112 - .../gems/rouge-2.2.1/lib/rouge/lexers/haml.rb | 233 - .../lib/rouge/lexers/handlebars.rb | 79 - .../rouge-2.2.1/lib/rouge/lexers/haskell.rb | 183 - .../gems/rouge-2.2.1/lib/rouge/lexers/html.rb | 138 - .../gems/rouge-2.2.1/lib/rouge/lexers/http.rb | 80 - .../rouge-2.2.1/lib/rouge/lexers/hylang.rb | 93 - .../rouge-2.2.1/lib/rouge/lexers/idlang.rb | 316 - .../rouge-2.2.1/lib/rouge/lexers/igorpro.rb | 408 - .../gems/rouge-2.2.1/lib/rouge/lexers/ini.rb | 57 - .../gems/rouge-2.2.1/lib/rouge/lexers/io.rb | 68 - .../gems/rouge-2.2.1/lib/rouge/lexers/irb.rb | 66 - .../gems/rouge-2.2.1/lib/rouge/lexers/java.rb | 87 - .../lib/rouge/lexers/javascript.rb | 281 - .../rouge-2.2.1/lib/rouge/lexers/jinja.rb | 137 - .../gems/rouge-2.2.1/lib/rouge/lexers/json.rb | 29 - .../rouge-2.2.1/lib/rouge/lexers/json_doc.rb | 23 - .../rouge-2.2.1/lib/rouge/lexers/jsonnet.rb | 151 - .../gems/rouge-2.2.1/lib/rouge/lexers/jsx.rb | 102 - .../rouge-2.2.1/lib/rouge/lexers/julia.rb | 172 - .../rouge-2.2.1/lib/rouge/lexers/kotlin.rb | 84 - .../rouge-2.2.1/lib/rouge/lexers/lasso.rb | 217 - .../lib/rouge/lexers/lasso/keywords.yml | 446 - .../rouge-2.2.1/lib/rouge/lexers/liquid.rb | 287 - .../lib/rouge/lexers/literate_coffeescript.rb | 33 - .../lib/rouge/lexers/literate_haskell.rb | 36 - .../gems/rouge-2.2.1/lib/rouge/lexers/llvm.rb | 84 - .../gems/rouge-2.2.1/lib/rouge/lexers/lua.rb | 125 - .../lib/rouge/lexers/lua/builtins.rb | 22 - .../gems/rouge-2.2.1/lib/rouge/lexers/make.rb | 116 - .../rouge-2.2.1/lib/rouge/lexers/markdown.rb | 154 - .../rouge-2.2.1/lib/rouge/lexers/matlab.rb | 75 - .../lib/rouge/lexers/matlab/builtins.rb | 11 - .../lib/rouge/lexers/moonscript.rb | 114 - .../rouge-2.2.1/lib/rouge/lexers/mosel.rb | 231 - .../gems/rouge-2.2.1/lib/rouge/lexers/mxml.rb | 68 - .../gems/rouge-2.2.1/lib/rouge/lexers/nasm.rb | 203 - .../rouge-2.2.1/lib/rouge/lexers/nginx.rb | 71 - .../gems/rouge-2.2.1/lib/rouge/lexers/nim.rb | 152 - .../gems/rouge-2.2.1/lib/rouge/lexers/nix.rb | 205 - .../lib/rouge/lexers/objective_c.rb | 208 - .../rouge-2.2.1/lib/rouge/lexers/ocaml.rb | 100 - .../rouge-2.2.1/lib/rouge/lexers/pascal.rb | 66 - .../gems/rouge-2.2.1/lib/rouge/lexers/perl.rb | 197 - .../gems/rouge-2.2.1/lib/rouge/lexers/php.rb | 193 - .../lib/rouge/lexers/php/builtins.rb | 194 - .../lib/rouge/lexers/plain_text.rb | 26 - .../rouge-2.2.1/lib/rouge/lexers/plist.rb | 49 - .../gems/rouge-2.2.1/lib/rouge/lexers/pony.rb | 93 - .../lib/rouge/lexers/powershell.rb | 678 - .../rouge-2.2.1/lib/rouge/lexers/praat.rb | 350 - .../rouge-2.2.1/lib/rouge/lexers/prolog.rb | 64 - .../lib/rouge/lexers/prometheus.rb | 121 - .../lib/rouge/lexers/properties.rb | 55 - .../rouge-2.2.1/lib/rouge/lexers/protobuf.rb | 70 - .../rouge-2.2.1/lib/rouge/lexers/puppet.rb | 128 - .../rouge-2.2.1/lib/rouge/lexers/python.rb | 231 - .../gems/rouge-2.2.1/lib/rouge/lexers/q.rb | 127 - .../gems/rouge-2.2.1/lib/rouge/lexers/qml.rb | 73 - .../gems/rouge-2.2.1/lib/rouge/lexers/r.rb | 89 - .../rouge-2.2.1/lib/rouge/lexers/racket.rb | 542 - .../gems/rouge-2.2.1/lib/rouge/lexers/ruby.rb | 437 - .../gems/rouge-2.2.1/lib/rouge/lexers/rust.rb | 192 - .../gems/rouge-2.2.1/lib/rouge/lexers/sass.rb | 74 - .../lib/rouge/lexers/sass/common.rb | 180 - .../rouge-2.2.1/lib/rouge/lexers/scala.rb | 142 - .../rouge-2.2.1/lib/rouge/lexers/scheme.rb | 112 - .../gems/rouge-2.2.1/lib/rouge/lexers/scss.rb | 34 - .../gems/rouge-2.2.1/lib/rouge/lexers/sed.rb | 172 - .../rouge-2.2.1/lib/rouge/lexers/shell.rb | 180 - .../rouge-2.2.1/lib/rouge/lexers/sieve.rb | 96 - .../gems/rouge-2.2.1/lib/rouge/lexers/slim.rb | 228 - .../rouge-2.2.1/lib/rouge/lexers/smalltalk.rb | 116 - .../rouge-2.2.1/lib/rouge/lexers/smarty.rb | 91 - .../gems/rouge-2.2.1/lib/rouge/lexers/sml.rb | 348 - .../gems/rouge-2.2.1/lib/rouge/lexers/sql.rb | 140 - .../rouge-2.2.1/lib/rouge/lexers/swift.rb | 161 - .../gems/rouge-2.2.1/lib/rouge/lexers/tap.rb | 91 - .../gems/rouge-2.2.1/lib/rouge/lexers/tcl.rb | 192 - .../gems/rouge-2.2.1/lib/rouge/lexers/tex.rb | 69 - .../gems/rouge-2.2.1/lib/rouge/lexers/toml.rb | 71 - .../gems/rouge-2.2.1/lib/rouge/lexers/tsx.rb | 19 - .../rouge-2.2.1/lib/rouge/lexers/tulip.rb | 107 - .../rouge-2.2.1/lib/rouge/lexers/turtle.rb | 72 - .../gems/rouge-2.2.1/lib/rouge/lexers/twig.rb | 39 - .../lib/rouge/lexers/typescript.rb | 22 - .../lib/rouge/lexers/typescript/common.rb | 33 - .../gems/rouge-2.2.1/lib/rouge/lexers/vala.rb | 77 - .../gems/rouge-2.2.1/lib/rouge/lexers/vb.rb | 164 - .../rouge-2.2.1/lib/rouge/lexers/verilog.rb | 164 - .../gems/rouge-2.2.1/lib/rouge/lexers/vhdl.rb | 97 - .../gems/rouge-2.2.1/lib/rouge/lexers/viml.rb | 101 - .../lib/rouge/lexers/viml/keywords.rb | 12 - .../gems/rouge-2.2.1/lib/rouge/lexers/vue.rb | 124 - .../rouge-2.2.1/lib/rouge/lexers/wollok.rb | 107 - .../gems/rouge-2.2.1/lib/rouge/lexers/xml.rb | 59 - .../gems/rouge-2.2.1/lib/rouge/lexers/yaml.rb | 373 - .../lib/rouge/plugins/redcarpet.rb | 30 - .../gems/rouge-2.2.1/lib/rouge/regex_lexer.rb | 441 - .../rouge-2.2.1/lib/rouge/template_lexer.rb | 20 - .../rouge-2.2.1/lib/rouge/text_analyzer.rb | 49 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/theme.rb | 213 - .../rouge-2.2.1/lib/rouge/themes/base16.rb | 130 - .../rouge-2.2.1/lib/rouge/themes/colorful.rb | 67 - .../rouge-2.2.1/lib/rouge/themes/github.rb | 71 - .../rouge-2.2.1/lib/rouge/themes/gruvbox.rb | 167 - .../rouge-2.2.1/lib/rouge/themes/igor_pro.rb | 20 - .../rouge-2.2.1/lib/rouge/themes/molokai.rb | 82 - .../rouge-2.2.1/lib/rouge/themes/monokai.rb | 92 - .../lib/rouge/themes/monokai_sublime.rb | 90 - .../rouge-2.2.1/lib/rouge/themes/pastie.rb | 69 - .../lib/rouge/themes/thankful_eyes.rb | 74 - .../rouge-2.2.1/lib/rouge/themes/tulip.rb | 69 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/token.rb | 182 - .../2.3.0/gems/rouge-2.2.1/lib/rouge/util.rb | 101 - .../gems/rouge-2.2.1/lib/rouge/version.rb | 7 - .../ruby/2.3.0/gems/rouge-2.2.1/rouge.gemspec | 18 - .../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.6.0/.yardopts | 13 - .../2.3.0/gems/sass-3.6.0/CODE_OF_CONDUCT.md | 10 - .../2.3.0/gems/sass-3.6.0/CONTRIBUTING.md | 148 - .../ruby/2.3.0/gems/sass-3.6.0/MIT-LICENSE | 20 - .../ruby/2.3.0/gems/sass-3.6.0/README.md | 227 - .../ruby/2.3.0/gems/sass-3.6.0/REVISION | 1 - .../ruby/2.3.0/gems/sass-3.6.0/Rakefile | 364 - .../bundle/ruby/2.3.0/gems/sass-3.6.0/VERSION | 1 - .../ruby/2.3.0/gems/sass-3.6.0/VERSION_DATE | 1 - .../ruby/2.3.0/gems/sass-3.6.0/VERSION_NAME | 1 - .../ruby/2.3.0/gems/sass-3.6.0/bin/sass | 13 - .../2.3.0/gems/sass-3.6.0/bin/sass-convert | 12 - .../ruby/2.3.0/gems/sass-3.6.0/bin/scss | 13 - .../gems/sass-3.6.0/extra/sass-spec-ref.sh | 40 - .../gems/sass-3.6.0/extra/update_watch.rb | 13 - .../bundle/ruby/2.3.0/gems/sass-3.6.0/init.rb | 18 - .../ruby/2.3.0/gems/sass-3.6.0/lib/sass.rb | 102 - .../gems/sass-3.6.0/lib/sass/cache_stores.rb | 15 - .../sass-3.6.0/lib/sass/cache_stores/base.rb | 88 - .../sass-3.6.0/lib/sass/cache_stores/chain.rb | 34 - .../lib/sass/cache_stores/filesystem.rb | 60 - .../lib/sass/cache_stores/memory.rb | 46 - .../sass-3.6.0/lib/sass/cache_stores/null.rb | 25 - .../gems/sass-3.6.0/lib/sass/callbacks.rb | 67 - .../2.3.0/gems/sass-3.6.0/lib/sass/css.rb | 407 - .../gems/sass-3.6.0/lib/sass/deprecation.rb | 55 - .../2.3.0/gems/sass-3.6.0/lib/sass/engine.rb | 1236 -- .../gems/sass-3.6.0/lib/sass/environment.rb | 236 - .../2.3.0/gems/sass-3.6.0/lib/sass/error.rb | 198 - .../2.3.0/gems/sass-3.6.0/lib/sass/exec.rb | 9 - .../gems/sass-3.6.0/lib/sass/exec/base.rb | 188 - .../sass-3.6.0/lib/sass/exec/sass_convert.rb | 283 - .../sass-3.6.0/lib/sass/exec/sass_scss.rb | 436 - .../gems/sass-3.6.0/lib/sass/features.rb | 48 - .../gems/sass-3.6.0/lib/sass/importers.rb | 23 - .../sass-3.6.0/lib/sass/importers/base.rb | 182 - .../lib/sass/importers/deprecated_path.rb | 51 - .../lib/sass/importers/filesystem.rb | 221 - .../2.3.0/gems/sass-3.6.0/lib/sass/logger.rb | 17 - .../gems/sass-3.6.0/lib/sass/logger/base.rb | 47 - .../sass-3.6.0/lib/sass/logger/delayed.rb | 50 - .../sass-3.6.0/lib/sass/logger/log_level.rb | 45 - .../2.3.0/gems/sass-3.6.0/lib/sass/media.rb | 210 - .../2.3.0/gems/sass-3.6.0/lib/sass/plugin.rb | 134 - .../sass-3.6.0/lib/sass/plugin/compiler.rb | 552 - .../lib/sass/plugin/configuration.rb | 134 - .../sass-3.6.0/lib/sass/plugin/generic.rb | 15 - .../gems/sass-3.6.0/lib/sass/plugin/merb.rb | 48 - .../gems/sass-3.6.0/lib/sass/plugin/rack.rb | 60 - .../gems/sass-3.6.0/lib/sass/plugin/rails.rb | 47 - .../lib/sass/plugin/staleness_checker.rb | 199 - .../2.3.0/gems/sass-3.6.0/lib/sass/railtie.rb | 10 - .../2.3.0/gems/sass-3.6.0/lib/sass/repl.rb | 57 - .../2.3.0/gems/sass-3.6.0/lib/sass/root.rb | 7 - .../2.3.0/gems/sass-3.6.0/lib/sass/script.rb | 66 - .../sass-3.6.0/lib/sass/script/css_lexer.rb | 33 - .../sass-3.6.0/lib/sass/script/css_parser.rb | 33 - .../sass-3.6.0/lib/sass/script/functions.rb | 2930 ---- .../gems/sass-3.6.0/lib/sass/script/lexer.rb | 480 - .../gems/sass-3.6.0/lib/sass/script/parser.rb | 835 - .../gems/sass-3.6.0/lib/sass/script/tree.rb | 16 - .../lib/sass/script/tree/funcall.rb | 314 - .../lib/sass/script/tree/interpolation.rb | 220 - .../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.6.0/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.6.0/lib/sass/script/value.rb | 13 - .../lib/sass/script/value/arg_list.rb | 36 - .../sass-3.6.0/lib/sass/script/value/base.rb | 258 - .../sass-3.6.0/lib/sass/script/value/bool.rb | 35 - .../lib/sass/script/value/callable.rb | 25 - .../sass-3.6.0/lib/sass/script/value/color.rb | 704 - .../lib/sass/script/value/function.rb | 19 - .../lib/sass/script/value/helpers.rb | 298 - .../sass-3.6.0/lib/sass/script/value/list.rb | 134 - .../sass-3.6.0/lib/sass/script/value/map.rb | 70 - .../sass-3.6.0/lib/sass/script/value/null.rb | 44 - .../lib/sass/script/value/number.rb | 564 - .../lib/sass/script/value/string.rb | 138 - .../2.3.0/gems/sass-3.6.0/lib/sass/scss.rb | 14 - .../sass-3.6.0/lib/sass/scss/css_parser.rb | 56 - .../gems/sass-3.6.0/lib/sass/scss/parser.rb | 1313 -- .../2.3.0/gems/sass-3.6.0/lib/sass/scss/rx.rb | 134 - .../sass-3.6.0/lib/sass/scss/static_parser.rb | 351 - .../gems/sass-3.6.0/lib/sass/selector.rb | 327 - .../lib/sass/selector/abstract_sequence.rb | 112 - .../lib/sass/selector/comma_sequence.rb | 195 - .../sass-3.6.0/lib/sass/selector/pseudo.rb | 283 - .../sass-3.6.0/lib/sass/selector/sequence.rb | 661 - .../sass-3.6.0/lib/sass/selector/simple.rb | 124 - .../lib/sass/selector/simple_sequence.rb | 348 - .../2.3.0/gems/sass-3.6.0/lib/sass/shared.rb | 76 - .../gems/sass-3.6.0/lib/sass/source/map.rb | 209 - .../sass-3.6.0/lib/sass/source/position.rb | 39 - .../gems/sass-3.6.0/lib/sass/source/range.rb | 41 - .../2.3.0/gems/sass-3.6.0/lib/sass/stack.rb | 140 - .../gems/sass-3.6.0/lib/sass/supports.rb | 225 - .../sass-3.6.0/lib/sass/tree/at_root_node.rb | 83 - .../sass-3.6.0/lib/sass/tree/charset_node.rb | 22 - .../sass-3.6.0/lib/sass/tree/comment_node.rb | 82 - .../sass-3.6.0/lib/sass/tree/content_node.rb | 9 - .../lib/sass/tree/css_import_node.rb | 68 - .../sass-3.6.0/lib/sass/tree/debug_node.rb | 18 - .../lib/sass/tree/directive_node.rb | 59 - .../sass-3.6.0/lib/sass/tree/each_node.rb | 24 - .../sass-3.6.0/lib/sass/tree/error_node.rb | 18 - .../sass-3.6.0/lib/sass/tree/extend_node.rb | 43 - .../gems/sass-3.6.0/lib/sass/tree/for_node.rb | 36 - .../sass-3.6.0/lib/sass/tree/function_node.rb | 44 - .../gems/sass-3.6.0/lib/sass/tree/if_node.rb | 52 - .../sass-3.6.0/lib/sass/tree/import_node.rb | 75 - .../lib/sass/tree/keyframe_rule_node.rb | 15 - .../sass-3.6.0/lib/sass/tree/media_node.rb | 48 - .../lib/sass/tree/mixin_def_node.rb | 38 - .../sass-3.6.0/lib/sass/tree/mixin_node.rb | 52 - .../gems/sass-3.6.0/lib/sass/tree/node.rb | 240 - .../sass-3.6.0/lib/sass/tree/prop_node.rb | 162 - .../sass-3.6.0/lib/sass/tree/return_node.rb | 19 - .../sass-3.6.0/lib/sass/tree/root_node.rb | 44 - .../sass-3.6.0/lib/sass/tree/rule_node.rb | 152 - .../sass-3.6.0/lib/sass/tree/supports_node.rb | 38 - .../sass-3.6.0/lib/sass/tree/trace_node.rb | 33 - .../sass-3.6.0/lib/sass/tree/variable_node.rb | 36 - .../sass-3.6.0/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 | 572 - .../lib/sass/tree/visitors/set_options.rb | 139 - .../lib/sass/tree/visitors/to_css.rb | 436 - .../sass-3.6.0/lib/sass/tree/warn_node.rb | 18 - .../sass-3.6.0/lib/sass/tree/while_node.rb | 18 - .../2.3.0/gems/sass-3.6.0/lib/sass/util.rb | 1088 -- .../lib/sass/util/multibyte_string_scanner.rb | 151 - .../lib/sass/util/normalized_map.rb | 122 - .../sass-3.6.0/lib/sass/util/subset_map.rb | 109 - .../gems/sass-3.6.0/lib/sass/util/test.rb | 9 - .../2.3.0/gems/sass-3.6.0/lib/sass/version.rb | 120 - .../ruby/2.3.0/gems/sass-3.6.0/rails/init.rb | 1 - .../2.3.0/gems/sass-3.6.0/test/sass-spec.yml | 3 - .../gems/sass-3.6.0/test/sass/cache_test.rb | 130 - .../sass-3.6.0/test/sass/callbacks_test.rb | 60 - .../sass-3.6.0/test/sass/compiler_test.rb | 225 - .../sass-3.6.0/test/sass/conversion_test.rb | 2138 --- .../sass-3.6.0/test/sass/css2sass_test.rb | 523 - .../sass-3.6.0/test/sass/css_variable_test.rb | 237 - .../sass-3.6.0/test/sass/data/hsl-rgb.txt | 319 - .../sass-3.6.0/test/sass/encoding_test.rb | 188 - .../gems/sass-3.6.0/test/sass/engine_test.rb | 3499 ----- .../gems/sass-3.6.0/test/sass/exec_test.rb | 95 - .../gems/sass-3.6.0/test/sass/extend_test.rb | 1679 -- .../test_staleness_check_across_importers.css | 1 - ...test_staleness_check_across_importers.scss | 1 - .../sass-3.6.0/test/sass/functions_test.rb | 2021 --- .../sass-3.6.0/test/sass/importer_test.rb | 420 - .../gems/sass-3.6.0/test/sass/logger_test.rb | 57 - .../sass-3.6.0/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.6.0/test/sass/plugin_test.rb | 552 - .../gems/sass-3.6.0/test/sass/results/alt.css | 4 - .../sass-3.6.0/test/sass/results/basic.css | 9 - .../sass/results/cached_import_option.css | 3 - .../sass-3.6.0/test/sass/results/compact.css | 5 - .../sass-3.6.0/test/sass/results/complex.css | 86 - .../test/sass/results/compressed.css | 1 - .../sass-3.6.0/test/sass/results/expanded.css | 19 - .../test/sass/results/filename_fn.css | 3 - .../gems/sass-3.6.0/test/sass/results/if.css | 3 - .../sass-3.6.0/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.6.0/test/sass/results/mixins.css | 95 - .../test/sass/results/multiline.css | 24 - .../sass-3.6.0/test/sass/results/nested.css | 22 - .../sass-3.6.0/test/sass/results/options.css | 1 - .../test/sass/results/parent_ref.css | 13 - .../sass-3.6.0/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.6.0/test/sass/results/units.css | 11 - .../sass-3.6.0/test/sass/results/warn.css | 0 .../test/sass/results/warn_imported.css | 0 .../test/sass/script_conversion_test.rb | 365 - .../gems/sass-3.6.0/test/sass/script_test.rb | 1427 -- .../sass-3.6.0/test/sass/scss/css_test.rb | 1266 -- .../gems/sass-3.6.0/test/sass/scss/rx_test.rb | 159 - .../sass-3.6.0/test/sass/scss/scss_test.rb | 4238 ------ .../sass-3.6.0/test/sass/scss/test_helper.rb | 37 - .../sass-3.6.0/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.6.0/test/sass/templates/alt.sass | 16 - .../sass-3.6.0/test/sass/templates/basic.sass | 23 - .../sass-3.6.0/test/sass/templates/bork1.sass | 2 - .../sass-3.6.0/test/sass/templates/bork2.sass | 2 - .../sass-3.6.0/test/sass/templates/bork3.sass | 2 - .../sass-3.6.0/test/sass/templates/bork4.sass | 2 - .../sass-3.6.0/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.6.0/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.6.0/test/sass/templates/units.sass | 11 - .../sass-3.6.0/test/sass/templates/warn.sass | 3 - .../test/sass/templates/warn_imported.sass | 4 - .../gems/sass-3.6.0/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.6.0/test/sass/util_test.rb | 393 - .../test/sass/value_helpers_test.rb | 178 - .../2.3.0/gems/sass-3.6.0/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 - .../2.3.0/specifications/ffi-1.9.25.gemspec | 49 - .../forwardable-extended-2.6.0.gemspec | 20 - .../2.3.0/specifications/jekyll-3.6.3.gemspec | 65 - .../specifications/jekyll-feed-0.9.2.gemspec | 49 - .../specifications/jekyll-menus-0.6.0.gemspec | 36 - .../jekyll-sass-converter-1.5.2.gemspec | 46 - .../specifications/jekyll-watch-1.5.1.gemspec | 47 - .../specifications/kramdown-1.17.0.gemspec | 66 - .../2.3.0/specifications/liquid-4.0.1.gemspec | 37 - .../2.3.0/specifications/listen-3.1.5.gemspec | 44 - .../specifications/mercenary-0.3.6.gemspec | 38 - .../specifications/pathutil-0.16.1.gemspec | 32 - .../public_suffix-3.0.3.gemspec | 41 - .../specifications/rb-fsevent-0.10.3.gemspec | 42 - .../specifications/rb-inotify-0.9.10.gemspec | 40 - .../2.3.0/specifications/rouge-2.2.1.gemspec | 23 - .../specifications/ruby_dep-1.5.0.gemspec | 34 - .../specifications/safe_yaml-1.0.4.gemspec | 23 - .../2.3.0/specifications/sass-3.6.0.gemspec | 49 - .../specifications/sass-listen-4.0.0.gemspec | 39 - 2448 files changed, 917 insertions(+), 289774 deletions(-) create mode 100644 _i18n/de.yml create mode 100644 _i18n/en.yml create mode 100644 _i18n/nl.yml delete mode 100644 _includes/block-cta-bar.html delete mode 100644 _includes/block-feature-1.html delete mode 100644 _includes/block-feature-2.html delete mode 100644 _includes/block-footer-1.html delete mode 100644 _includes/block-header-1.html delete mode 100644 _includes/block-header-2.html delete mode 100644 _includes/block-header-3.html delete mode 100644 _includes/block-hero-1.html delete mode 100644 _includes/block-hero-2.html delete mode 100644 _includes/block-irma-1.html rename _includes/{block-faq-1.html => block-irma-faq.html} (81%) delete mode 100644 _includes/block-irma-footer-2.html create mode 100644 _includes/block-irma-footer.html rename _includes/{block-irma-header-1.html => block-irma-header.html} (53%) create mode 100644 _includes/block-irma-hero-1.html rename _includes/{block-irma-2.html => block-irma-hero-2.html} (56%) delete mode 100644 _includes/block-irma-three-column-1.html create mode 100644 _includes/block-irma-three-column.html delete mode 100644 _includes/block-media-1.html delete mode 100644 _includes/block-media-2.html delete mode 100644 _includes/block-one-column-1.html delete mode 100644 _includes/block-text-1.html delete mode 100644 _includes/block-three-column-1.html delete mode 100644 _includes/block-three-column-irma-1.html delete mode 100644 _includes/block-two-column-1.html delete mode 100755 vendor/bundle/ruby/2.3.0/bin/jekyll delete mode 100755 vendor/bundle/ruby/2.3.0/bin/kramdown delete mode 100755 vendor/bundle/ruby/2.3.0/bin/listen delete mode 100755 vendor/bundle/ruby/2.3.0/bin/rougify delete mode 100755 vendor/bundle/ruby/2.3.0/bin/safe_yaml delete mode 100755 vendor/bundle/ruby/2.3.0/bin/sass delete mode 100755 vendor/bundle/ruby/2.3.0/bin/sass-convert delete mode 100755 vendor/bundle/ruby/2.3.0/bin/scss delete mode 100644 vendor/bundle/ruby/2.3.0/cache/addressable-2.5.2.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/colorator-1.1.0.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/ffi-1.9.25.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/forwardable-extended-2.6.0.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-3.6.3.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-feed-0.9.2.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-menus-0.6.0.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-sass-converter-1.5.2.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/jekyll-watch-1.5.1.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/kramdown-1.17.0.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/liquid-4.0.1.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/listen-3.1.5.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/mercenary-0.3.6.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/pathutil-0.16.1.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.3.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.3.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/rb-inotify-0.9.10.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/rouge-2.2.1.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/ruby_dep-1.5.0.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/safe_yaml-1.0.4.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/sass-3.6.0.gem delete mode 100644 vendor/bundle/ruby/2.3.0/cache/sass-listen-4.0.0.gem delete mode 100755 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/ffi_c.bundle delete mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem.build_complete delete mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem_make.out delete mode 100644 vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/data/unicode.data delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/native.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/template.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake delete mode 100644 vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitmodules delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.travis.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.yardopts delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE.SPECS delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/appveyor.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/.RUBYARCHDIR.time delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Buffer.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DataConverter.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/FunctionInfo.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Makefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructLayout.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Variadic.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/compat.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi.c delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi_c.bundle delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.7.dylib delete mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.dylib delete mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.la delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.lai delete mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi_convenience.la delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/Makefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/config.log delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/config.status delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/fficonfig.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/Makefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h delete mode 120000 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi.la delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi.pc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi_convenience.la delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libtool delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/local.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/man/Makefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/.deps/.dirstamp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/.dirstamp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/closures.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/java_raw_api.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/prep_cif.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/raw_api.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/types.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/.deps/.dirstamp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/.dirstamp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffi64.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffiw64.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/unix64.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/win64.lo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/stamp-h1 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/testsuite/Makefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.bsd.mk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.darwin.mk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.gnu.mk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.mk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.vc.mk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.vc64.mk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.appveyor.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.github/issue_template.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis.yml delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/ar-lib delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/build.sh delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/compile delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/install.sh delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/moxie-sim.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/site.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libffi delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libffi-3.1 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libgcj delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.v1 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/LICENSE-BUILDTOOLS delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/Makefile.am delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/acinclude.m4 delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/autogen.sh delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/config.guess delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/config.sub delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure.ac delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure.host delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/generate-darwin-source-and-headers.py delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/Makefile.am delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi.h.in delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_cfi.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_common.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.map.in delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.pc.in delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libtool-version delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/asmcfi.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_append_flag.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_configure_args.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_require_defined.m4 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/Makefile.am delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi.3 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_call.3 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_prep_cif.3 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 delete mode 100755 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/msvcc.sh delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/internal.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/internal.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/osf.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/arcompact.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/internal.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/debug.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/dlmalloc.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/eabi.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ia64_flags.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/unix.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/obsd.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/n32.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/o32.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/eabi.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/hpux32.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/linux.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/aix.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/aix_closure.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/asm.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/darwin.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/darwin_closure.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/linux64.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/linux64_closure.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ppc_closure.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/internal.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffi64.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/internal.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v8.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v9.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/tile.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/elfbsd.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/asmnames.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal64.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64_intel.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffitarget.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/sysv.S delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/stamp-h.in delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/Makefile.am delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/config/default.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/libffi.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/wrapper.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/README delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/call.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float3.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float4.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/huge_struct.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/negint.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/go.exp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi_endian.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/win32/stdbool.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/win32/stdint.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ffi.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/autopointer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/buffer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/callback.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/enum.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/errno.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/ffi.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/io.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/library.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/managedstruct.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/memorypointer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/aarch64-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/arm-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-cygwin/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-darwin/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-freebsd/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-gnu/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-netbsd/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-openbsd/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-solaris/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-windows/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/ia64-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips64-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips64el-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsel-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa32r6-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa32r6el-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa64r6-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa64r6el-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-aix/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-darwin/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc64-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/s390-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/s390x-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc-solaris/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc64-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparcv9-solaris/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-cygwin/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-darwin/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-freebsd/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-linux/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-netbsd/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-openbsd/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-solaris/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-windows/types.conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/pointer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/struct.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/struct_layout_builder.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/const_generator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/generator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/generator_task.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/struct_generator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/types_generator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/types.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/union.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/variadic.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getlogin.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getpid.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/gettimeofday.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/hello.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/inotify.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/pty.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/qsort.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/sample_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/.rubocop.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/README.markdown delete mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/exe/jekyll delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/cleaner.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/collection.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/command.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/build.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/clean.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/doctor.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/help.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/new.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/new_theme.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/serve.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/serve/servlet.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/configuration.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/identity.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/kramdown_parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/rdiscount_parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/redcarpet_parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/smartypants.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/convertible.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/deprecator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/document.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/collection_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/document_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/excerpt_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/jekyll_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/site_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/static_file_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/unified_payload_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/url_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/entry_filter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/errors.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/excerpt.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/external.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters/grouping_filters.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters/url_filters.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/frontmatter_defaults.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/generator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/hooks.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/layout.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_extensions.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer/file.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer/table.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/log_adapter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/mime.types delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/page.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/plugin.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/plugin_manager.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/publisher.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/collection_reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/data_reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/layout_reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/page_reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/post_reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/static_file_reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/theme_assets_reader.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/regenerator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/related_posts.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/renderer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/site.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/static_file.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/stevenson.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/highlight.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/include.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/link.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/post_url.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/theme.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/theme_builder.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/url.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/ansi.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/exec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/platforms.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/rouge.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/win_tz.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/404.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/_config.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/about.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/index.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/CODE_OF_CONDUCT.md.erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/LICENSE.txt.erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/README.md.erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/default.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/page.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/post.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_config.yml.erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_post.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/index.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/style.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/gitignore.erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/theme.gemspec.erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rubocop.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.travis.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/History.markdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/bootstrap delete mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/cibuild delete mode 100755 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/release delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md delete 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 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md delete 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 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/feed.xslt.xml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll-menus.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/all.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/item.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/menu.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/hook.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/utils.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/sass.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/scss.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll-watch.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll-watch/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/commands/watch.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/watcher.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/AUTHORS delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/CONTRIBUTERS delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/COPYING delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/VERSION delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/benchmark.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/benchmark.sh delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/generate_data.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/mdbasics.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/mdsyntax.text delete mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/testing.sh delete mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/timing.sh delete mode 100755 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/bin/kramdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/data/kramdown/document.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/data/kramdown/document.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/_design.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/bg.png delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/default.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/default.template delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/documentation.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/documentation.template delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/index.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/installation.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/links.markdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/metainfo delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/news.feed delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/news.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/options.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/quickref.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/sidebar.template delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/sitemap.sitemap delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/syntax.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/tests.page delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/virtual delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/hash_ast.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/html.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/kramdown.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/latex.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/man.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/math_engine/itex2mml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/math_engine/katex.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/math_engine/mathjax.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/math_engine/mathjaxnode.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/math_engine/ritex.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/math_engine/sskatex.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/pdf.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/remove_html_tags.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/syntax_highlighter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/syntax_highlighter/coderay.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/syntax_highlighter/minted.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/syntax_highlighter/rouge.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/converter/toc.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/document.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/element.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/error.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/options.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/gfm.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/html.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/abbreviation.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/autolink.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/blank_line.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/block_boundary.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/blockquote.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/codeblock.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/codespan.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/emphasis.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/eob.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/escaped_chars.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/extensions.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/footnote.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/header.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/horizontal_rule.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/html.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/html_entity.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/line_break.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/link.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/list.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/math.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/paragraph.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/smart_quotes.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/table.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/kramdown/typographic_symbol.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/parser/markdown.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils/configurable.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils/entities.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils/html.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils/lru_cache.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils/ordered_hash.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils/string_scanner.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/utils/unidecoder.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/lib/kramdown/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/man/man1/kramdown.1 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/setup.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/run_tests.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/test_files.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/test_location.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/test_string_scanner_kramdown.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/01_blank_line/spaces.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/01_blank_line/spaces.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/01_blank_line/tabs.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/01_blank_line/tabs.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/02_eob/beginning.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/02_eob/beginning.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/02_eob/end.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/02_eob/end.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/02_eob/middle.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/02_eob/middle.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/indented.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/indented.html.gfm delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/indented.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/line_break_last_line.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/line_break_last_line.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/no_newline_at_end.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/no_newline_at_end.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/one_para.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/one_para.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/two_para.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/two_para.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/with_html_to_native.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/with_html_to_native.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/03_paragraph/with_html_to_native.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/atx_header.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/atx_header.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/atx_header_no_newline_at_end.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/atx_header_no_newline_at_end.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/header_type_offset.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/header_type_offset.kramdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/header_type_offset.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/header_type_offset.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/header_type_offset.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/setext_header.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/setext_header.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/setext_header_no_newline_at_end.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/setext_header_no_newline_at_end.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_id_prefix.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_id_prefix.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_id_prefix.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_id_stripping.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_id_stripping.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_id_stripping.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_ids.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_ids.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/04_header/with_auto_ids.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/indented.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/indented.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/lazy.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/lazy.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/nested.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/nested.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/no_newline_at_end.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/no_newline_at_end.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/very_long_line.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/very_long_line.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/with_code_blocks.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/05_blockquote/with_code_blocks.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/disable-highlighting.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/disable-highlighting.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/disable-highlighting.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/error.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/error.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-minted-with-opts.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-minted.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-minted.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-minted.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-opts.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-opts.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting-opts.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/highlighting.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/issue_gh45.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/issue_gh45.test delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/lazy.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/lazy.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/no_newline_at_end.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/no_newline_at_end.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/no_newline_at_end_1.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/no_newline_at_end_1.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/disabled.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/disabled.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/disabled.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/multiple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/multiple.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/multiple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/simple.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/rouge/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/tilde_syntax.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/tilde_syntax.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/whitespace.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/whitespace.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_blank_line.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_blank_line.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_eob_marker.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_eob_marker.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_ial.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_ial.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_any_char.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/06_codeblock/with_lang_in_fenced_block_name_with_dash.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/error.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/error.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/error.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/sepspaces.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/sepspaces.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/septabs.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/07_horizontal_rule/septabs.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/brackets_in_item.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/brackets_in_item.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/escaping.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/escaping.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/item_ial.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/item_ial.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/lazy.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/lazy.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/lazy_and_nested.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/lazy_and_nested.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/list_and_hr.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/list_and_hr.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/list_and_others.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/list_and_others.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/mixed.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/mixed.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/nested.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/nested.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/other_first_element.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/other_first_element.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/simple_ol.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/simple_ol.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/simple_ul.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/simple_ul.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/single_item.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/single_item.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/special_cases.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/08_list/special_cases.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/comment.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/comment.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/content_model/deflists.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/content_model/deflists.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/content_model/deflists.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/content_model/tables.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/content_model/tables.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/content_model/tables.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html5_attributes.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html5_attributes.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_after_block.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_after_block.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_and_codeblocks.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_and_codeblocks.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_and_codeblocks.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_and_headers.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_and_headers.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/code.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/code.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/comment.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/comment.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/emphasis.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/emphasis.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/entity.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/entity.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/header.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/header.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/header.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/list_dl.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/list_dl.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/list_ol.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/list_ol.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/list_ul.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/list_ul.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/paragraph.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/paragraph.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/table_normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/table_normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/table_simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/table_simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/typography.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/typography.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/html_to_native/typography.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/invalid_html_1.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/invalid_html_1.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/invalid_html_2.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/invalid_html_2.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/markdown_attr.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/markdown_attr.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/not_parsed.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/not_parsed.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.htmlinput delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.htmlinput delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_block_html.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_block_html.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_block_html.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/processing_instruction.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/processing_instruction.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/textarea.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/textarea.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/xml.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/xml.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/10_ald/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/10_ald/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/auto_id_and_ial.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/auto_id_and_ial.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/auto_id_and_ial.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/nested.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/nested.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/comment.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/comment.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/ignored.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/ignored.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.kramdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options2.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options2.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/auto_ids.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/auto_ids.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/definition_at_beginning.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/definition_at_beginning.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/item_ial.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/item_ial.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/multiple_terms.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/multiple_terms.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/no_def_list.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/no_def_list.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/para_wrapping.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/para_wrapping.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/separated_by_eob.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/separated_by_eob.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/styled_terms.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/styled_terms.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/too_much_space.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/too_much_space.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/with_blocks.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/with_blocks.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/errors.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/errors.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/escaping.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/escaping.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/footer.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/footer.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/header.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/header.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/no_table.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/no_table.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview_as_code.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview_as_code.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview_as_code.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview_simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview_simple.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview_simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode_notexhints.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode_notexhints.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode_notexhints.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode_semantics.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode_semantics.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjaxnode_semantics.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/no_engine.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/no_engine.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/no_engine.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/no_toc.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/no_toc.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_links.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_links.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_links.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/encoding.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/encoding.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/example.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/example.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-dash-description.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-dash-description.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-description.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-description.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section-description.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section-description.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/text-escaping.man delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/text-escaping.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty_title.htmlinput delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty_title.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/image_in_a.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/image_in_a.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/imagelinks.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/imagelinks.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/latex_escaping.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/latex_escaping.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs_with_ial.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs_with_ial.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/links_with_angle_brackets.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/links_with_angle_brackets.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/empty.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/empty.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/errors.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/errors.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/nesting.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/nesting.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/empty.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/empty.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/errors.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/errors.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/highlighting-minted.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/highlighting-minted.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/highlighting-minted.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/highlighting.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/highlighting.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/disabled.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/disabled.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/disabled.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/simple.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_text.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_text.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_text.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/inside_footnote.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/inside_footnote.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/regexp_problem.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/regexp_problem.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/regexp_problem.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/without_backlink.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/without_backlink.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/without_backlink.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/across_lines.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/across_lines.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/button.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/button.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/invalid.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/invalid.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/link_with_mailto.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/link_with_mailto.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/mark_element.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/mark_element.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/markdown_attr.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/markdown_attr.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/raw_span_elements.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/raw_span_elements.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/xml.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/xml.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev_defs.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev_defs.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/in_footnote.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/in_footnote.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/autolinks/url_links.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/autolinks/url_links.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/escaped_chars/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/escaped_chars/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/comment.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/comment.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/ignored.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/ignored.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/nomarkdown.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/nomarkdown.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/options.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/options.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/ial/simple.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/ial/simple.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/no_engine.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/no_engine.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/no_engine.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/normal.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/normal.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_char.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_char.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_char.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_char.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_input.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_input.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_input.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_numeric.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_numeric.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_numeric.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_symbolic.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_symbolic.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_symbolic.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/greaterthan.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/greaterthan.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/lowerthan.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/lowerthan.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.latex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_syntax.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_syntax.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/hard_line_breaks.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/hard_line_breaks.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/hard_line_breaks_off.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/hard_line_breaks_off.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/hard_line_breaks_off.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids_with_prefix.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids_with_prefix.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids_with_prefix.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/no_typographic.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/no_typographic.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/no_typographic.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/no_typographic.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.options delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.html.19 delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/task_list.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/task_list.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/two_para_hard_line_breaks.html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/two_para_hard_line_breaks.text delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/History.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/block.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/block_body.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/condition.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/context.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/document.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/errors.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/expression.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/extensions.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/file_system.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/forloop_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/i18n.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/interrupts.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/lexer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/locales/en.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parse_context.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parser_switching.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/profiler.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/profiler/hooks.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/range_lookup.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/resource_limits.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/standardfilters.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/strainer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tablerowloop_drop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tag.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/assign.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/break.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/capture.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/case.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/comment.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/continue.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/cycle.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/decrement.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/for.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/if.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/ifchanged.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/include.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/increment.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/raw.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/table_row.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/unless.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/template.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tokenizer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/utils.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/variable.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/variable_lookup.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/fixtures/en_locale.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/assign_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/blank_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/block_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/capture_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/context_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/document_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/drop_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/error_handling_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/filter_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/hash_ordering_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/output_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/parsing_quirks_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/render_profiling_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/security_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/standard_filter_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/break_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/continue_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/for_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/if_else_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/include_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/increment_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/raw_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/standard_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/statements_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/table_row_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/unless_else_tag_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/template_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/trim_mode_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/variable_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/test_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/block_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/condition_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/context_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/file_system_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/i18n_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/lexer_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/parser_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/regexp_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/strainer_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tag_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/case_tag_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/for_tag_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/if_tag_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/template_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tokenizer_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/variable_unit_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CHANGELOG.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CONTRIBUTING.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/README.md delete mode 100755 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/bin/listen delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/bsd.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/config.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/darwin.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/linux.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/polling.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/windows.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/backend.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/change.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/cli.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/directory.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/config.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/loop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/processor.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/queue.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/file.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/fsm.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/internals/thread_pool.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener/config.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/logger.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/options.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/queue_optimizer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/entry.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/symlink_detector.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer/controller.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.rspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.travis.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/History.markdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Rakefile delete mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/help_dialogue.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/logging.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/trace.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/option.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/mercenary.gemspec delete mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/bootstrap delete mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/cibuild delete mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/console delete mode 100755 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/examples delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/command_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/option_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/presenter_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/program_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/spec_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/helpers.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.rubocop.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.rubocop_defaults.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.ruby-gemset delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.travis.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.yardopts delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/2.0-Upgrade.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/CHANGELOG.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/Rakefile delete mode 100755 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/bin/console delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/data/list.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/domain.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/errors.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/list.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/rule.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/public_suffix.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/.empty delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/acceptance_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_find.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_find_all.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_names.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_select.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_select_incremental.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_valid.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/domain_profiler.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/find_profiler.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/find_profiler_jp.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/initialization_profiler.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/list_profsize.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/object_binsize.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/psl_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/test_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/tests.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/domain_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/errors_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/list_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/public_suffix_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/rule_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/Guardfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/Rakefile delete mode 100755 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/bin/fsevent_watch delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/FSEventsFix.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/FSEventsFix.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/TSICTString.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/TSICTString.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/cli.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/cli.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/common.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/compat.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/compat.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/defines.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/main.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/signal_handlers.c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/signal_handlers.h delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/rakefile.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/otnetstring.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent/fsevent.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/rb-fsevent.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.travis.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.yardopts delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/LICENSE delete mode 100755 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/bin/rougify delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/cli.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/abap delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/actionscript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/apache delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/apiblueprint delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/applescript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/awk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/biml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/bsl delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/ceylon delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cfscript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/clojure delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cmake delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/coffeescript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/common_lisp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/conf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/console delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/coq delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cpp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/csharp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/d delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/dart delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/diff delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/digdag delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/docker delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/dot delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/eiffel delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/elixir delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erlang delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/factor delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/fortran delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/fsharp delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/gherkin delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/glsl delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/go delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/gradle delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/graphql delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/groovy delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/haml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/handlebars delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/haskell delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/html delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/http delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/hylang delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/idlang delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/igorpro delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/ini delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/io delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/irb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/irb_output delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/java delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/javascript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/jinja delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/json delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/json-doc delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/jsonnet delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/jsx delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/julia delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/kotlin delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/lasso delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/liquid delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/literate_coffeescript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/literate_haskell delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/llvm delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/lua delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/make delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/markdown delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/matlab delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/moonscript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/mosel delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/mxml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/nasm delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/nginx delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/nim delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/nix delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/objective_c delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/ocaml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/pascal delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/perl delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/php delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/plaintext delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/plist delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/pony delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/powershell delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/praat delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/prolog delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/prometheus delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/properties delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/protobuf delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/puppet delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/python delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/q delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/qml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/r delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/racket delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/ruby delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/rust delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/scala delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/scheme delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/sed delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/shell delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/sieve delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/slim delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/smalltalk delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/smarty delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/sml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/sql delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/swift delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/tap delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/tcl delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/tex delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/toml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/tsx delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/tulip delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/turtle delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/twig delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/typescript delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/vala delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/vb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/verilog delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/vhdl delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/viml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/vue delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/wollok delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/xml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/yaml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/html.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/html_inline.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/html_legacy.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/html_linewise.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/html_pygments.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/html_table.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/null.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/formatters/terminal256.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/guesser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/guessers/filename.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/guessers/glob_mapping.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/guessers/mimetype.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/guessers/modeline.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/guessers/source.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/abap.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/actionscript.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/apache.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/apache/keywords.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/apiblueprint.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/apple_script.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/awk.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/biml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/bsl.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/c.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/ceylon.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/cfscript.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/clojure.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/cmake.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/coffeescript.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/common_lisp.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/conf.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/console.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/coq.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/cpp.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/csharp.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/css.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/d.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/dart.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/diff.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/digdag.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/docker.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/dot.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/eiffel.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/elixir.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/erb.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/erlang.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/factor.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/fortran.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/fsharp.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/gherkin.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/gherkin/keywords.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/glsl.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/go.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/gradle.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/graphql.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/groovy.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/haml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/handlebars.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/haskell.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/html.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/http.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/hylang.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/idlang.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/igorpro.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/ini.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/io.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/irb.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/java.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/javascript.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/jinja.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/json.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/json_doc.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/jsonnet.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/jsx.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/julia.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/kotlin.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/lasso.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/lasso/keywords.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/liquid.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/literate_coffeescript.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/literate_haskell.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/llvm.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/lua.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/lua/builtins.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/make.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/markdown.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/matlab.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/matlab/builtins.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/moonscript.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/mosel.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/mxml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/nasm.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/nginx.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/nim.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/nix.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/objective_c.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/ocaml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/pascal.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/perl.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/php.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/php/builtins.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/plain_text.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/plist.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/pony.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/powershell.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/praat.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/prolog.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/prometheus.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/properties.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/protobuf.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/puppet.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/python.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/q.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/qml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/r.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/racket.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/ruby.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/rust.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/sass.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/sass/common.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/scala.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/scheme.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/scss.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/sed.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/shell.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/sieve.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/slim.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/smalltalk.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/smarty.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/sml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/sql.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/swift.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/tap.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/tcl.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/tex.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/toml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/tsx.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/tulip.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/turtle.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/twig.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/typescript.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/typescript/common.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/vala.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/vb.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/verilog.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/vhdl.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/viml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/viml/keywords.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/vue.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/wollok.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/xml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/lexers/yaml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/plugins/redcarpet.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/regex_lexer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/template_lexer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/text_analyzer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/theme.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/base16.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/colorful.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/github.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/gruvbox.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/igor_pro.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/molokai.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/monokai.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/monokai_sublime.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/pastie.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/thankful_eyes.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/themes/tulip.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/token.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/util.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/rouge.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.rspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.rubocop.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/.travis.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/logger.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/quiet.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/ruby_version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/travis.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/travis/ruby_version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/ruby_dep-1.5.0/lib/ruby_dep/warning.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/.gitignore delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/.travis.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/CHANGES.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/Gemfile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/Rakefile delete mode 100755 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/bin/safe_yaml delete mode 100755 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/bundle_install_all_ruby_versions.sh delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/deep.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/libyaml_checker.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/load.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/date.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/hexadecimal.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/parse/sexagesimal.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_handler.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/psych_resolver.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/resolver.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/safe_to_ruby_visitor.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_hack.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_node_monkeypatch.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/syck_resolver.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_boolean.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_date.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_float.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_integer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_nil.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/to_symbol.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/transform/transformation_map.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/lib/safe_yaml/version.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/run_specs_all_ruby_versions.sh delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/safe_yaml.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.2.yaml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/exploit.1.9.3.yaml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/issue48.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/issue49.yml delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/libyaml_checker_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/psych_resolver_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/resolver_specs.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/safe_yaml_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/spec_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/support/exploitable_back_door.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/syck_resolver_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/base64_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_date_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_float_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_integer_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/transform/to_symbol_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/safe_yaml-1.0.4/spec/yaml_spec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/.yardopts delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/CODE_OF_CONDUCT.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/CONTRIBUTING.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/MIT-LICENSE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/REVISION delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/Rakefile delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/VERSION delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/VERSION_DATE delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/VERSION_NAME delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/bin/sass delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/bin/sass-convert delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/bin/scss delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/extra/sass-spec-ref.sh delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/extra/update_watch.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/init.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/cache_stores.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/cache_stores/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/cache_stores/chain.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/cache_stores/filesystem.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/cache_stores/memory.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/cache_stores/null.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/callbacks.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/css.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/deprecation.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/engine.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/environment.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/error.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/exec.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/exec/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/exec/sass_convert.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/exec/sass_scss.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/features.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/importers.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/importers/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/importers/deprecated_path.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/importers/filesystem.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/logger.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/logger/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/logger/delayed.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/logger/log_level.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/media.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin/compiler.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin/configuration.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin/generic.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin/merb.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin/rack.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin/rails.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/plugin/staleness_checker.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/railtie.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/repl.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/root.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/css_lexer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/css_parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/functions.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/lexer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/funcall.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/interpolation.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/list_literal.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/literal.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/map_literal.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/operation.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/selector.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/string_interpolation.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/unary_operation.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/tree/variable.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/arg_list.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/bool.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/callable.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/color.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/function.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/helpers.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/list.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/map.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/null.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/number.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/script/value/string.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/scss.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/scss/css_parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/scss/parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/scss/rx.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/scss/static_parser.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/selector.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/selector/abstract_sequence.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/selector/comma_sequence.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/selector/pseudo.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/selector/sequence.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/selector/simple.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/selector/simple_sequence.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/shared.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/source/map.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/source/position.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/source/range.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/stack.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/supports.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/at_root_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/charset_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/comment_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/content_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/css_import_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/debug_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/directive_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/each_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/error_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/extend_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/for_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/function_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/if_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/import_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/keyframe_rule_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/media_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/mixin_def_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/mixin_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/prop_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/return_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/root_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/rule_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/supports_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/trace_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/variable_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/check_nesting.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/convert.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/cssize.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/deep_copy.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/extend.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/perform.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/set_options.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/visitors/to_css.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/warn_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/tree/while_node.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/util.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/util/multibyte_string_scanner.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/util/normalized_map.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/util/subset_map.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/util/test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/lib/sass/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/rails/init.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass-spec.yml delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/cache_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/callbacks_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/compiler_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/conversion_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/css2sass_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/css_variable_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/data/hsl-rgb.txt delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/encoding_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/engine_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/exec_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/extend_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/fixtures/test_staleness_check_across_importers.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/fixtures/test_staleness_check_across_importers.scss delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/functions_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/importer_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/logger_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/mock_importer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/more_results/more1.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/more_results/more1_with_line_comments.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/more_results/more_import.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/more_templates/_more_partial.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/more_templates/more1.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/more_templates/more_import.sass delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/plugin_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/alt.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/basic.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/cached_import_option.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/compact.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/complex.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/compressed.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/expanded.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/filename_fn.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/if.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/import.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/import_charset.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/import_charset_ibm866.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/import_content.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/line_numbers.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/mixins.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/multiline.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/nested.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/options.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/parent_ref.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/script.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/scss_import.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/scss_importee.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/subdir/nested_subdir/nested_subdir.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/subdir/subdir.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/units.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/warn.css delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/results/warn_imported.css delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/script_conversion_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/script_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/scss/css_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/scss/rx_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/scss/scss_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/scss/test_helper.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/source_map_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/superselector_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_cached_import_option_partial.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_double_import_loop2.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_filename_fn_import.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_imported_charset_ibm866.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_imported_charset_utf8.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_imported_content.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_partial.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/_same_name_different_partiality.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/alt.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/basic.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/bork1.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/bork2.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/bork3.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/bork4.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/bork5.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/cached_import_option.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/compact.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/complex.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/compressed.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/double_import_loop1.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/expanded.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/filename_fn.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/if.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/import.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/import_charset.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/import_charset_ibm866.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/import_content.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/importee.less delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/importee.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/line_numbers.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/mixin_bork.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/mixins.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/multiline.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/nested.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/nested_bork1.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/nested_bork2.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/nested_bork3.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/nested_bork4.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/nested_import.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/nested_mixin_bork.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/options.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/parent_ref.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/same_name_different_ext.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/same_name_different_ext.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/same_name_different_partiality.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/script.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/scss_import.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/scss_importee.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/single_import_loop.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/subdir/import_up1.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/subdir/import_up2.scss delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/subdir/nested_subdir/_nested_partial.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/subdir/nested_subdir/nested_subdir.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/subdir/subdir.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/units.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/warn.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/templates/warn_imported.sass delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/test_helper.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/util/multibyte_string_scanner_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/util/normalized_map_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/util/subset_map_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/util_test.rb delete mode 100755 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/sass/value_helpers_test.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-3.6.0/test/test_helper.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/CHANGELOG.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/CONTRIBUTING.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/LICENSE.txt delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/README.md delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/base.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/bsd.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/config.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/darwin.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/linux.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/polling.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/adapter/windows.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/backend.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/change.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/cli.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/directory.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/config.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/loop.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/processor.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/event/queue.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/file.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/fsm.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/internals/thread_pool.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/listener.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/listener/config.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/logger.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/options.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/queue_optimizer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/record.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/record/entry.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/record/symlink_detector.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/silencer/controller.rb delete mode 100644 vendor/bundle/ruby/2.3.0/gems/sass-listen-4.0.0/lib/sass-listen/version.rb delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/addressable-2.5.2.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/colorator-1.1.0.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/ffi-1.9.25.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/forwardable-extended-2.6.0.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-3.6.3.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-feed-0.9.2.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-menus-0.6.0.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-sass-converter-1.5.2.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/jekyll-watch-1.5.1.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/kramdown-1.17.0.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/liquid-4.0.1.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/listen-3.1.5.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/mercenary-0.3.6.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/pathutil-0.16.1.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/public_suffix-3.0.3.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/rb-fsevent-0.10.3.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/rb-inotify-0.9.10.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/rouge-2.2.1.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/ruby_dep-1.5.0.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/safe_yaml-1.0.4.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/sass-3.6.0.gemspec delete mode 100644 vendor/bundle/ruby/2.3.0/specifications/sass-listen-4.0.0.gemspec diff --git a/.bundle/config b/.bundle/config index 2369228..dcbe768 100644 --- a/.bundle/config +++ b/.bundle/config @@ -1,2 +1,3 @@ --- -BUNDLE_PATH: "vendor/bundle" +BUNDLE_PATH: "vendor" +BUNDLE_NO_INSTALL: "true" diff --git a/Gemfile b/Gemfile index f08d5a6..995e049 100644 --- a/Gemfile +++ b/Gemfile @@ -17,7 +17,8 @@ gem "jekyll", "~> 3.6.0" # If you have any plugins, put them here! group :jekyll_plugins do gem "jekyll-feed", "~> 0.6" - gem "jekyll-menus" + gem "jekyll-menus", "0.6" + gem 'jekyll-multiple-languages-plugin' end # Windows does not include zoneinfo files, so bundle the tzinfo-data gem diff --git a/Gemfile.lock b/Gemfile.lock index deac11c..aa9919b 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -1,10 +1,10 @@ GEM remote: https://rubygems.org/ specs: - addressable (2.5.2) - public_suffix (>= 2.0.2, < 4.0) + addressable (2.7.0) + public_suffix (>= 2.0.2, < 5.0) colorator (1.1.0) - ffi (1.9.25) + ffi (1.11.1) forwardable-extended (2.6.0) jekyll (3.6.3) addressable (~> 2.4) @@ -17,31 +17,31 @@ GEM pathutil (~> 0.9) rouge (>= 1.7, < 3) safe_yaml (~> 1.0) - jekyll-feed (0.9.2) + jekyll-feed (0.11.0) jekyll (~> 3.3) jekyll-menus (0.6.0) jekyll (~> 3.1) + jekyll-multiple-languages-plugin (1.6.0) + jekyll (>= 2.0, < 4.0) jekyll-sass-converter (1.5.2) sass (~> 3.4) jekyll-watch (1.5.1) listen (~> 3.0) kramdown (1.17.0) - liquid (4.0.1) - listen (3.1.5) - rb-fsevent (~> 0.9, >= 0.9.4) - rb-inotify (~> 0.9, >= 0.9.7) - ruby_dep (~> 1.2) + liquid (4.0.3) + listen (3.2.0) + rb-fsevent (~> 0.10, >= 0.10.3) + rb-inotify (~> 0.9, >= 0.9.10) mercenary (0.3.6) - pathutil (0.16.1) + pathutil (0.16.2) forwardable-extended (~> 2.6) - public_suffix (3.0.3) + public_suffix (4.0.1) rb-fsevent (0.10.3) - rb-inotify (0.9.10) - ffi (>= 0.5.0, < 2) + rb-inotify (0.10.0) + ffi (~> 1.0) rouge (2.2.1) - ruby_dep (1.5.0) - safe_yaml (1.0.4) - sass (3.6.0) + safe_yaml (1.0.5) + sass (3.7.4) sass-listen (~> 4.0.0) sass-listen (4.0.0) rb-fsevent (~> 0.9, >= 0.9.4) @@ -53,8 +53,9 @@ PLATFORMS DEPENDENCIES jekyll (~> 3.6.0) jekyll-feed (~> 0.6) - jekyll-menus + jekyll-menus (= 0.6) + jekyll-multiple-languages-plugin tzinfo-data BUNDLED WITH - 1.16.2 + 1.17.2 diff --git a/_config.yml b/_config.yml index e26efee..d16c13e 100644 --- a/_config.yml +++ b/_config.yml @@ -3,14 +3,17 @@ title: IRMA author: Privacy by Design Foundation email: '' description: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. -baseurl: "/" +baseurl: "" url: '' +languages: ["nl", "en", "de"] +exclude_from_localizations: ["uploads", css"] defaults: - scope: path: '' values: layout: default markdown: kramdown -gems: +plugins: - jekyll-feed - jekyll-menus +- jekyll-multiple-languages-plugin diff --git a/_i18n/de.yml b/_i18n/de.yml new file mode 100644 index 0000000..f16f526 --- /dev/null +++ b/_i18n/de.yml @@ -0,0 +1,232 @@ +nav: + home_link: "/" + home_text: IRMA + usage_link: "#gebruik" + usage_text: Gebruik + explanation_link: "#uitleg" + explanation_text: Uitleg + faq_link: "#faqs" + faq_text: FAQs + links_link: "#links" + links_text: Links + +banner: + headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + ios: IRMA voor iOS + ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 + android: IRMA vor Android + android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu + product_shot_src: "/uploads/non-free/screenshot.png" + product_shot_alt: Product Shot + +usage: + id: gebruik + login_headline: Inloggen + login_alt: Login + login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen + die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde + film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + sign_headline: Ondertekenen + sign_alt: Ondertekenen + sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen + relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met + IRMA ondertekenen als arts, als burger of vanuit een andere rol. + trust_headline: Vertrouwen + trust_alt: Vertrouwen + trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch + beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en + echt van jou. + +slogan: + id: start + heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + +explanation: + id: uitleg + getstarted_headline: Zelf aan de slag met IRMA + getstarted_alt: Zelf aan de slag met IRMA + getstarted_content: Iedereen kan de IRMA app gratis downloaden (Android + en iOS) + en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen + en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw + emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen + zichzelf online bekend maken. + tool_headline: IRMA is een middel, geen doel op zich + tool_alt: IRMA is een middel, geen doel op zich + tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch + moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met + IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. + Bijvoorbeeld een film kijken of iets (ver)kopen. + usecases_headline: Wat kan ik er al mee? + usecases_alt: Wat kan ik er al mee? + usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, + bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder + gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun + je zelf een aantal IRMA demo's + uitproberen. + +faq: + id: faqs + headline: Veel gestelde vragen en antwoorden + daarop + item1: + question: Hoe moet ik met IRMA inloggen op een website? + answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar + bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet + op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken + die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende + situaties:
  • Als je de website bekijkt op + je computer of laptop en je drukt op die login knop verschijnt er een QR code. + Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een + knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of + je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben + je ingelogd.
  • Als je de website op je telefoon bekijkt wordt na het + indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin + verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op + OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed + is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.

Het + kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen + hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. + item2: + question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? + answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, + BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. + Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. + Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie + toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties + toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens + laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar + verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens + aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale + (beroeps)groepen. + item3: + question: Kan ik IRMA op een tweede telefoon of tablet zetten? + answer: Jazeker, op ieder (Android + en iOS) + apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. + Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat + kwijt bent, kun je nog met een ander inloggen. + item4: + question: Hoezo is IRMA privacy-vriendelijk en veilig? + answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd + met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde + situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je + soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of + studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend + door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, + waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt + zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen + je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. + Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, + bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: + je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt + wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' + item5: + question: Waar staan mijn IRMA gegevens opgeslagen? + answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in + de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet + ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn + ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken + vanuit de IRMA app aan een website doorgegeven worden. + item6: + question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? + answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze + geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van + hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar + je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. + De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een + waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen + door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. + Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente + ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. + item7: + question: Wat doe ik als ik een nieuwe telefoon koop? + answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw + account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid + om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. + Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens + opnieuw op te halen. Het kost wel een klein beetje tijd. + item8: + question: Wat doe ik als ik mijn telefoon verlies? + answer: De IRMA app op je telefoon is beschermd met een PIN, net als je + app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus + geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een + goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf + echter nog beter beschermen: bij het openen van een IRMA account heb je de + optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun + je via de MijnIRMA + omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de + IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres + toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar + met IRMA zelf in te loggen. Het is verstandig dat te doen. + item9: + question: Ik heb een vraag over IRMA; waar kan ik terecht? + answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, + dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website + je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met + je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over + hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte + een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar + het adres irma@privacybydesign.foundation. + item10: + question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? + answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met + de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken + vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. + De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon + staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. + item11: + question: Wie zit er achter IRMA? + answer: IRMA wordt gemaakt door de stichting Privacy + by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security + onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk + en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting + Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie + Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit + en continuiteit van IRMA gegarandeerd. + item12: + question: Hoezo kan IRMA gratis zijn? + answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die + gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app + opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet + gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in + IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte + moet betaald worden en moet een contract getekend worden, waarbij de uitgever + zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste + persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen + op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de + organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien + geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + item13: + question: IRMA is open source; wat betekent dat? + answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software + staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van + computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een + transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van + leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat + alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. + item14: + question: Ik wil meer informatie over IRMA; waar kan ik terecht? + answer: Het grotere verhaal achter IRMA staat beschreven in een + IRMA Manifest. +

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de + stichting Privacy by Design op een eigen + pagina. + Mensen die de software van IRMA willen bekijken kunnen terecht op een technische + documentatie pagina en op + GitHub. + +footer: + id: links + irma_alt: IRMA logo + irma_headline: Privacy by Design Foundation + irma_content: IRMA wordt gemaakt door de stichting Privacy + by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op + haar eigen website. + doc_headline: Docs + doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische + documentatie. + github_headline: GitHub + github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen + terecht op GitHub. \ No newline at end of file diff --git a/_i18n/en.yml b/_i18n/en.yml new file mode 100644 index 0000000..f16f526 --- /dev/null +++ b/_i18n/en.yml @@ -0,0 +1,232 @@ +nav: + home_link: "/" + home_text: IRMA + usage_link: "#gebruik" + usage_text: Gebruik + explanation_link: "#uitleg" + explanation_text: Uitleg + faq_link: "#faqs" + faq_text: FAQs + links_link: "#links" + links_text: Links + +banner: + headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + ios: IRMA voor iOS + ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 + android: IRMA vor Android + android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu + product_shot_src: "/uploads/non-free/screenshot.png" + product_shot_alt: Product Shot + +usage: + id: gebruik + login_headline: Inloggen + login_alt: Login + login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen + die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde + film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + sign_headline: Ondertekenen + sign_alt: Ondertekenen + sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen + relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met + IRMA ondertekenen als arts, als burger of vanuit een andere rol. + trust_headline: Vertrouwen + trust_alt: Vertrouwen + trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch + beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en + echt van jou. + +slogan: + id: start + heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + +explanation: + id: uitleg + getstarted_headline: Zelf aan de slag met IRMA + getstarted_alt: Zelf aan de slag met IRMA + getstarted_content: Iedereen kan de IRMA app gratis downloaden (Android + en iOS) + en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen + en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw + emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen + zichzelf online bekend maken. + tool_headline: IRMA is een middel, geen doel op zich + tool_alt: IRMA is een middel, geen doel op zich + tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch + moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met + IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. + Bijvoorbeeld een film kijken of iets (ver)kopen. + usecases_headline: Wat kan ik er al mee? + usecases_alt: Wat kan ik er al mee? + usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, + bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder + gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun + je zelf een aantal IRMA demo's + uitproberen. + +faq: + id: faqs + headline: Veel gestelde vragen en antwoorden + daarop + item1: + question: Hoe moet ik met IRMA inloggen op een website? + answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar + bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet + op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken + die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende + situaties:
  • Als je de website bekijkt op + je computer of laptop en je drukt op die login knop verschijnt er een QR code. + Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een + knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of + je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben + je ingelogd.
  • Als je de website op je telefoon bekijkt wordt na het + indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin + verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op + OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed + is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.

Het + kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen + hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. + item2: + question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? + answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, + BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. + Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. + Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie + toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties + toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens + laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar + verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens + aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale + (beroeps)groepen. + item3: + question: Kan ik IRMA op een tweede telefoon of tablet zetten? + answer: Jazeker, op ieder (Android + en iOS) + apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. + Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat + kwijt bent, kun je nog met een ander inloggen. + item4: + question: Hoezo is IRMA privacy-vriendelijk en veilig? + answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd + met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde + situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je + soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of + studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend + door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, + waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt + zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen + je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. + Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, + bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: + je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt + wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' + item5: + question: Waar staan mijn IRMA gegevens opgeslagen? + answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in + de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet + ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn + ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken + vanuit de IRMA app aan een website doorgegeven worden. + item6: + question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? + answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze + geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van + hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar + je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. + De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een + waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen + door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. + Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente + ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. + item7: + question: Wat doe ik als ik een nieuwe telefoon koop? + answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw + account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid + om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. + Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens + opnieuw op te halen. Het kost wel een klein beetje tijd. + item8: + question: Wat doe ik als ik mijn telefoon verlies? + answer: De IRMA app op je telefoon is beschermd met een PIN, net als je + app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus + geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een + goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf + echter nog beter beschermen: bij het openen van een IRMA account heb je de + optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun + je via de MijnIRMA + omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de + IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres + toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar + met IRMA zelf in te loggen. Het is verstandig dat te doen. + item9: + question: Ik heb een vraag over IRMA; waar kan ik terecht? + answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, + dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website + je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met + je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over + hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte + een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar + het adres irma@privacybydesign.foundation. + item10: + question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? + answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met + de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken + vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. + De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon + staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. + item11: + question: Wie zit er achter IRMA? + answer: IRMA wordt gemaakt door de stichting Privacy + by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security + onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk + en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting + Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie + Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit + en continuiteit van IRMA gegarandeerd. + item12: + question: Hoezo kan IRMA gratis zijn? + answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die + gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app + opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet + gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in + IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte + moet betaald worden en moet een contract getekend worden, waarbij de uitgever + zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste + persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen + op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de + organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien + geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + item13: + question: IRMA is open source; wat betekent dat? + answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software + staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van + computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een + transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van + leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat + alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. + item14: + question: Ik wil meer informatie over IRMA; waar kan ik terecht? + answer: Het grotere verhaal achter IRMA staat beschreven in een + IRMA Manifest. +

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de + stichting Privacy by Design op een eigen + pagina. + Mensen die de software van IRMA willen bekijken kunnen terecht op een technische + documentatie pagina en op + GitHub. + +footer: + id: links + irma_alt: IRMA logo + irma_headline: Privacy by Design Foundation + irma_content: IRMA wordt gemaakt door de stichting Privacy + by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op + haar eigen website. + doc_headline: Docs + doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische + documentatie. + github_headline: GitHub + github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen + terecht op GitHub. \ No newline at end of file diff --git a/_i18n/nl.yml b/_i18n/nl.yml new file mode 100644 index 0000000..f16f526 --- /dev/null +++ b/_i18n/nl.yml @@ -0,0 +1,232 @@ +nav: + home_link: "/" + home_text: IRMA + usage_link: "#gebruik" + usage_text: Gebruik + explanation_link: "#uitleg" + explanation_text: Uitleg + faq_link: "#faqs" + faq_text: FAQs + links_link: "#links" + links_text: Links + +banner: + headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + ios: IRMA voor iOS + ios_url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 + android: IRMA vor Android + android_url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu + product_shot_src: "/uploads/non-free/screenshot.png" + product_shot_alt: Product Shot + +usage: + id: gebruik + login_headline: Inloggen + login_alt: Login + login_content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen + die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde + film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + sign_headline: Ondertekenen + sign_alt: Ondertekenen + sign_content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen + relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met + IRMA ondertekenen als arts, als burger of vanuit een andere rol. + trust_headline: Vertrouwen + trust_alt: Vertrouwen + trust_content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch + beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en + echt van jou. + +slogan: + id: start + heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + +explanation: + id: uitleg + getstarted_headline: Zelf aan de slag met IRMA + getstarted_alt: Zelf aan de slag met IRMA + getstarted_content: Iedereen kan de IRMA app gratis downloaden (Android + en iOS) + en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen + en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw + emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen + zichzelf online bekend maken. + tool_headline: IRMA is een middel, geen doel op zich + tool_alt: IRMA is een middel, geen doel op zich + tool_content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch + moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met + IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. + Bijvoorbeeld een film kijken of iets (ver)kopen. + usecases_headline: Wat kan ik er al mee? + usecases_alt: Wat kan ik er al mee? + usecases_content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, + bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder + gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun + je zelf een aantal IRMA demo's + uitproberen. + +faq: + id: faqs + headline: Veel gestelde vragen en antwoorden + daarop + item1: + question: Hoe moet ik met IRMA inloggen op een website? + answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar + bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet + op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken + die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende + situaties:
  • Als je de website bekijkt op + je computer of laptop en je drukt op die login knop verschijnt er een QR code. + Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een + knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of + je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben + je ingelogd.
  • Als je de website op je telefoon bekijkt wordt na het + indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin + verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op + OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed + is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.

Het + kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen + hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. + item2: + question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? + answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, + BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. + Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. + Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie + toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties + toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens + laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar + verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens + aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale + (beroeps)groepen. + item3: + question: Kan ik IRMA op een tweede telefoon of tablet zetten? + answer: Jazeker, op ieder (Android + en iOS) + apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. + Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat + kwijt bent, kun je nog met een ander inloggen. + item4: + question: Hoezo is IRMA privacy-vriendelijk en veilig? + answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd + met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde + situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je + soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of + studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend + door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, + waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt + zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen + je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. + Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, + bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: + je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt + wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' + item5: + question: Waar staan mijn IRMA gegevens opgeslagen? + answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in + de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet + ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn + ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken + vanuit de IRMA app aan een website doorgegeven worden. + item6: + question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? + answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze + geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van + hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar + je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. + De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een + waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen + door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. + Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente + ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. + item7: + question: Wat doe ik als ik een nieuwe telefoon koop? + answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw + account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid + om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. + Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens + opnieuw op te halen. Het kost wel een klein beetje tijd. + item8: + question: Wat doe ik als ik mijn telefoon verlies? + answer: De IRMA app op je telefoon is beschermd met een PIN, net als je + app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus + geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een + goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf + echter nog beter beschermen: bij het openen van een IRMA account heb je de + optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun + je via de MijnIRMA + omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de + IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres + toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar + met IRMA zelf in te loggen. Het is verstandig dat te doen. + item9: + question: Ik heb een vraag over IRMA; waar kan ik terecht? + answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, + dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website + je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met + je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over + hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte + een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar + het adres irma@privacybydesign.foundation. + item10: + question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? + answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met + de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken + vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. + De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon + staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. + item11: + question: Wie zit er achter IRMA? + answer: IRMA wordt gemaakt door de stichting Privacy + by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security + onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk + en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting + Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie + Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit + en continuiteit van IRMA gegarandeerd. + item12: + question: Hoezo kan IRMA gratis zijn? + answer: RMA is gratis voor gebruikers. IRMA is ook gratis voor websites die + gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app + opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet + gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in + IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte + moet betaald worden en moet een contract getekend worden, waarbij de uitgever + zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste + persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen + op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de + organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien + geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + item13: + question: IRMA is open source; wat betekent dat? + answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software + staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van + computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een + transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van + leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat + alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. + item14: + question: Ik wil meer informatie over IRMA; waar kan ik terecht? + answer: Het grotere verhaal achter IRMA staat beschreven in een + IRMA Manifest. +

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de + stichting Privacy by Design op een eigen + pagina. + Mensen die de software van IRMA willen bekijken kunnen terecht op een technische + documentatie pagina en op + GitHub. + +footer: + id: links + irma_alt: IRMA logo + irma_headline: Privacy by Design Foundation + irma_content: IRMA wordt gemaakt door de stichting Privacy + by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op + haar eigen website. + doc_headline: Docs + doc_content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische + documentatie. + github_headline: GitHub + github_content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen + terecht op GitHub. \ No newline at end of file diff --git a/_includes/block-cta-bar.html b/_includes/block-cta-bar.html deleted file mode 100644 index 2ee6cfb..0000000 --- a/_includes/block-cta-bar.html +++ /dev/null @@ -1,15 +0,0 @@ -
-
-
-
-

{{ section.content }}

-
-
-
- - -
-
-
-
-
\ No newline at end of file diff --git a/_includes/block-feature-1.html b/_includes/block-feature-1.html deleted file mode 100644 index 0caab0b..0000000 --- a/_includes/block-feature-1.html +++ /dev/null @@ -1,17 +0,0 @@ -{% if section.media_alignment and section.media_alignment == "Left" %} -{% include block-feature-2.html %} -{% else %} -
-
-
-
-

{{ section.headline }}

-

{{ section.content }}

-
-
- {{ section.media.alt_text }} -
-
-
-
-{% endif %} \ No newline at end of file diff --git a/_includes/block-feature-2.html b/_includes/block-feature-2.html deleted file mode 100644 index 09890e3..0000000 --- a/_includes/block-feature-2.html +++ /dev/null @@ -1,13 +0,0 @@ -
-
-
-
- {{ section.media.alt_text }} -
-
-

{{ section.headline }}

-

{{ section.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-footer-1.html b/_includes/block-footer-1.html deleted file mode 100644 index a7cb876..0000000 --- a/_includes/block-footer-1.html +++ /dev/null @@ -1,5 +0,0 @@ -
-
-

{{ section.content }}

-
-
\ No newline at end of file diff --git a/_includes/block-header-1.html b/_includes/block-header-1.html deleted file mode 100644 index d630cd1..0000000 --- a/_includes/block-header-1.html +++ /dev/null @@ -1,23 +0,0 @@ -
- - - - -
\ No newline at end of file diff --git a/_includes/block-header-2.html b/_includes/block-header-2.html deleted file mode 100644 index e156330..0000000 --- a/_includes/block-header-2.html +++ /dev/null @@ -1,18 +0,0 @@ -
- - - - - -
\ No newline at end of file diff --git a/_includes/block-header-3.html b/_includes/block-header-3.html deleted file mode 100644 index 3b8b47d..0000000 --- a/_includes/block-header-3.html +++ /dev/null @@ -1,9 +0,0 @@ -
- - - -
\ No newline at end of file diff --git a/_includes/block-hero-1.html b/_includes/block-hero-1.html deleted file mode 100644 index 6d4de00..0000000 --- a/_includes/block-hero-1.html +++ /dev/null @@ -1,5 +0,0 @@ -
-
-

{{ section.heading }}

-
-
\ No newline at end of file diff --git a/_includes/block-hero-2.html b/_includes/block-hero-2.html deleted file mode 100644 index f758918..0000000 --- a/_includes/block-hero-2.html +++ /dev/null @@ -1,20 +0,0 @@ -
-
-
-
-
-

{{ section.headline }}

-

{{ section.content }}

- {% if section.cta and section.cta.enabled == true %} - {{ section.cta.button_text }} - {% endif %} -
-
- {{ section.image.alt_text }} -
-
-
-
\ No newline at end of file diff --git a/_includes/block-irma-1.html b/_includes/block-irma-1.html deleted file mode 100644 index c28fff6..0000000 --- a/_includes/block-irma-1.html +++ /dev/null @@ -1,6 +0,0 @@ -
-
-
-

{{ section.heading }}

-
-
\ No newline at end of file diff --git a/_includes/block-faq-1.html b/_includes/block-irma-faq.html similarity index 81% rename from _includes/block-faq-1.html rename to _includes/block-irma-faq.html index 7dc796e..73583fd 100644 --- a/_includes/block-faq-1.html +++ b/_includes/block-irma-faq.html @@ -1,13 +1,13 @@
-
+
-

{{ section.headline }}

+

{% t section.headline %}

{% for faq_item in section.faq_items %} - +
-

{{ faq_item.answer }}

+

{% t faq_item.answer %}

{% endfor %}
diff --git a/_includes/block-irma-footer-2.html b/_includes/block-irma-footer-2.html deleted file mode 100644 index 2e59b32..0000000 --- a/_includes/block-irma-footer-2.html +++ /dev/null @@ -1,25 +0,0 @@ - \ No newline at end of file diff --git a/_includes/block-irma-footer.html b/_includes/block-irma-footer.html new file mode 100644 index 0000000..83582d4 --- /dev/null +++ b/_includes/block-irma-footer.html @@ -0,0 +1,40 @@ + \ No newline at end of file diff --git a/_includes/block-irma-header-1.html b/_includes/block-irma-header.html similarity index 53% rename from _includes/block-irma-header-1.html rename to _includes/block-irma-header.html index bafd66e..dcd3607 100644 --- a/_includes/block-irma-header-1.html +++ b/_includes/block-irma-header.html @@ -1,16 +1,13 @@
diff --git a/_includes/block-irma-hero-1.html b/_includes/block-irma-hero-1.html new file mode 100644 index 0000000..7f8770d --- /dev/null +++ b/_includes/block-irma-hero-1.html @@ -0,0 +1,6 @@ +
+
+
+

{% t section.heading %}

+
+
\ No newline at end of file diff --git a/_includes/block-irma-2.html b/_includes/block-irma-hero-2.html similarity index 56% rename from _includes/block-irma-2.html rename to _includes/block-irma-hero-2.html index b303267..35686be 100644 --- a/_includes/block-irma-2.html +++ b/_includes/block-irma-hero-2.html @@ -1,21 +1,21 @@
-

{{ section.headline }}

+

{% t section.headline %}

{{ section.content }}

{% if section.ctaiOS and section.ctaiOS.enabled == true %} - + {% endif %} {% if section.ctaAndroid and section.ctaAndroid.enabled == true %} - + {% endif %}
- {{ section.image.alt_text }} + {% t section.image.alt_text %}
diff --git a/_includes/block-irma-three-column-1.html b/_includes/block-irma-three-column-1.html deleted file mode 100644 index c7baaba..0000000 --- a/_includes/block-irma-three-column-1.html +++ /dev/null @@ -1,36 +0,0 @@ -
-
-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-
- {{ section.image_2.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
- {{ section.image_3.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_3.headline }}

-

{{ section.col_3.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-irma-three-column.html b/_includes/block-irma-three-column.html new file mode 100644 index 0000000..13bd0e2 --- /dev/null +++ b/_includes/block-irma-three-column.html @@ -0,0 +1,28 @@ +
+
+
+
+
+
+ {% t section.image_1.alt %} +
+

{% t section.col_1.headline %}

+

{% t section.col_1.content %}

+
+
+
+ {% t section.image_2.alt %} +
+

{% t section.col_2.headline %}

+

{% t section.col_2.content %}

+
+
+
+ {% t section.image_3.alt %} +
+

{% t section.col_3.headline %}

+

{% t section.col_3.content %}

+
+
+
+
\ No newline at end of file diff --git a/_includes/block-media-1.html b/_includes/block-media-1.html deleted file mode 100644 index 90e156e..0000000 --- a/_includes/block-media-1.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-
- {{ section.caption }} - {% if section.caption %} -
{{ section.caption }}
- {% endif %} -
-
-
\ No newline at end of file diff --git a/_includes/block-media-2.html b/_includes/block-media-2.html deleted file mode 100644 index 2448bf8..0000000 --- a/_includes/block-media-2.html +++ /dev/null @@ -1,22 +0,0 @@ -
-
-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-
-
-
- {{ section.image_2.caption }} - {% if section.image_2.caption %} -
{{ section.image_2.caption }}
- {% endif %} -
-
-
-
-
\ No newline at end of file diff --git a/_includes/block-one-column-1.html b/_includes/block-one-column-1.html deleted file mode 100644 index 8ad2e37..0000000 --- a/_includes/block-one-column-1.html +++ /dev/null @@ -1,10 +0,0 @@ -
-
-
-
-

{{ section.headline }}

-

{{ section.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-text-1.html b/_includes/block-text-1.html deleted file mode 100644 index f48e0e2..0000000 --- a/_includes/block-text-1.html +++ /dev/null @@ -1,12 +0,0 @@ -
-
-
-
-

{{ section.headline }}

-
-
- {{ section.content }} -
-
-
-
\ No newline at end of file diff --git a/_includes/block-three-column-1.html b/_includes/block-three-column-1.html deleted file mode 100644 index b41e0ac..0000000 --- a/_includes/block-three-column-1.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-
-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-
- {{ section.image_2.caption }} - {% if section.image_2.caption %} -
{{ section.image_2.caption }}
- {% endif %} -
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
- {{ section.image_3.caption }} - {% if section.image_3.caption %} -
{{ section.image_3.caption }}
- {% endif %} -
-

{{ section.col_3.headline }}

-

{{ section.col_3.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-three-column-irma-1.html b/_includes/block-three-column-irma-1.html deleted file mode 100644 index e0ee2f5..0000000 --- a/_includes/block-three-column-irma-1.html +++ /dev/null @@ -1,37 +0,0 @@ -
-
-

{{ section.heading }}

-
-
-
- {{ section.image_1.caption }} - {% if section.image_1.caption %} -
{{ section.image_1.caption }}
- {% endif %} -
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-
- {{ section.image_2.caption }} - {% if section.image_2.caption %} -
{{ section.image_2.caption }}
- {% endif %} -
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
- {{ section.image_3.caption }} - {% if section.image_3.caption %} -
{{ section.image_3.caption }}
- {% endif %} -
-

{{ section.col_3.headline }}

-

{{ section.col_3.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/block-two-column-1.html b/_includes/block-two-column-1.html deleted file mode 100644 index b7df4af..0000000 --- a/_includes/block-two-column-1.html +++ /dev/null @@ -1,14 +0,0 @@ -
-
-
-
-

{{ section.col_1.headline }}

-

{{ section.col_1.content }}

-
-
-

{{ section.col_2.headline }}

-

{{ section.col_2.content }}

-
-
-
-
\ No newline at end of file diff --git a/_includes/head.html b/_includes/head.html index 51d301e..16bcdb8 100644 --- a/_includes/head.html +++ b/_includes/head.html @@ -5,13 +5,12 @@ - {% if page.title %}{{ page.title }}{% endif %} - - + + \ No newline at end of file diff --git a/_includes/svg.html b/_includes/svg.html index 11afeac..f53bedd 100644 --- a/_includes/svg.html +++ b/_includes/svg.html @@ -1,5 +1,5 @@ {% if include.id %} - + {% endif %} \ No newline at end of file diff --git a/css/irma.css b/css/irma.css index aa79370..742a7a5 100644 --- a/css/irma.css +++ b/css/irma.css @@ -1,3 +1,18 @@ +/* Language elements */ + +#language { + font-size: 2em; +} + +#language ol { + display: flex; +} + +#language li { + margin-right: 0.5em; + list-style-type: none; +} + /* Scrolling to elements*/ html { diff --git a/index.md b/index.md index 10a2096..bc052c8 100644 --- a/index.md +++ b/index.md @@ -1,249 +1,137 @@ --- +languages: +- nl +- en +- de layout: blocks title: IRMA -lang: en -lang-ref: index date: 2017-11-22T23:00:00.000+00:00 page_sections: - template: navigation-header - block: irma-header-1 + block: irma-header logo: "/uploads/non-free/irma_logo@1x.png" menu: "/uploads/non-free/navigation-menu.png" url: "/" navigation: - - link: "/" - link_text: IRMA - - link: "#gebruik" - link_text: Gebruik - - link: "#uitleg" - link_text: Uitleg - - link: "#faqs" - link_text: FAQs - - link: "#links" - link_text: Links + - link: nav.home_link + link_text: nav.home_text + - link: nav.usage_link + link_text: nav.usage_text + - link: nav.explanation_link + link_text: nav.explanation_text + - link: nav.faq_link + link_text: nav.faq_text + - link: nav.links_link + link_text: nav.links_text - template: irma-banner - block: irma-2 - headline: Kies IRMA.
Zet een digitaal paspoort op je eigen mobiel. + block: irma-hero-2 + headline: banner.headline ctaiOS: enabled: true - url: https://apps.apple.com/nl/app/irma-authenticatie/id1294092994 - button_text: IRMA voor iOS + url: banner.ios_url + button_text: banner.ios ctaAndroid: enabled: true - url: https://play.google.com/store/apps/details?id=org.irmacard.cardemu - button_text: IRMA voor Android + url: banner.android_url + button_text: banner.android image: - image: "/uploads/non-free/screenshot.png" - alt_text: Product Shot + image: banner.product_shot_src + alt_text: banner.product_shot_alt background_image: "/uploads/non-free/irma-2-bg.png" - template: 3-column-text - block: three-column-1 - id: gebruik + block: irma-three-column + id: usage.id image_1: image: "/uploads/non-free/login.png" + alt: usage.login_alt image_2: image: "/uploads/non-free/signature.png" + alt: usage.sign_alt image_3: image: "/uploads/non-free/secure.png" + alt: usage.trust_alt col_1: - headline: Inloggen - content: Met IRMA kun je makkelijk inloggen en jezelf bekend maken. Je laat alleen - die kenmerken van jezelf zien die relevant zijn. Bijvoorbeeld om een bepaalde - film te kijken, bewijs je dat je ouder dan 16 bent, en verder niets. + headline: usage.login_headline + content: usage.login_content col_2: - headline: Ondertekenen - content: Ook kun je met IRMA documenten digitaal ondertekenen. Je gebruikt alleen - relevante kenmerken van jezelf, in een soort digitaal stempel. Zo kun je met - IRMA ondertekenen als arts, als burger of vanuit een andere rol. + headline: usage.sign_headline + content: usage.sign_content col_3: - headline: Vertrouwen - content: Gegevens in een IRMA app komen uit betrouwbare bronnen en zijn cryptografisch - beschermd. De kenmerken die jij met IRMA bekend maakt zijn daarmee echt, en - echt van jou. + headline: usage.trust_headline + content: usage.trust_content - template: slogan - block: irma-1 - id: start - heading: Met IRMA heb je in de hand wat er met jouw gegevens gebeurt. + block: irma-hero-1 + id: slogan.id + heading: slogan.heading - template: 3-column-text - block: three-column-1 - id: uitleg + block: irma-three-column + id: explanation.id image_1: image: "/uploads/non-free/getstarted.png" + alt: explanation.getstarted_alt image_2: image: "/uploads/non-free/tool.png" + alt: explanation.tool_alt image_3: image: "/uploads/non-free/usecases.png" + alt: explanation.usecases_alt col_1: - headline: Zelf aan de slag met IRMA - content: Iedereen kan de IRMA app gratis downloaden (Android - en iOS) - en vullen met eigen gegevens. Bijvoorbeeld bij de gemeente kun je inlogggen - en basisgegevens (naam, adres, etc.) over jezelf ophalen. Maar ook kun je jouw - emailadres of 06-nummer in je IRMA app opslaan. Met zulke gegevens kan iedereen - zichzelf online bekend maken. + headline: explanation.getstarted_headline + content: explanation.getstarted_content col_2: - headline: IRMA is een middel, geen doel op zich - content: Voor iedereen is het gebruik van allerlei wachtwoorden veel gedoe. Toch - moeten websites weten met wie ze te maken hebben. IRMA geeft zekerheid. Met - IRMA kun je op een makkelijke en veilige manier online doen wat je wil doen. - Bijvoorbeeld een film kijken of iets (ver)kopen. + headline: explanation.tool_headline + content: explanation.tool_content col_3: - headline: Wat kan ik er al mee? - content: Er komen steeds meer websites waar je met IRMA in kan loggen. Artsen, - bijvoorbeeld, kunnen via IRMA bij medische dossiers op de website helder. Vooral bij gemeenten en in de zorg wordt aan verder - gebruik van IRMA gewerkt. Om een indruk te krijgen van de mogelijkheden kun - je zelf een aantal IRMA demo's - uitproberen. + headline: explanation.usecases_headline + content: explanation.usecases_content - template: faq - block: faq-1 - id: faqs - headline: Veel gestelde vragen en antwoorden - daarop + block: irma-faq + id: faq.id + headline: faq.headline faq_items: - - question: Hoe moet ik met IRMA inloggen op een website? - answer: Websites waar je met IRMA in kunt loggen hebben een knop daarvoor, waar - bijvoorbeeld op staat Log in met IRMA. Als je de IRMA app nog niet - op je telefoon hebt zul je die eerst moeten installeren en vullen met de kenmerken - die je nodig hebt.

Als je de IRMA app al wel hebt, zijn er twee verschillende - situaties:
  • Als je de website bekijkt op - je computer of laptop en je drukt op die login knop verschijnt er een QR code. - Je opent dan de IRMA app op je telefoon met je PIN. Onderaan in de app zit een - knopje waarmee je de QR code kunt scannen. In de app krijg je dan de vraag of - je kenmerken waarom de website vraagt wil vrijgeven. Als je op OK klikt, ben - je ingelogd.
  • Als je de website op je telefoon bekijkt wordt na het - indrukken van de login knop automatisch overgeschakeld naar de IRMA app. Daarin - verschijnt de vraag of je de gevraagde kenmerken wil vrijgeven. Nadat je op - OK hebt gedrukt ga je terug naar de website en ben je ingelogd. Als het goed - is gaat je telefoon automatisch terug, maar soms moet je dat met de hand doen.

Het - kan zijn dat de website vraagt om kenmerken die je nog niet in je IRMA app geladen - hebt. Dan moet je dat eerst nog even doen voordat je in kunt loggen. - - question: Welke kenmerken kan ik nu (en later) in de IRMA app zetten? - answer: Vanuit gemeenten kun je zelf kenmerken zoals je naam, adres, geboortedatum, - BSN in je IRMA app zetten, maar ook of je bijvoorbeeld ouder dan 18 of 65 bent. - Daarnaast kun je een of meer email adressen en mobiele telefoonnummers, na controle, toevoegen. - Studenten en medewerkers in het (hoger) onderwijs kunnen ook hun registratie - toevoegen. Medewerkers in de zorg kunnen zogenaamde BIG en AGB registraties - toevoegen. Ook vanuit sociale media (LinkedIn, Twitter, Facebook) kun je gegevens - laden. Hiermee kun je in veel situaties voldoende van jezelf bekend maken.

Naar - verwachting zullen de komende tijd nog veel andere bronnen van persoonsgegevens - aan IRMA toegevoegd worden, voor gebruikers in het algemeen en ook voor speciale - (beroeps)groepen. - - question: Kan ik IRMA op een tweede telefoon of tablet zetten? - answer: Jazeker, op ieder (Android - en iOS) - apparaat kun je een apart IRMA account openen en vullen met persoonskenmerken. - Het is misschien wel verstandig omdat te doen, want als je dan het ene apparaat - kwijt bent, kun je nog met een ander inloggen. - - question: Hoezo is IRMA privacy-vriendelijk en veilig? - answer: 'Persoonskenmerken van IRMA staan alleen in de IRMA app en zijn beschermd - met een PIN. Je laat alleen die gegevens van jezelf zien die in een bepaalde - situatie relevant en nodig zijn. Bijvoorbeeld, om korting te krijgen moet je - soms bewijzen dat je student bent; dat kun je met IRMA doen zonder je naam of - studie te tonen.

Jouw kenmerken in de IRMA app zijn digitaal ondertekend - door de bron waar de gegevens vandaan komen. Daardoor kan een website of winkel, - waar je jezelf bekend maakt, cryptografisch controleren dat de gegevens echt - zijn. Deze uitwisseling van persoonskenmerken vindt rechtstreeks plaats, tussen - je telefoon en deze website. Niemand anders kan zien dat jij je daar bekendmaakt. - Dit is heel anders dan bij een (privacy-onvriendelijke) login via Facebook, - bijvoorbeeld bij een online winkel. Dan vindt de uitwisseling anders plaats: - je moet eerst bij Facebook inloggen, waarna Facebook aan de webwinkel vertelt - wie je bent. Facebook kan zo profielen opbouwen van wie waar inlogt.' - - question: Waar staan mijn IRMA gegevens opgeslagen? - answer: De kenmerken van jezelf die je in de IRMA app verzamelt staan alleen in - de app zelf en worden door IRMA nergens anders opgeslagen. Ze staan dus niet - ook nog ergens in een cloud. Als je jouw kenmerken uit de app verwijdert zijn - ze ook echt weg. Jij geeft zelf steeds expliciet toestemming voordat deze kenmerken - vanuit de IRMA app aan een website doorgegeven worden. - - question: Hoe lang zijn kenmerken in IRMA geldig en hoe kan ik ze verversen? - answer: In de IRMA app kun je op het kaartje met je kenmerken zien hoe lang ze - geldig zijn. Die geldigheidsduur hangt af van het soort gegevens, namelijk van - hoe veranderlijk ze zijn. Je naam en geboortedatum zijn vijf jaar geldig, maar - je adres slechts een jaar. De uitgever (bron) van kenmerken bepaalt de geldigheidsduur. - De geldigheid van IRMA kenmerken kan dus verlopen. De app geeft je daar een - waarschuwing voor. Je kunt je kenmerken altijd, ook zonder waarschuwing, verversen - door ze opnieuw op te halen bij de bron, net zo als je de eerste keer doet. - Bijvoorbeeld, na je 18e verjaardag kun je opnieuw je gegevens bij je gemeente - ophalen en heb je als nieuw kenmerk dat je ouder dan 18 bent. - - question: Wat doe ik als ik een nieuwe telefoon koop? - answer: Op een nieuwe telefoon kun je de IRMA app opnieuw installeren, een nieuw - account openen, en je kenmerken opnieuw ophalen. Er is op dit moment geen mogelijkheid - om je kenmerken van je oude telefoon over te zetten naar je nieuwe telefoon. - Daar wordt wel aan gewerkt. Gelukkig is het niet heel moeilijk om je gegevens - opnieuw op te halen. Het kost wel een klein beetje tijd. - - question: Wat doe ik als ik mijn telefoon verlies? - answer: De IRMA app op je telefoon is beschermd met een PIN, net als je - app voor internetbankieren. Wanneer je je telefoon verliest kan een ander dus - geen gebruik maken van je IRMA app en zich als jou voordoen. Als je dus een - goede PIN gekozen hebt, hoef je je geen zorgen te maken.

Je kunt jezelf - echter nog beter beschermen: bij het openen van een IRMA account heb je de - optie gekregen om een email adres toe te voegen. Als je dat gedaan hebt, kun - je via de MijnIRMA - omgeving je IRMA account blokkeren. Dan kan er echt helemaal niks meer met de - IRMA app op je oude, verloren telefoon gebeuren. Als je nog geen email adres - toegevoegd hebt in MijnIRMA kun je dat alsnog doen, door daar - met IRMA zelf in te loggen. Het is verstandig dat te doen. - - question: Ik heb een vraag over IRMA; waar kan ik terecht? - answer: Als je een vraag hebt over inloggen met IRMA bij webwinkel De Hippe Kip, - dan kun je die vraag het beste stellen aan De Hippe Kip zelf. Ook als die website - je vraagt IRMA te installeren en dat lukt niet, dan kun je het beste daar met - je vragen naar toegaan. Meestal staat er op zulke webpagina's informatie over - hoe je vragen kunt stellen en contact op kunt nemen.

Als je tenslotte - een vraag hebt over het systeem IRMA zelf, dan kun je een berichtje sturen naar - het adres irma@privacybydesign.foundation. - - question: Wat gebeurt er met mijn gegevens als ik met IRMA inlog? - answer: Als je inlogt bij een website maakt je telefoon rechtstreeks contact met - de website. Nadat jij toestemming gegeven hebt worden de gevraagde kenmerken - vanuit jouw telefoon direct aan de website getoond. Daar zit niemand tussen. - De IRMA organistie kan jouw kenmerken niet zien — omdat ze alleen op jouw telefoon - staan — en kan ook niet zien welke attributen je aan welke website vrijgeeft. - - question: Wie zit er achter IRMA? - answer: IRMA wordt gemaakt door de stichting Privacy - by Design. Deze stichting is in 2016 voortgekomen uit de Digital Security - onderzoeksgroep van de Radboud Universiteit in Nijmegen. De stichting is onafhankelijk - en heeft geen doelstelling om winst te maken. Sinds 2019 heeft de stichting - Privacy by Design een strategische samenwerking met de stichting Internet Domeinregistratie - Nederland (SIDN). Mede door deze samenwerking wordt de stabiliteit - en continuiteit van IRMA gegarandeerd. - - question: Hoezo kan IRMA gratis zijn? - answer: IRMA is gratis voor gebruikers. IRMA is ook gratis voor websites die - gebruikers via IRMA laten inloggen: iedereen kan kenmerken uit een IRMA app - opvragen en bekijken, als de gebruiker toestemming geeft. Maar het is niet - gratis om kenmerken uit te geven. Niet iedereen kan zomaar kenmerken in - IRMA apps zetten; dat zou snel een rommeltje worden.

Voor die uitgifte - moet betaald worden en moet een contract getekend worden, waarbij de uitgever - zich ertoe verplicht om alleen juiste gegevens in de IRMA app van de juiste - persoon te zetten.

Ook kan een contract afgesloten worden voor support garanties (een "SLA") via SIDN. Omdat IRMA een decentraal systeem is, waarbij gegevens alleen - op telefoons staan en rechtstreeks met websites uitgewisseld worden, heeft de - organisatie achter IRMA relatief weinig te doen. Omdat die organisatie bovendien - geen winstoogmerk heeft is IRMA als geheel een goedkoop systeem. + - question: faq.item1.question + answer: faq.item1.answer + - question: faq.item2.question + answer: faq.item2.answer + - question: faq.item3.question + answer: faq.item3.answer + - question: faq.item4.question + answer: faq.item4.answer + - question: faq.item5.question + answer: faq.item5.answer + - question: faq.item6.question + answer: faq.item6.answer + - question: faq.item7.question + answer: faq.item7.answer + - question: faq.item8.question + answer: faq.item8.answer + - question: faq.item9.question + answer: faq.item9.answer + - question: faq.item10.question + answer: faq.item10.answer + - question: faq.item11.question + answer: faq.item11.answer + - question: faq.item12.question + answer: faq.item12.answer + - question: faq.item13.question + answer: faq.item13.answer + - question: faq.item14.question + answer: faq.item14.answer - - question: IRMA is open source; wat betekent dat? - answer: De software van IRMA is open source. Dat betekent dat de manier waarop IRMA werkt door iedereen bekeken kan worden: de software - staat gewoon online, namelijk op GitHub. Natuurlijk moet je wel wat van - computerprogramma's weten om dit echt te kunnen begrijpen, maar het principe is belangrijk: IRMA kent geen geheimen en werkt op een - transparante manier. Dit draagt bij aan het vertrouwen in IRMA. Er zijn daarom met IRMA geen discussies over verborgen achterdoortjes van - leveranciers met een eigen agenda, zoals bijvoorbeeld met 5G telecommunicatie. De stichting Privacy by Design achter IRMA vindt dat - alle software die gebruikt wordt in infrastructuur met een publieke rol open source moet zijn. - - - question: Ik wil meer informatie over IRMA; waar kan ik terecht? - answer: Het grotere verhaal achter IRMA staat beschreven in een IRMA Manifest.

Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op een eigen pagina. Mensen die de software van IRMA willen bekijken kunnen terecht op een technische documentatie pagina en op GitHub. - -- template: irma-footer-2 - block: irma-footer-2 - id: links +- template: irma-footer + block: irma-footer + id: footer.id image_1: image: "/uploads/non-free/irma_logo@1x.png" + alt: footer.irma_alt col_2: - headline: Privacy by Design Foundation - content: IRMA wordt gemaakt door de stichting Privacy - by Design. Uitgebreidere uitleg over de werking van IRMA wordt gegeven door de stichting Privacy by Design op haar eigen website. + headline: footer.irma_headline + content: footer.irma_content col_3: - headline: Docs - content: Ontwikkelaars die met IRMA willen werken kunnen terecht op de technische documentatie. + headline: footer.doc_headline + content: footer.doc_content col_4: - headline: GitHub - content: Mensen die de software van IRMA willen bekijken of willen bijdragen aan IRMA kunnen terecht op GitHub. - + headline: footer.github_headline + content: footer.github_content --- diff --git a/vendor/bundle/ruby/2.3.0/bin/jekyll b/vendor/bundle/ruby/2.3.0/bin/jekyll deleted file mode 100755 index 80c4bef..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/jekyll +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 3fc2e03..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/kramdown +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 17b391b..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/listen +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 93c899f..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/rougify +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index aa92b59..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/safe_yaml +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 2fdd68c..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/sass +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 0ae7e59..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/sass-convert +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100755 index 02d7dbe..0000000 --- a/vendor/bundle/ruby/2.3.0/bin/scss +++ /dev/null @@ -1,22 +0,0 @@ -#!/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 deleted file mode 100644 index 3e53ea0e40340e58428b322d4535e8d50eb1733d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 103936 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 E03;L6D*ylh 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 deleted file mode 100644 index d5616ad5725f946628b99e1df91f84c2c52f1730..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 7168 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 diff --git a/vendor/bundle/ruby/2.3.0/cache/ffi-1.9.25.gem b/vendor/bundle/ruby/2.3.0/cache/ffi-1.9.25.gem deleted file mode 100644 index 0016be0fc34e20d94d8db39db0c54f7e53291616..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 867840 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

`Ywf>m?JWd}?tNzvwdZi$_-&8G^;@N9*? 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­&7bzM$%YG%@>&ihk4 zakT?c!|n0yC6L>+FnFpYhj%A|a8ub{(gHhrlm>m6+>h<0oXkTls@dE2#TA%~CDo%- z@8u``i=MxGNH3ql5!QW`VKFmT0->R12n+3{TS;`Zd8c zID5Z}5AX96?vy{d=F-bS>1t$Rl7$6Ow}zoiobwvP%FVSp0vf_)o0wwOdzSyAEpE*iEoHutXBl}$}CL@_}hBf>RhFz&NEhl16{D76mOXcL)2Hx4h35LB2fhd8SQM@=9!T~HyU zzPR-dP}ArWTNhqIo1xOqN(h5l;AH5QnwsO($Q973l4ghW4Mc^K&Bid+2tI^bE4G;Q z8S`24HOGv=!^wsT!Xl2^sMaZ<&Z4MG+Ugz3^evOi;fJKiWvOI&6>M`s-L@A~hm2Xp zAZb0xWS}n7=jmZXh}ZgJ8=sX+&)c)t6Z>T@@qDF!i3!~I4FnGTa|Vxc0glGWM(TRS zZ5VHNcC|yB*zFMd8V^BJY(-1PD~9v8_t3$`050zApYComl%LdD)%af&@wt7tx3zze z^T-hbHh0~*B-XuNHS}v97$hz3{er1u!3QSTDD(-}fRWI#r}D9FW8h&0e&u6P^MH>%0(=}OH~6SHq??P_7W`}a>0cH?3!oQ;l1*U_UZPWgM)kJN2>LNi zxDI9T{nehD^}v+wInOm+rT3=9p<>oZ?+Ky&o>#a2dSjx~_GvOg7Y`y?6A zEstD7w1ID38Qy42X`?iy$5aLO!*ul3W+be|F+}TLVoNR1IA3lSf=qEnwyN$M4tc|m zpa^*a7MX}f;&}-{Y0Df3ma{ zx;N`oAJ4))VPaAi4> zowv6IDG-L{`yF;h=>A=duu}8LlBpY7*=4j156tJ4W?GzUr9$@;K>!{foHj$t64FG4(wLWt+BYptLwCE0V zQkl5LPCpm9XaY~+ftb|kCo;FgPaY25$?5U-E}Uh?&O@^#@OdWf73I2N%`2Dzn(Ri} zZzRKEIt;yU`!b}bPsLZ()yE$+=nhE8>ojp*vnGWT<_b!OSEz_lj%1WF1Pqp@uBY-G zi_fuSFE-w~Dyqb%eDgL-t`_O~#(z{$O0bWXHuRS2iTlRVtdTYIVPv`uopaO_1X_e^ zWO$dLxh6XC!!Q{nlvW9~#a6;;GpzH6$$mtj%~>v9Y2JLFQw3R8fPI3WnO|Yc(XW%F zf`&#(ML8JJc7Qdj#yvr7^*>E(2U ze%7?8GKJO>bncbu+=l`{KU2!Xd-+fr{3Ib`AeyJ$4)MN#6tv45CI>|DWF&trbjy5) zU|IoEj`lO(zM5MT)$|q zO1DauPsJL3sBxWsR~)jKaZ7h=l#BN%Qna|NL&R6+W*E3BP~(qnIkgY+6kGPu2Qv+Q z9f@H^PeVnjFkm?_;14XY2i^2+^|(4xu&URuC`yxj=!@~XYMxeXw_KsdESB)C7TU`s z+CW**@Br_FjFI+7ovSfAnTyFWIIlnwZpha;<~Cy1rir{3AvAl#!Ux*p9dq&xdz7YA z@U+}nj9;wNUPI@lfMACn^!nt~ElpC~G`nxGYVaS*U0a4WFj%^cmTD>Xe7A@-4+X9ZD0 zF8_hqZfJxbwnC6hV;{>h9_(y~qCedEOr$rAg(8V(jFR(sI1JnM1vVN*UT7N`66d@z z)FatAlxm?OVOJJ;xtf>qvdqka_|IBp$L(kpj!nLsbD)MqD?aX+q%CH-Q;2jg$EUqtj0fT{;E-(vEX4sfqmyj^QUlccAn=BW zEbJ%U6uA2=D_H~ppuXh^9^1vFOVEh&4_%qeR+56G&rXkcX^7NKA=?$a00f4x0NPU< z6kEF7qZ-KmrXIuANQPC0rLQkWTXc_4x0YtX$o_!Wc>Q$9-i%JDfnQ)3<3Y>4u}Lo~ ztqvu|ZLxpgs4$BYx)8#vw_88#HWYoBI!t~WK07)VH#8y(iGxjcA{O<%4O}r1PP6Qd z2+7VJM!7C>KcG<64&x{_2ADDFE68n(DMB)gffS`OZBgW2pHc$LgrhJ0xZCbPA7X=I z%KoFaJ@VNcjuXl>-sjtlPBy0_N|BER@?_?1(R8@zazEoY&?x1i8V_tf6gV(O$<-ZO zeCTV*WeGH!WRlyO64ufT;k7(pjbqBg*s|y-yBxkZ`NjiU7~sHgmN0cMyWi4qdhs2l zM+qhdvAU=&p7E851c=Rzv+-w>phss&ADm7GcVH29VhSVN^WLm`$P37gE{7f~DwM@U z`J@a*(GtjY91O1y24bTrCDX3$fC08oaZKvawD zAOm9V>fOIcOO+)LxQ$8{+?zzU$0avMo^0nX(J&6gMMINrg+38T3%I;!^5bkdmw5Xg z>#mFP3&J0v)*A_sY%x_23P_aCiYsSxSW;=y7}W1xhxpQw2-I!(wuLe7Cs#4y29c`= zCSM=%)|FW2pu4dk;lABE*lVaXJwcdyg-FbZR{ny->{vi9rrdoUr*2M4Ba_!Lq&?A6b#EsSqb;}lMyk%bAkBES=y;D3UB z<1f|TGZdN*Bys};6Et1ZafmlP-WZ|x5Az?p?1s-|ipYbCrsy`IdAv$SpGn51*fb7M zgsYN#E2y-u=@5X0St6S*3OQnut6l2vx6}*==4i`>5`P1_4X2-2z60yB z0bGUFXqccN7l4xyVUmLBcXA;v=w*~Yx{9D=K9#VCNpy4}p*xc(=bp6h>4;GzM|;CN zm`P9HNpY%hmXxT3u{p-cuRR{A?I3%~rZ)`FR0YcA#5Ir%iZ-C^Afw$V`UUP6ZBCTQase9REMGGt%ip^YaH_N7mU~^DF#j?w=NOH-hNiLR% zMtLc9uGHaVG|j9-2b%4KBxyn%{)fa`y)iyWP@!?ewV0;a%fm5~`T8sLg+GQreZuXMpr)p}x z5;F3Hs87Xo>R3*x6I?WTM@NNgT(rt|aUV(*wv&2}iWYgoGEZ6P&syrwTx|b9@EklM zN7^35qM4E0oK9SNYjF*HP3)kITZuE<<{^r;l|kR>`ZH6+b#vMsoQ*Garbeb_>sv#b zHQF)Lp{TM+ODWzVQs*%59I>z|{vrkGrtEF6|88jCP4Q2m>9iL|!xHz3`?{)Vx6N{- z+k4*Y&)^M@a5$W`7^Q~`5SBRVaAS5q(8yS7TgknyQ!X%_xI&^MGruu`3wdR19Bq-( zgA#DeuzLl$GOa2?ieqDp^K8j9D~3^*!WL*!pG1QpJy(1xcTQmu$9Q}O7Fbb>_Ozd8 zK|2cgZJGN~kIDJD4g*eB!sE)4CIn7io?S4!0W8P|!U}vu>EW?o+TV$eE)bPR9SUUQ zli#F>gk9m84Yh+0k3)If4vYhqIq!?4tHL}1bS11}KnJ-*LHUDL8qNmQ02O|abA_^J zp7Tod9{SepDcJ7?p{dAW2Zd}I`@>ogMc`GOJ54pnn#G(zi2W&Na|k-B@MrVyIkz2d z()2P*yUB<`44spJcN*ii2u~)VVgHa0=K-6+D;+Yv!r;uENMAy7lnE*ySxnOuh6)rL zePwHB=8}7$dZrxU&4dyEQ#n-dCKuhH^B1{;xHXZ#5COrt@iIcy`gHgIyVyNLLt<14 zV2h=nhVI#vZioHbC7x%P!jVbWUb4lkM>yXBY1nm9P;Fn0<(or|+&K%JR;P@o&&JTn ztVXafWEUUteXBu|^H>I!Rf?9XE8s0K^TQaosP5nb4;_(IJLpX6VQD?%$`?x9V70Y% zo{DaisTwofRL%JpFq7EoB(|J~*wqHNU?f(U1AfQTlPmJ@8W^_eK5k8R@-ezWQ^$`% zYay@oeI}FJ;1q%xr*?hADf$V~&3e>BA6M9JZ9*J~n;gGeuu~13gNk!9r(n&tRx>@Q zA=856Q*0Tz40n;w@Ra&zE1+%*{|n9Ck=~I7TZFX1W>Ig0XG=0xtZo@yng{yjKVXo-nsBN7uvWNho(8x`wTxg-_=xeS( zd1*|r<}FnVE)vW)#kzcM{lp70=}u~BfoULjAz)qV@6}5&M01m#kx*)SDFd(Oh*eRW zjB`OgnuYGBS~B(NHs^JfTMd!M-R9m@hg+EpkS{UCgs@;gQ9Ycl(s=5j(hKe)mf`a{ zfe@d^L#}MhVI~JLDc}UMM!$8~ zAInCx*yNEpAGeVhE2+A2KQ||uTZuW)!5yL74 z8Pz!Xn%*@!r59n-5d=E=3*qp)X-fF%ZF2N#iLKLQpy^)*_cJOv8(Kgnpp?4IY;L3+ zhp@E4ogzOipves7tPybUJ_8AwEYGItz*W|(a1_X4@LexR$7};{RMt8~4;Y5r`Nq%1 zMl);{6Thi?8^Uvh)qHH|rImB3;=Vw(Ioh2rza9UmB5Qemhn}H$lvAUqOg7pu(V67E z!!od$c@vb$kqNI99h45cC=Z^0%forSpx-yv^-1?&h@tXuY?GSRPx}j;L{#lliB2Rp zP9i*^MEtRVKO@mC!w;P48m7)=W_1<^`=Nid`0q{Xv2oKEH90ry^umDJmgH`Mop`Px{|+DX4(bidq7jW>9X1tywoF^ar9kn z5H(BAb8&)=5aY6S!%mKu$q1n~+c*uz7Kgwy!s&0(<#J2_tImn{#u2#OK*}bV6Wg;7NJNm-Lvzq3Or8k}hG6%8FDZz$v?Vw5qT|r{Tx`tIxkS{io z+yr(SGyEX@#JgP?i8a<)XsM=}`IdjeeX0!3$1a|dV;^2lgp|6d+)x%a?P{>J- zIm7QwVRGp*)VW-$AS;C^v4KHIzL?m+2q-g%4X`0@LaAXR7uP+R2RZgu)iOgd2bz<; zT*iWiIrFIH8jdSf3U|LRaQy3;kUdi-ZTh+UZu40;`7B#}+6JFxd*63+2V48|Huh(2 zYn4Z#XiI;Zo3fqlnoi!yvx9mp7(m0BbqQ}XTf9A~MeS!UfJi5a+uf8v$t4ftd`ho2 zwT0A>M(ItJ4}SD%QXVoNuLonX3q;wv z(@0p_dBWF0HOSRQ*bReZ6>_9JK!ATs^EF+sE(%Qob6Q3gQmwB z%rzStaP+xAtD5whgFC6OW{U{VUeD9(1B$x`NgFltb|98FBCa7+wnwws`t^ zKjFAHwdCb@i@{ZP<~xwCmz(C0C(MGw-6J^sor?j5OO5Rb7a$)_T;8CaD95Iu2}~qH zQGDiFGv*W*U$kZ_t8%h^wz?-NHUyfHfdvY z8xJY_nC18r#JNv-^p}~0hchJ62>+@`rVZ+&c5-ju=y@<*(*6U;vNvMxu3B{J2 zA!s~))w$8`f^5%Xd>7+o*H%?jI*lP5Qc!j%?LlC!;&D@K;Gu7=!PofgV-$4*-Q!)t zGsdb0vi5#`s@e}fGQh0T^&)82VrQ*m1KC)kJ@0lp?kbz$3Qq^$ORPYV;ik*A87N~0 z;1#kgHt*r;_gVz+K`s|OB74}*XP5wl_i)VME1rkFaRTyIEEgbD?kXvc=_*8MlD241 zGttZ%#z`ly;>@mEPSG0gp;UU^@;-6r+pPMfcUPeEFb=As!3Wm~ivRgI;r?kymt`B1 z^ozk{rHF66h{mRBHC!$yrn9-0XJl#}QgFKcZyKt3sR$1O8D}tQrZbrNauPp?{DEC> zZXyh2Bk6Jihl%Cp`MR{E40@!bgVHKksA8J=`!5DEjsa!x03Hm}8xUAX7VV`@&%w)a zBuR{kKrgy?u<^&EP9GDTgW%9Y@F@|SyEa)y+Pm!Z1%S>%#{iETcR@ywHWTVCCdt5r zbn9~YI>PI_ggjfZLNhO%<0I}Ryss;aCq&bMnVsy%b@Q?PFuSI_fR_d_*Ft{C+!L>+ zvb04vnAzFAg+n69UMW;FJ)_QOykxqe1xkfRO-)b{%R9Cv)2raacsPvjZ2N+q#urBB z(?LqxfQ$0?yriN=Zv@_ICj23audasZ7?SAF5G6@(_;f-rohCPYFDJpd}io#*gP>3&RF>L&fG(KQi_XnYQCi~}Kop&64@LsxB3H_xa&R7IJ!lw}mDKxKs5aJ!Hz1khZK75r?}p-W5G zFy6r+qF;+qJD7zz!~>}{QB){?J`AOf>Q zy4BJ-L>A{n-BcU`#;pM0a7qjYg?dzKMiq(Fx2IUUn`(xahJVpD8!L+2T27vsn`ZbZ zvY149vDp{M9sFV-(Ax&>&RMQn#1bIml;G4ErK@Z5)cU6%%@hjTBBPQ551b$rnq6Fj z7^EDjdHZ~y0lq|zY1Nz$2Br1#j?Xwlk0&620Vf6v;UEng$~ztC^QPf6MfJ2yq40K0 zHTRk0D#74=p~B~qhNDJGzE^cts}mum10i31Sj+XSYOat&dI@`HmV@1)2qDT_cFmW( z)B!vw;5CJMDp>)1Hnva?u2nR9eCT;n8Z?T4_2$BMi#WT-0t@CKhyie2{&1T@nsiuTBGqzcCI(cJRf@5 zJm*+Tu~{ecw_8S5cpYcZR@}WxhoA`bSR+KX9{SK#UPjB$*F??e;S@!KWVj%va=C33 zI8#P6g-S5`j^H&iwz|cRw#f?aT=23iZFWc;FiAYLUAuDXeb!52qvMV!2nZEb%ox^A zZlOKQY9SqUh?nfp#KJU#da^uZ`PDM@xI-CVoEwI-7Pf98Vbh>wfo_Vhg9eus-g|%v zl!Bx64-k9$HXkO=1x1apr+z{(u^6jLlChp^JMxv>Br=01A=UT|I|xAK&Tm4`ocC{BapEI2x1DNC*hI5RCZZTx8uckXzHQ+osxlG za>$^h=R`7SQ}k!pnmMIpWY%k$v?;uSQH$zyW>OuIhGKv^Af z=9Tfx60g|RD6*KxH3Lo8(y3YnJofjl8h?t0qwy8ge3g#UCm91hN}w;zKVqOuTA;Mq z91rngDaAP4ZkI6NvPBQ|RXM<2IS)7s+UzI9Q@*9Vsb5N<5?<4Wo_P6~8_(%qn9IoC zq|mLcsh4ctroz95mvZY~UWC9uqxI3GUb1mL4ynL2iV$cfO%X29t5@7feMRaDqkzA1 z;oXb+Y_Q!Ki85taW-$!YWi8S!VbE33IR9HWRNsg+m}kbfjOY=Ky9YjC(}Ru{2{KJx z^-LI(zSg+JoKrba1J8!O=}jA-_!Q`|5&G5B6|0wE8ymeOk;!km(8u;lB)}<+^_+im z?#`wV62DVY*DSF(v&Q3;(x+FVfIja*q5eQ-p-}Gw zMB1CLZ72BwSfR!t5sG7Un z`*OW2@%b!unAgXyiZ&)^ElK%1O05-X5giT?(psRDF}niDDEz+aOtgy7sOAX=^=$LU zal)nZ_azR30_d^L!h;|LruD<+iruuhP(CiD$P3&VjzC~76d;DS#+f$Zl|~l|j+M{a zoS(%ue4IeK>S7y5Fiev$?k4jlw`4d=;dB4lBz_5X6HbRq$Q`YlTF%Lg zRZ`4BLD^yheKK@&)x=qF1%n1N1g+XVJrhhjau{jj0wG=||4y#++7$jUMIyNBG%M|% za<3|gYiN7!JG@MW82(I~5`{YM0S@EOt)z_^1fd64J!M!_MQkUW>g@F*Z@Tn5Q4(Rr zh5Y!cLAA(vY%tM#Y=(HV0t_@7(7?7@vcv_rFz8Lw=;sh?(3d}U*fG22oge5Qg@am*J_3*>LLFQ7AamB^f{ zmq~hBoiY`{Yev|+$xlcb-9cd+$*98P&YMW1jk^%Yi z)k z37AV4fu<(62Gf;=fzHbOdxlmrjC{`K!mT+dNUc19BViq3cIJDHc~JQ2%w#y3H+?pj z2@jvS-^1}dND;%vbHmOhoA!mCdl)YiBV3H?1Tb!1QBrq-XnNwaH9KfYY{8P97IQnnn z_P+G74S&1ui$B+gRKN9u!jrH}KhR?FZ@%z`GtZ}VPdw&%ud z1(but0zyBtb>)8oeLpU!vB8hfX^yJudAq;{PWP0$O_^|2@%@s(B1(<=OtNVrIC zBCQE#qDZj`i}}h`4&kCu*_xtj<)e_paPd-oDh$uHz#uLt+F1`j>7}+Y#j`{b=c0hk z$7ljjUz)Z|JJ^tp0+^i})TYO}6@@04Fri-~wL1k-Zg>L(7H3g?!8$%UM`SZXW!X@@ zdz}4Ri&kpJDQUt0)84cpvNO;xwONAsiiSA3ryS~mTRqoT=;}?GGmQn=zDlxRHwsc6 zNAgagPE#68!(H9xH>APk^E3fv2LFzJ2#0xUD)4ZxiTfA5;EtmvYxo+AqaiAJhf=#^ zq>4VOioFDEIV;?fxi2=@u6f&;hn$WdGj6&Fs-|OB>*n-Lnp&>>R8s{Xd%3BKEAWa? zCB#vWjvMI5uz$37JO>BdxH%%%>rTI&O7-|-zDm#6nTpV8HMdh$ldViFgeq?n5QUk4 z?Kmy(q{7@_$LxO1Xj;Cdahfr%$Q@duGprS;C;-F8s(QE$neFf%iql|AI^NqS@*7T<#2X?ZQNFJs9B-&O?*qc?Q2e>(M8X zZgQB?#>U#@IIXA*?KMvm_Bcb&NdD@6Orkgx?U|%rd>rd^Ucv8KL5_}*P12#xeF@3a z5s^KU!NSN`#CCgD!rwpIKi}UvU|?y?b38BNOEhVLlnl6omg%p3edhcoyoHRtk4-=?Nh`^-dY1&QD$gJT={mo@~GbJV1y z%MJd`F!*K+zja1;yyt+h-Y3Gv6me*n<2XPgX7T?M&HZB&%w3x!!nN4naQ zw2fjrrU09O?RdGzyc@dW%!h$#UVnkqL9xnAC517>6(+B0Ipwi=0edA!lgAPNgXr;9 zR7`|ctNv1yTez-5C_H(lB^}sOyu7>bK)pIrOIxzArAul=4VdR)dS|$aEHoY&`ZVJ! zOq(H#7cf)DO^*}lkiKoT$;^#BpWZQ3x&MmOW=%|-H92*b4S|(>yoIUxY(-@`A}gGZ zF?Y*_$+gTowGKW`;>4s(wj58amyM|a_ozr0&uYCaTw$tBg8%vS#>GVFdJ0uf+b+}r z{rLMyJX~mYQ~X^*+d0K4+PCDRMGl`Q7yJ=o+Vne6C1N{?hc0{IBqe z#(ICRS2R+^SFh-QrB^i3=O6DCttj+=j#qT)PWlpF(Ng)p*((}*@vrcTE@l?@^omAq zF_Tv`wss${=+Efgf1+3P4D)BQC*8*@`kn_tp;vU#K@jFx&Svn6=0ac6E1GMZX%ng* z{$XCxdA9LcUeT`WCBsbGEq(g}UeQG)HoI3e(fvKWqSZGOQ+j8Ua(ZWfbW-o^ z^Sz>JinCcVerLbWD_WS#G_UATkDBZiExH~f*(pu$o|hND-;;RC6?wZCDwva9fxn19 z@>j>=ua3oE9gDv@7Jqdt{_0r#)v@@iWARtV;{PPa;!nYSMzi!j<9B-x|3SAP|0^7n zb4Zn$^Dh1ae3gY*Tq3+sC;B|+<=mZ`^I!a2H|9Wf3w(Wlw?nh1yOpVWUXywk++V}X zZ=M-7Jhi8$?y9^8^h9UpY>KzDSyh)tDaTtTx@h*e7=Wb8zYkrD@p8Fo^|MK1k-tM0_f~gMjih{@m{+`rxe>U)Gk^_D(o8o}4 zw*SA}JADSf^k~aDM@5Inr@PzmU(_D=o18?X%rBkXxZaFAt)xp{TL|1iPMC-m5=TuC zRMVdE)j}UGQ};TWd^m{|Wnv$IaEuVD{U)4_wgZwp#3G4zK(GXo=nT5-5oWw72?E4@ z)0-$xYIyL~Q27LEkY#%)G@M4C8D}xUNFdgkvIr z_#)gBZmez{uh7s5!F7RKzeP9{%t6)1tSe(W#xW^M4V#>^D(MJKLbBEf_&UI>b0*7^ z*fw$S8m$wJkDYXEvbXiqK2}Wn!s3L9MzdJb9Mh^}SwzWo17RqbH0z99t~}Fmo7lx} z0bF*<3L{;_GY^jaPBS(DsUz#ph&%H-MjTd{3+L=k;M15a8rFt-y^C`-x~9x^llw|( z{czIFCb5;8j;mgcY!=Pq?^T|XCk_P%s)k-VYP09$6>WzO^$MMg2(IRqTu%u7rj^3L z1_SJNiVe7a1T<b=(C|itvO2?Fz2ooI)bSeBL-e-9M}$Z`nc^cEmLA!JxG7r~RbH z9z&hXF)G=yDWG&v)Kr3u`q3pm*=vzsgI8XYlcvjwS!ozLkv5T-Y~Wk95KJgPzu z%tSIwFU}FL?X=h9R55cAGc(vb$jWQD5jeR=FNyvP+qOGyC4#DyB@AXf9^O(9$&n5@h6CRsNYdjnTw={n60f#Gh$e^}()PH{IQN6hQ-2+bqL&zB*Cg_U5J zuG3rEHVE`g6OIum-6ZZqpT+~sr8!Km;KW0iDb8hOd$9GcadLco(AYf!B7ozrzOO;@KSV5nl%P#+T9S7STvuGhvs4S_pr%d z=&o7{+IgUZooq+&(mC=*^JrhN#(0&!ESk?Qhjiu6ujhiCd}3+Qxfh(LT7HnqWG_b9 z!eaUocN_K_kk9T%Vz_Dl0QOy^V%>SVrLC}&nBj6Mbz$IdeLG(ilQ1oE zboM`UZ#!_R4e$8s;D_bK7mF*vk;lSAWmt0XZ)n~%0yuxMW7qty;<8Iv6x4svyNMBUB^bD>BQLE0tulfBMIJP%tP&Q~Ov zxFv1!Fum+1Jz6wAu7sD%IprGOqJ@TfaJKs_a7s9hAR3yq3no30N^V&eHD+r+g(@-g zA$H*gPIC;=BoQ%|W+i!eb{zwKV%w5N+;tEg(vy#aZl~GdU^5r*>==g5KT*|2BYKsnhwCD6lFz;JKi$qnaA)<(hi&bhb z=af<`mMt%Sv-r_|d=8xjnK=;*$1Y_c*h%_*IQRFuaX-ESW{it?opc9y6#|QqC6b7e z$Z|P48~3BX!GCoi%eD0-pve|e; z!wdr@!;*+X4KfhthUiDzPoH}G!>%x>1*6Pl9mJ7iN!OvJ=n!V%5Cr>`rKrBTzVz+- z(rmjB=?Fb@S<_}Q8^eMfK?r-7$a3#PyCYzE#(kt3q^t#`^%fIHFCNIRCjEoWU{q6w zaxbMEBBa7#Ka!rwbe{G(m&pKrM>UgoA7-J#rX1bwaOg7}-0fs^$5*Vbv&WLXEJ9`j zGtaLV4WU8ze+1RM15)5=dI@BnrG1-91vYo=+Sxam=9*~>Lju}y6F8z%AFxC-9m14R zg3j^P6|OF-csL(s6bnSzZ4l4c_L8}TG_Fel!Plbg6gF^l(jE6MYta#I3|d?`-P~Mm z#Y5=(>$rIh8aaFu?e-El7GEc@utOHgQ_Pc+sVzUiX@>(9b%!&xxtfT(GLMmbKK+#Q-N0GT*>Z3;hRlo2q?kSR4YCmUW(zh?{hJ6k)HmxZ z#6p&5Vj(JY7Zcf{=R4o9fTG(=`x={tg>H{J2xEx_G(P4ZDx=6i_rxPAfbX?Y_5jJq!VcHrK+;jfEk2;XQ zT`eN1!wxXoq#K<8V@&z1>!qX4O>9XPMF}?-hw=Nw=Dds+uR#<-qmRjM6zsfL(ej(u z#tfX{nYDu9cXH+_Cf84HqaXK=KtjgTi;<`?L2sY_B{7c96_SZw{zyiq@7^Rw$=O}D zkSw;6SGmEF9VEYLqL=YvPkxN~8UTG2n^=cCEpXslK-+gcu_x+Lp?}E`PCweNEW>Rb z?7ulW1nniNxVb$Yk6}l~oqvdRh5z7ul9@JP-78yk%WCASbv}sQEjn8AY$aK>o%YCBRgKSWX41!EL$(W;nVx#cCVSu*B(Ct9V_XxS5Mut}^SPBK8MLK>OF(3S z3P{fEa6Yc^_=Hor3#^a0CtGjvQh^B+Nuooh0ug^iO9cj-I^N-NX4+6O4-L&`DUpgT zazfze*p@vh4Qh{f<`irpb8JTyper_kXPq7p^pKd*;`7CNRc(Mi9#wr5g6Le~32LTU zFCl{#3b8kQBVEuI`kbCzygu09ZV2i8c#6L2r)M>KCl3*Tr{HUOi>88$(_OhKt0~j$ z@zMGIn~UR%vx2RD4&)r|E&^xo_u*`cUXCvLr|~mv1)+VmU820-PZvqz zF$bC9=EnVsUFaN>TU%TsCbyF`qv&}Avcl@}di~p|{_VHlPGfRn@aT`bT|O{#W_7I- z0AoK(C>5x15;2E}eH*y!2o(v8;{&pL*=x2bSK27Li?7p^2CvKpq-8welj7{Bv&PBR z>DFQ6?GurH@kTbAtH5}}JSWxDGk*}|OD zT^_a=d|mW0@kc9I0$+y{F9nY9LkI8GP%m=&Gyc$xJ8lNukdX*?4jLz?yLLPe4{_ozis{zOv?cuUTHSP9JYv(2kR)19j-o zwGp1-P}%8jLe=OovR3g#ZMx@H5eFH){(Sv8$mn(4bT4L*(ec7VvQJpc5UuoOI_|gP z;oSmo(jFdSs>KzNW$vJrXz9gz{Tq|M~J04&y!#Sas{Rl(<%chTF$zb!@w zopJER+A4|?Cf&7RNEnLVmAl#!X_!Bc&GFvFyTm?8mQDn5OQ<+Mcd#k{DvDjFZ1yM? z^~B61T<0`~CV-=q6vB+IyMbG@^L zH9=bpcGu&C5op6>sBB1K#b#oh{Pgy3G@EYimZS4=Vp;Us`t#-W=g)ENp3fkMCRanY zGoy0RN}FRRN?3a!w!P?eQ7b|$>``HoC$N)tl>Qn<75?|T?(o+|IDQvElmpp3>4W%I zUG(Gyv~4%M&T!iW66urfi&E_Z^2ct3dM{sv8!O{z7&nb2v6Wno zudd*?#hmd8h?w{Qj*38iSTu}oI&oyo1}Fs&Je`Os%w6`TjYHXaU!os4fe#b~9(U0}{P zc&nOfV+tF_+3%+oi8GJZ-->q|I-2u~?_lMVZn8KUCyV`V)mpNgHOg=7zXoyZiSr@_Mz?d>^!Fb#-*HsA{zvz_tNwT~?kx5?Bisv`4S?W< zOn@%HulX_rD$7QS%hbtkL|kT>wB02*mS*BIr^y1y+G3Y#(*Z?3ACyd;b~Qp#0Z9@M zp~jX%1EMj1wb+_7Oq6UwtdaGkF)<6d#EUYR%APy$kycRj5cP$-0bf90fCjueGfIgK z0!#j5yh6pZKDtWNmP*4!43xA&qk6f%AEgnd_GSB=5sYzuBieT==uWs1jmEa!Ph}{= z<)AM;a`PcU4lgT#`ov!;6Y-V~Akr`$fCPI~p<6N6op*H^!fSXDoJM4=Q{TJ`Re-f`b>Q` zo7i%o@XRchcc8M{-c>jKZU^Rl@o;x%@dEh7q2UudyH(x26%qxu2E%B14Q;J-MTFg3 zE$UuXeYtGE1R(-GTV7gUU7GM^&YB^1jO62h%~v39!ss}^ws-m2lMm24htFVSjHK=@ zpnWbIp+s_Zw~=on?Xy>qxdkOZIBL&YOx$G~^aqbXJeHfVXMx<=I__Nq5!s_r5M<*~ z#!2q4&`ndQ-LV9B>Cyy}H_hX>dOr&h!c&59!lwJ)p#LVjd(yUNO^r9A$7^UnBEqb=q`aN;qwOedp6dD>AcO$D{b-Ar+U) zp*BhL1>l_0okd3vF^U}Q^+*1XpL|yXV)$Ih72h6_2=J~uG?ao-6mJ5e?AX|-3?M?_nnySDQU}jxyH>Vfp_(Z zLv#3L?sH>MZj$h)^q<9Rx8j|wX{}*w8^d&jBR;3CZO&5^?8h;5&VIWNbKbu~PZhj~ z66+yJFvultV%TDQD4_NSTORf&UZU8_M&x>oJq1D;g2Hw^SomgXsfN<_La#Hx=)Y`j zX=zEV1~JsDW)rANd>G;9%JqOgBJNSOl9T#uCmD5KE&lPe%pJ)4z2VusLm^RAFxa-y*%?uzot9oZVD$ji|8QH zT|IreP+werCp5emRrblNH6}rUZUY(eGbQs`S9!6K>pz86@|BPDv&O#Ltny(+puI2? zKw~y~*Zk>!=O0k$pS9baM)MiWJN)o08#bS{hd0lX__DKj_C?xQsxK|At*!oPiT{NE zu03B~`%`^oW$F3S>dNx!8kGMAe)?0i^hZnpaMgGST>*hA=}ss&?R_}7|Bydl(4`Dr z0EuX#g=jk++zs)tjVjG5UJ!yzwbchXy?+kU`CG5+e&sFOgFS!;ASsl^6#4I;ZW? zE%~-1pU<+i*&!Xow*#R;8;)IIF<8Za{nwd%_2fyF8f)RbYlpFe%{yyWAEE86L@;QR}zYaI$+tf(dJb^Z*UB>IjNsmQthtz>6}j z2)}5jMmx8%YQ~P>=jbiY3YevdKAk9%2N>EIxW$%N*)>XFmvXBhPI-83r-p_m)JxdC zEFYlWWssuv7?_;S-|j|d$9v~LZk_H%`)AR~>G2QyJG(ouwp(ZL;K`F(^yB{d+vAJ# z2+Evp9i9Ia9q&b3M?Xd1?;q_TX!*(M?ipQE9iK+~hbIU7yYP7bX#3z|XaDF;^cp@r zIzEpM_7C^Zq2}{rYE^1Ouk+(Q{Q7YBbo(tl*?PTyuz&tjE!x{ZKZ2U0J*ampI@vls z-`~DC*gB0)E>2I5&vu~`J5ck{{?XnkG_;GiwxoUT!`XZs?f!tbxMy#-4i2cntqT~& zY4my*db0KUV3+HKacm!K?H|^novp*IH`tp~8Vh`KN+qQ?Kfc|iM^HJO{d{4EGl4gC zr|@eH26lRmb3mW|xPP`wM7edke}>brcX|ws;5@=d$5an|dbGE2?}E9pn>r#ja`^bdux?vkT&?R~)ToToMYB-;RD*i@q~Hv{2KZ zf%CnH)=~J@4e^U_>BVF8LgNRZ1fvPA(_VN*k?iucPTzN~7G4pGygXgTr}*vSkOBnd z@d_30&pnv)y0!jb?g0jgJit)oKQFuh*)$u>J;+9#2W@!rU4@=6uU2)jxSc3+h!>FE#bH*@Dd)5Yleibe}iL!TNLD=bB8#aSOq!;w+Y=m;UXrxvhYR;yzCw? zFS*An>M=A3&&QV%3&%s{Ii|60BmeVgK!($W$#%WQ?^g8^Ea8(Eez6x+>|2Am(P-?Q z{?ORlIoaQCG_Yg~NG|LGb(UG|yZ znd)fg*o!^B!GO2dofhbxa}V&aHD-2-6U=y&COZMycvxnDA53J}9eqf4zT4!9C2_uE ziQ=oPVM5wJG7kz9#RxCs_JW^YkB1{UwCR*Z+QDv(Iz15t(6K2d_z3im?t?0yrzV*J znE-M!zD^34Q>H=huvKWq!h|i*db+xhXNEvPAfC zj-{5(-6{i-D=teX4>q=+<>?6TBG}$Ox=k&;WPjy}Y4!$&_xu?)N2l2Y>b~qJ5AY{~ zl2|-grn;l(Cyd^s04TJddz_EB9L>O=mwYbA50Ui&O*~jUSeb(g*GqdFJDt0rhYNMv z#pHwT;)-cFl;B)WjbcE6ULm^MvR4NS-j+;1Ojw z=AYqYLrVQeZ@`rDyheobfKz`3NA==DaG=lq577Tn#A*KN577UYmsXcn1O0#PoBG;U z{r^8t|0kmH)&K2M^*>kWn<&~t#onr)d*r^uiu8WJxk$%a?z0yWaDZ0yHXcbSZCcn9 zpOZZ~UO4Qdjdu92c80HZhX3d63|NVn8vY%22K+EIHB2@%P&c=aPkuVxfAjVnzkhpt zu!9J7Ggu&U<_G-#b1V?P`GL#`pJ##KI@SbL>6-ysb&lbRSg5t|9|Wt=+0d^{fHqcpihSg~q(CUV@wT`L zTrmRbk*OpmffK*MiV^P&hd?DMGQ49;(qDZXY>g}N-@pUvhE0=(-x5Zteb8B0kWWp- zc#yB;S5s8}LEOIzkE&{N1?t3S_7#nPb2CCy*7;8-yN$E+(~IqMkX(Pm!xQU~#FT`G z2VH`v^AgiPUo~U5v;N?d=>kdX)7#rSINq|&QL0Ls^j8rXg?OkBEC_+ofUi=zF7G=L z9@S$44;ryP9mAObM-XZR=KJ{yKZ;zx{S-OCa0|TfYxL5z0t2WPtN=cymNPi7o7dsA`qM@Jl5SP^kIrALyNOVn zNKJ-&TAi=ZCsE;qTn>}?z5T7Iy^EkdZ`-OC^>b+R;`g+P9j>q4e~|UH$t^x8AEMXX zJ;pe5lM;MlTVabc`ukUw6cv8T6Vv8q5jEYbmn+L*FLgUoBM0kNu$r1-1GVT^U78;{ zyc25j>84{^yye{!oo}VW$Ieqsf9yCz^jG*hT8}6yt+8|b;}O3_ZM|BRte_~XQvgIS zZeHUtX2S*1*sbH7VK?GofZlmEt*rKT$L?S7SERj{*OkGu)4S)Lt!7rdEg^H}(Fo)2eU zC$IB(?$SJwaSfl)ly8_P{2}I_x5xV&on`y&yeW&|z63myV6_ZH&NUmTxbOqw^-zV_ zzvRYY#D-c%J|M^I_XI2Q;DHUkvFV#DVg&^1I=VPGpzIZMCb{B2DCTJUed3)O4pn z|L$9%NqDKpMGKi|uDAuM=I(V!+D!|6^0RYeOx zNCbU_L}0-?O&2XSnR=+@zpwogZSrmu(q)PzLKU)PYD6N8KCvF7STe2wuLh|tW~oGf zvO0`8!91nLW6GB02%jLuD4N%52An)<`UD=$Aewo@+7LwRj+w;04%u!J4Q`si5pE~b zOq12omNudeh~BO*@Ow_n62@jn_4m#%R_Oi>Z-|P7?J|*==K-o6%yr)^j9L* zmWrSG`j)5Ex3XMVU%_Ki&x%@^)B+tkxsO;G0$nKlS_`>`@pTAt^Th()@aU_Z;*QX; zH=|Xr-cJf&k6${~6pr)TF0O~aCGD%LxkN*-*-5;nyw@%o&*s{ zl2)jdT1`*E6IKj0d&G=F?%Mn+X5M(fMDI9<5{#cwG*bFr*cER|)6l(y(%;;C;2A;( z%+T6%G6B~$Rvm-RXKwGvW@{`IGYzhr1v<(1!SI}U0mnXc4R{z~(p(o^ z={d|?W$WQ$4en6`r%YHdo+m4h?AczioD0s=Dos!=%6(iD%Bnd=H_l*bTJb0@l7`gm z8KlbM856k=F%--lwtsmom=zeUPk(92s-*Xijl?st&#s4i7JgegwaQxyjnzF~cfP&O zc&%PQ&v^F%%~KPCH-gbwSHo{vUTAk@JQ&DQV}#wdsZv_9-`6-I!3OYqJ_JUbh2?|u zv)k%K(RY=`p_yd%n66aCH9vLdx4t`?lXvRdFBRr8Hs%c||m3*DDjuRw~dZt&>| zm0WkC>yFnGUCDFXl^41zQi-q&TZ`_Au4RpD`L@}7fdM8P`Ftu+3+_mChFG&ZvcBro z@{ROmX=N!Xtp$B5BJG!BM)YT4#cG*<_d?ab$U-fDiG^DEA`7+ZrWivfrc5#U{jF6a zH^sCk2{_vc|ITKjk0w-Z#(nRpWnu8n{%l0`Z4k@h2ll*_!GjH+wUmX9lx?B(9f0mc(E6>0B|NN);|I9CJ!++xcV~D082&leX z;05IW@jpQ@o(1+E%6a&lv)d?p=Z_hJ(}Y_h(?Rc_uO2>MJ$$};_J^4jkjU&k$oP103{g$>Cs6yLE{{3AH)PO{y>`V8XFAzP28dRK7+rS ziI{81$;f~nEk3d`p_~NK8RJ_zTx-o?v*rO%o?B#&+R`CyCRo8NbK_qHw$%qOPw+$U4>MsBWl zDC3YqNn%Mki#{&~4V&CPI6k{L#T+%>O@H?4h%ZfE z7~2poIU2{Pw>YURqw7`z$vmpOm|rz<69rX2|2ZH%lwaq5uEd+BaY2|NjyG|18G8sF8y|{Y^iEF5rvw4|3A~GFnOACbwP0 z{zcfsc-W%k0U)3k7O&TfF$VUx)>gj;0(?~yzN!gd)r9}KfdJmK%QWo)YRq$$~tecMf zVX|CJSA*!%0fYUB*Ac;p<@-u~jooEoi0oiBC%ypeb=!^aurG{?3G-~-^~U|qN5(2u zmvQ*8(dqY%yOhbRO;khp6WA+i3I1-tKiS`3{IWs8-7>2<+b?jwF-pSvU6{K88PL_F zZ?7hQOHj1z5yf9SXENu$A;BmnKU>7HL- zhr&2`k$kp!$&_$QsD$(vIw_%Z3C#lfnBo{OIpLywj@AJb(b=Kt?cP>He5-@~B}LqF_3VLbczNrAVr-;lV&`RPj8agnH0{7Fi_-Z{Pip{DqA8(B2r`-4dp zG#b={7sjPIaC!!c7y=v74ljlXE%8}$lw9k4VC7cCEr;1bv#tm-F}EIFY`ntf!F+qb z`^zj(Epi<1_b-**#n>JDj)irrNV9uZelSDrcC9BiFgpb>rziU_ z(?RwJkpSaxREie87I~EM`)S~}xd*)B%&;~P(1Y1tWci-71@8j#z<3AqnFR7u1OR z<{_C*pv!V7WazCAXCYF?UnBJIMLWRI9Y6`6oK#>jlA~!(!a-=demLIW;go@+P%z_D zM5`+Xh1^OsEgNU@0*cmd*w$g^$AnY@&dfmVp#I&HqC5C)LgVBR1yX(UbI5Z#;K8!nUL5<=e&|yqz&m3}8=*(;e`@kP%!4?dH zYzhYGQ|U9xMvVE%x_6(|DpxnX*@NSwH|0&&D8<2G#F8ofh4Y0f-%x<7WQ!W=L=SPC zX1r_rFy@pA%}&OizONDOokGL-$VR{H`WlPA2|Lol=LTxL31Vuj{K<7q-h>?Nygq0g zZXKOBcJ|+3ouKACejLp-PY1J3l=10ztW*Whldt+?rekR>BM(z3=8~ir6yV?vn+pAb zjb28o&Bm7v*Z2JXnBLJ~b!lMlic2?24q7h!F;JH7UqEV{(-kIZRd2BLqC&&QcG8 zst;j|)L^UQU@UA}9PXG+i9+}TY0G3smf~}g0-n2o0O=qgxp*Tr&DVAbYj|o4*u3+1cV<}Rh+Sj6fP@jRs*xssW=5j6@}$m6j#iGkYxOOBMkK%&T@nm zvf6_L*Qrzy(>qFlGqd(|rdluV zQ>%?Ro~5q@J2PuvXR7t$KDC|^ODT+xrpL211{zpNV_~%?$54FtbZWg)ZM8y-u&R)y zW@^TTaU-8F8xT%RWD;%ns~o(_==fNAWiIU6wpZGOYCFLvupH_#@1x#8BnAcxf=c00 z%>{DTj6y6cRW%aEq!}@_ewr|BBX553aa+q=FmOA-(w>(N8&pefz4-sxd-v`pj-_w({de>!8c2v_WTBgdumewwZHV{l7%vRjd!IZUov}4G3bLd< zBLhytcRzLM`}F8yJLIyJwE}3mySn;bU0wC7zJ;eIiOtAJZNg<7&?c!pLR=LrQZrZ;J0;K4>cSF#;`-K0G06Eudzpj7A_boqP^qAXrw ztGV`)aeO?4LGNGDFl4!LKn;gwDpi$n2hS&#@f0e#hVhgdk`b^Nn@7pehZsvHruTGZ z*@AC#-(!Sk=u=z>ml#a_^qrau5{-kybYg4))TCtAqn{e^vb0sWYhbAEVw>U$zdC$G z9h1V2N`PsrC4Lu6I~hHfXhaxpf{Yk24m~TaxGkm!yrRlNi=r834(x`237=kZRAe?0 zrAVwWis>McI8b_OE0a_*n^j>0;4X_^Gj9K*!Ze4rXBkJ)+Wmq!6AUvUQ6_EzG9it^ zq&b+oFZ7e_G#yN!XJ`-D$xm*IF?uB|I58a@mG!%sb#*k??latG`2HqkYUD{lXKmRD z4D8FGRgwgD0+BIOQewT#q>3hCM`k+tBWRR{vhW$~LOrNH@(QY9BXcJPZiCfyKFJZl z&d~&3q184_DF^sw!DdPDkF8uUinX);R>@W+qw3*~rFtlNuL;k#chRSb3TZ@<1sJHf zAR}~r?^|UxLlp({<@c|ta{Z}2E~qQ$yPvj9PT7Yt6Hf-2B*!OzgVKm4bD<3iKn%j* z2SIINiK{M!jU}B0uQBhcMJgx~dP4fEw9AXt)_vvB*TVX#IZCanqvT^PU;qy;q`nDg zJRN;u4igTEtm%u9L4$KpI8D@6ACFTSabhH0HsU=`w|@Wl5$X6Qej*GvSsixyR)@lx1{MJ6>fZy;KIY~Zhv1-7q$qJonx;$^8(zc z+#1~7;*~ZlH^9WZZl&$YjTB9GrN!0EsKVARU9SZW_6%)_EMHCGh-d&n|Ndu!| zrNfqa9CEC=q_vUNOtx&633(eQW#Oa%ytOjRGjR$)y)WIFW-_=cn#B}XU!pgC)3h6R zr_qru*Plf_xOnf~uBz-ybbi1l@5cS_DCTZ|2v!QZKc|9D35RmXm0TqiP>`ITQeQ%+ zCoO%o>Q4EkaAB>+LXk4MOZL56Gaa=J#}-;_H?!QmGCj z6Fwooz>AmN@1Zz!t}hZ3bwN;3DRmp^_rDz#ZH52Pz5rrCoxeo@xY_s*^>(xVD2M-6 zZ>;biR`_oc|E+Zm{I~t>^-jCCf_7LzJFK7`R?rSB1h@qd;1-5#TLQQ3R>9lwb)yPI z@NMN_FuG*S0$j&$@Hvj2LGd-}QbwsKCo*yyAJKZ|&`pa$zhPZ}4(K-@Ijz|y-T5ni zhI4mJ)}$-1b8IhO#2`05v7aQ)^S1YpZe=!afSdTmM{?sidVI9Ev;Ta5r}rbQ%kAC$ z9gpq3e*xn?$O2=zcd&bG=8#cguYlkFyz;*d4)eR>Kesxq4PXARZ?snO|6dRP&7L!X z3&0FKHw&umA=y^U!)tp9ga;!K*5XSLgwsv99l%cfY@EEisEY58#6f(Lt)%~z^uLn+ zSJM9<4eSP+>|KN~x=Y4MnZyoDrXMNZx{A(@lX!<Vk~KxgDB5XvofO)zftB3wPqDMC@R&il>SipkL=@)e}DYn z=A&k(?&1GFsz0i)q7y!7N*W(tbes5P;JW2-_ae6gZRy-JwGsLn)1j!*| zb?jW7k1#qb+7{zIpAZKT>T-&(3)xD;ypl0jGUiIg{NurcT}ATt@eh%UAIvXhIap!m zgO3Ot)h21uuVwLB(xa!fjC_+|4K&s#8`Vjpvp(sxO0_A75hSTC2a zAB=OqMx8;gb!@6SF=}ky)99El>=P3?ESOYu=<(8=Uz^n6@o;>8nUqiw`V6+5vB3TD zJqEqVq~8h&%5Y4;y2riQcA97R7e$p}?O)-MB6m+XlcWK&%7fb|%K0C-JZ>`_0{w)J z8lnJl{3!(}MkfnAUMS=_K@FqUwsuBkqdNQ(!@WmwTAQ3@Rgtzj;^9NIm4+lT9iqUr zr-=Hg^0cd>RTXeP>(c3@ikTXv=wkdqMEFn0e}d^Ji46x(GiSyH5kc#H|ahfLVovJ)Hi zqGFB4%yP}ba;=%=+J)sdOu1%TmFq@uwpu*GELLAF{_v}nzZuNmD$L&w=HDpH-%tAe;84=%t5oJtw*mHCif^75cdg z4Kz7rtLjXb7gChH8}j<=a${-v!Y|V;Y2%TihS}2ySY?KF?=gi(MB$ND-0H0sJ7g+!mg!Pw^GdP(I2Y?LUTkQWOBO08 zy9l*a(w7arGA<^y;WV1SdYRyY>Q;FLtM8BGcRtaqgsx0zwyS2%n-dU{vx&W+2m(@n z>B^GX#2TG!BKx^K=~Va=Zn607F|R>+HsI-5o;=cdD8O>ssKdvu{@CS@4P6q?k8GlU zHto#{qydz~%*_(FNqG~J&*TajFQeSk@kE6wpxX*>=~F@<&rVa?K?zWgavvSM#vA2$ z_yGG8r6f&;0b*Luw-Jzq3x_(7Cc6Lo_@LJ8H!D|Nw zukQ{XRV7ES?~a~bm!8)}JLN_vKYab*@b#A+zF}bexOW2s*yy+;m^dQ{vbbU{aYhh@ zbiYZte(n05V2xnnjv!Uk^((>=v};l$*l8DyU^g&=i93Q+l^nsu9YMP;)j^LtMQ5G6 zr*v|4we7|(G=%!Dos9YuR~4|p#XaYs@7~?>$>w3@)%Fi;9~G6mYcOFRi0)dK{%mwA zrJS#}d)4=D&F%W!TXUB#&TYOm%j>t{LCsq{de_Zo6ttVcTefq_R?J+EP*KjOly$$B zDe5*}Vx$2Hb)o#uH4@3FPnZN6t3ZX9p|DKE=cKK~jXK{<_!}LOxVGREhnTS?6PeG; zMYdet_3V7|mU%oT_$lk|KN)A)fFNCplmPbXmt&b1w`2l77j|qxOT}@~6PI@bH|3GN z9mq~@$@UeHk&8VD_P)+(j)oE^mjOfvVi#KodcIIwA z^CQkIPay1YDO!3%v3R}BW$JA?^)@ZRdhrU|%T&0*ndKaBSvRW1DqFasN4y;N2~w#b z;+6)jeuwW~7(q#{hyoEfOywrZj+UeBNR8eguhTtP$4vm$*+R2#-8$&i45645}>1sWptBQ=FAq;@L0#n{Jyyv!8bdVvyb z-kVz8TEn*}T@^R6YxHurP@THv6jcZU_}T5&s0F;jD*Lxx<#2wT$t~8&m3mr;aLr~u zcB`zv3|vyuZurJwf446jsjU(0Ix1fh_2|1)p+7RJU=sLv71ecDkYLLn8>+r7RB@#gPVYr_}sP+#JqEy>HiK~ko3^tD?iG=h~pE*LTA)~%~~tf@8K zYEbBxDXm~V9d8DN?%cW>-7)-lA&1(uapU&Kdd?bLcqPce?mL5RrZy&cbNd==NA*SD z9dC74mnn^KJ@#EaIO6U6i1*zQ*Ee;U)C$*R-_%26zR}5zc|SPj{oiNIhYJrnjY+6! zjgB+yi8Ji#iq8qwuoqqNL&M(g=7v3Shh1IpWlAGlkA1-p4tqC0?1?+<`g$*uTH%`P z>wWNWaCR=;KY?*iZgt!vy8B1@yE@!#6E@GPrDH@NfG?y8h`J^7=mpaR)4I`jlhZUA zmi5b1B|@#S1I7``%1?%O+HY9?!fI z1kY8}P(Sl=QD%M!3y{Xu7N(uceq5OSGSue`x3%yP9T#S&N2&nvPJ7YZ$A!5A6N`bPpDf|AqUeNer$hB?*~%~xuyQUc=}+H~ zt#eUXJ@`tP@f9CrJiOk6S&tXb zTCmg$$u63=V38NnT{LgO`Yxm!&b#>P4iYX}+hNK}tZnaNxa``t?@i0CZAS`Ua&5cP z+`P4YZ*V49H{Tb%-rm9UUJvo5%%>qbaQAvfDu`;(aY^mP;hS}~5WIW0`rRZQpQF3V z%2D_W`hWZ!e~5c&{IM5L2DQ`M@&73F|7|uJ8=aj0Z+&Cs|MA!J|8OTx$PeT(`GGu= z-XNYk2$I+tj&XlrKwm|PQeJ7g%8ldy;zcDH!Qb(TcnzN}C*s@p@Z-Dl(PeF%o0gJ;eA5&u<2iho(!=hBP*4$hcRG;q#(&k)EUwy5sEtyfh9SVmf?~L zn-pflF%&B!V33IwUlHTe(@WSb8_h1cEpq^p@kk-xU@Q~O3_CW{UaDL)(2u$nMH0ql zhU?3>Bn6ExF2*DGdp7NZXoTNLroAI2*z)1a-aoc~-0r>F{$~$*wo)oFlq;E<=!1}9 zVDs@qCG0CB_$tVF^mG|)m0V1Jdf@bc<4ZQayg}$+Zy==nQ=}#a>+7($PQ!r{%Vi*2 z5$jLM!@DAWEkrF}2;2pz&y zPloBZH<_k!n#Nbci)m`-6Kn8?31f;Oo@vgQu&!R%hv_6VMR2zM^X04E^1f`{ z`cs%>v-)rOrQxm(Rk6#z1365Q!@-~oG@R}kws^xeiaCd)JA(woT&R8QPF z+C7rdM5gZ;P6JLLIJKrz3^Gn&{xbggbteAIiQ#RjW>MVYhU$;n+RIUF4aI69usQKmRLUYa9yL@nJ(jm{Fin`Saq)KBx6ayn{Brc_X# zrF#m$E!OMC8%r&W22ll3a3MTDSq0ygu)=J$|k!=h$Km z66aXiYimHA!(avDB+PEK9X+I6uTY%8<9FlBVPCw9Ni*~z!7D3icVhHoL(_RRoGP4z zb*QaB<=B$)libv;Bdzi~iArkPD2eH_6pN7h;r8qOANSM^6)vc#;yV@I#e^(?XC6_U z1rMaag1}cDtE0DHy->oDI#1{bO7S>Rhl)9Mf=5d@0k^Jj3NBR@CP&9>mx0>8{T6M0 zl-Q!?NuJJeQPszVRUcbbyD5+`a|X5pW%QJnBdQv7e9Z=F>5nrO3xG0kiI(*#dX!p5 zPAy9CBmO=Y%_qL-N^bvl^Xci+KWaV|O^8J~`T`R|DJU^auRz4U6sAXCBW0s966XU> z5%glHN{N7aCVhVlMB%w!|scs`6L~G81xZuMd};ZwX##cw$l?v z4T*dof8emr1K5XU%wQQH7_0o4!UYkoi^|VJ>PM^UMFdIUcZ|ABnV1_>rJ^OhDF&m- z<&+;_5Zh&(Uc}QaNhEV$BQAkg>In&SkueIRBt%FUX*|k?^5F+Y;T;kp;6_xG#+TFa z1ui^PaMtKrqQevG6-dZ3p~dGw>o{>o5&gU17UIMl)wel3fMqx;bIb6eeNvP`A&S*t z9H@`$=em=*hoBc!XHSOKgP$oUB_4mro<)XEHsJN9aDdsAbR zFqqMd{Y_ySIh|Ma12vlSfd_>mH%eH_>MmA?x#6#fp1tSDw4C zQkxXxEN_5322?4^RK*K3rRpKg7Dk(L15M>;fjT2{0~U&@ZKk##T-#5Glk+f8!fZJXu@{!4~{rZ4Qgl@A;4#0{^gCPgYvIQ;8=!K73f znFaS3jRQtWQ?);lk&RtdfE;1jBpD3ZBo)R`cD3QEv3xRYpT`4O$OK;tECLJ$lU15 z+iK+uwFo^sXR7sT4=6!{UhnOEfB5p?<%@qWVwpv4@{F^tWtoM99OJC(T4ouJz8w1Q zqIN}L!y?#)waiA>N|@Go|HUv7Z0Mw;M5M33-(*G@mXRH_@<3NF<04C(UJwyLs7v}RxhC3#$vjQ6*%I3?O)n-}eq#KAZV&Pz zOm%#~4_poWns|?!6AmZ`AAy{*j>3G1Y=>M?8eU@((mePYL3ORM%!*L0n9of2=cgFu z+P?j)Nec~rVZchcBwtb0MTn9fJP~c{;sY(!xviI1Na0rN#8{HDUu^wiRW9VFSg*bE z=!CL&po=OL;T##DUpko#!H7`qy_ap!e$lW^cu6BFLG1BzAc#90 z`3^~K0+kW)Gq-rQ6d_^-vG2B&)1ieL5AFr>|YsxR-u=7~z7a9K> z^-$>8Bg3};s^WBGQ9E75F{iJ?>QL(RRDBU=yxrPOzX}ss?ugaLtpBnBWSGiQ$XMfyGAIblC zAd5y^QSVv=RZ0C%(@Umhh{Z&v%_xDI2&tX+$-vlSxjclYomU(E#Tn2@D>BE^FP1qS zU7=V>q_lEyRYEnFdQ*YR$plY(=y5#m5p@ra0T9iZxsVzR^7XJZlnfX;F zouavcfd1-aS^ixQ-GJ3o6qVwTSWoN&$fvfzlbzf#%!JN~3g14#xJ;2#r~OK&PcFSE zLnOL|B-o(Bq2gt|Sqr5ZNBG$@oT6+z0==DMdtUw0geCBxIHN}cFOEjl$;xY*%qXWK zpqUb933&4O-^V|erHZv8r4V1Ft@t0Lj#c$^HSjN_;=iY%5aHCm-20pRP{gap;R~fe z>Q?+m4Zn~D;FkKLpXXvNr}6^aKeN{#=b|TC8Jh#I(jOBUb^`5RxX)v^MBMMEuotkI z?ML}E3fKCJ_&r`n61AM^B#=)#a0DE_IXEEMR1Rc$0b#x33aZq)RJYE4bF@}gWlQgJ zv~KbxrTi{fmE`X{@yVbfLR${bAvI6kiRIjys^We^<4n{DFuN+`@nEKR)#eGGHnpVg z?-s>pC>>UKDAI=VMEE_irP3K^)y<$K92R-$Er|9d+Szhvx+KBEkjTpsbbP_mvRYLk z8#a_+?)!f? znvIqI|F5F|Ut8aS|E2z4&6&U}K%*(d_GtQUJh~Du(j*y`g#X`S4+o^ad(GiuIIPuW z$_nudic&=?6?`aIMdw?+2CQBKR<8l`UIT9bIpA!BDC;s9-|OvHFZN#dzW0Ol>F<7l z@3ni<(J(L`ypT3HByJj8%}m^=$=k<2l#n8Ra%DyRABr8M=2!WGxuo?JzXzzC$>{Qe%byHN zN?ylmpYOjqe%*tKM`-r?GYaeG7Y10yJm$;p-t+A@2dbbd0m+|LEyh#94&|&(W1^_; zB*3)(;pipIHW`zk*>;jWyBR3_N8uY4%YWHb_Td)eKNrh?8;>@ce*EV~YlZ*w7qtK2 zITJPj3EO|HOgdIV+)9XB32}cyla5?Kl0GBDamFF%v++e@BF@7U`{qKRHLnclBl+Ap-2P#&{HY>7=}#~Z zUi}+CQFx`H&T>c8NZM1st6wYgkURRD_Cr(Aohi&veNzf###9BLtT3s8Nu&YQpPHLW z^~vD_)%O-r8JsJPzx&SPoT!fkid zwG|FSg#Mj=prOfS_AWY`$bSq|`H!@v{?SzbXsCZ+V8IVihS0Ey@(-v8Psgxl;;31H zjz-Bxa#fX;!7deLP!5PvxuYRPMKt+6Tc8m}N*Y)(aiQK}3gzn&{X4BQA~%f!&`Cki zzk*#~J}6ScHf*h@CSvr@Lu@2-jaxC{D2cX*vtxRxrlavvZQqsa)eOx$@OJ}$x6SV+ z{_fImCBoz97JhCt={r>nMCr`!{|qvi2^VZ?!ZsqMGmFyc#biJU_bANoX~e~QYzYOW zOsbu-sR=Nic~z+9>+r+5xWlskCNscY7O8Ms7uajWGg)529K=~+8C+T8eer>6Jex#T z80=R~4i#=WBH)3FP+9SLV*JwbQF?SAH`}H&nP$t-v>#j1_rofj8;Q{Skm3mz8ouCE z6|l-^9OCID`Oh!JRWccHOf?mj40G-iHXK(!h|)HUkBifMGD?UoOk(O1q81}4@r+BG z5n|5Ak*UGSxoKC(?~y1G81&^r4iwz2&4jMRtsj5L>7F*B^Hesdd@`QUog~eFgr8jYdt!pD!jf6>H8;)q}0qOxYT}G@y2r_GWiatL96thw_z{x&L*#@4uY= zf2UP%)Y;4U?klQgP^NGu#du}1+e8~Qjrk!w|pD1Gu z32t&T18!rzjmzSi2Hb0Z8i(7*mf%5)+amOk~7m|v!Kk=IsFa+0@CV{*tH&LU1Kih9M{a(V>J75MYi=yp5 zb(V0=I2~i`fLS$JYA8b*X)0}5a1?<+vKh%-Gh<95wvo(^b~11nMdqK#-g3+Se2xaz+5OAFi?hOYN) zD_W1XJre_l)&@~4*HRnj(6y`)Y+&C!pB?MWUu{IFKm#QDVv%EovOt%1%Cafs zP4SCdNx#T9De{{r|DqA1XaN#Gk|AUN>w2jC5^~M=ck9na<+Zc_y!ZTI`^7Qd&Z4Lh zNZ6&6W*~)ZJfo-`DnvVX)D0xbxFHeT+w+MM8Yyap>f>qJh&t`U#AeiJhAO3<1zNGu zDM)N|qK!s#DLd%}tfa+qX41EABwfF$DRjbMJK0b5x3m1MthF92-FRz`;a~mCIc7au zH$9vHoCL**-604_;V1<(WTYXPBw`8<0;7;epBl5ff!AkA5XkvnjAy zAldqTbWcl-g`6HJRvi)715KO(A~%z`%ynD-0&^zLB9$mWwBofwnU;cGn@Ov?HQ(HJ z)&g79DM5or%?9Lx`||JZ4RB3g0M8Aeq_pS@_yWlLp6d%x()X?f?rGu7uGj7o-T|}y z0!kr|fTbJ)L^i$mw|lKKPopqtlla-5w-x{v}-!NObD7r%2sPJ8*3 zmeM^IsT?(|oLZ;Wn#2VX!@fW>UY-j~j?_pJN`bO01?4CR%dup=|K~TBGA~#~pEf@( zRMtG$$br-@E4RvH;|7{@)lBn3l)xM~poPMw)wvEV;F?0zn+poaJ!Rpr6=DGvA_3~f z3P+0)FZp>63s~aAv+Z59My1wUdY=mhD0{hZJHg4o z3~hxe=L>ZzM8BP!J)Wz=y@~R6DYY%>ZSxx2S&i>jB-Uc!y}%I;mLkHX^UpYO&G6p~c<(8%$6d?O5swQE{C_65qoXG& zJ0nI5dm}pTh}*}#9UyRYy!U4JW$)#YF?>Ry3FOY#FdcWwl_;v6vU)w8qH&Xx@8$F7 z$9u2KX>wj2pPf}WEBq@+awm|Hf<*VE<%b&kF+$p1N_9(tcDxxRu-4p7k&uu=tl~abnRL+*{u^E{%o+BeU za26$3zf;!YkdYwHqIRiNka@Ed`TZCT2c!4V*JqRJy*j7L-fXn1>j-ydcOrblPv{U= z8%AIEo7MI5*W?Un6@-rsbeM{MTfj?_JS2fuqge(XD%G#a!SXkD)pM-eb+uj2scN1i zan$C2Q!q@aJ%=GY+TTGVsGqac?L1Agl2f=}?m%~3e(LoI#n61;-|fLh_iAsq2dnbc z_N#xRR$ekBMDO%6P2mvl!SRtM{T_(dX`Ej5;tjb{dgZU<4QO0kH-*A1efQ$!>k8zq z%iO>`znS2t9J?2%<6-{{?tYTtJ9g69Ad63m5>A~4-0QtKc=>GmKn@|?NnxArAumTe z%m>^+nUD2O_3O!L)o^&j_TcmGNtV`z1!MHx(E%`_7ibjs`~QK=_qsS$BAP2lAWyk| zm1Nx_EgYc3Kt{{k#_3612hJLb74pz|m-E3gX4 z({l;0QNvPQvD9!0`L3cu7in~4k$#hk+{957%Y#g^w<%t-sCjYP>B3D3gxG8kyUiOODc)-%mqAkwUdrZgn9iW1sI37ueqSy83v^kP!`7~KQDttkRcpc$fP zNA&Ya@}Fn~7mF!0A3E;@vS2CfN=}3%RFI%efIabGq9E+#&pBULnR!#uYPht{hT}L$ zNq=cn+l9obv?kqjNlRbcd+s~rPN&=LHn6*X`_1}JVung8MQ2ofhNp?*$Xix@^IdhF z&z*MhW%gS6Uc5Pr{RLQj;PmD^t_@$B^R~;mTst>m`_uK^0qloR$UwHf$*~hqhbmu*`I#2JHR%Lmb zC6#T{cEFd}Na}mQG%rU(5@SnII?Y%fHPU@VZuNyCbZxyz_AU_4Eqjmx`P|M?6${Ad zc7fSqI!M>c3hLPeWpX;-Szzv3|28SsQe9t4qR!j6{dq*|Ja2y!8T%RyD-gB=lw7GB zc%xDzhallm5;brOKRu0V2dBfVXFxQ5bIs@VtXkK?El_X^ZDJ{qAx*(Ge?jA+FtjGC z>@nu5>2sAyu3+ovNm=PP&sV|PM4)pXRPF6Yc45B(v|vZ`TIiA9yqT;d>w4n$OYQ~jpw33a2ve7ke z9-$RcumqjuWuJsFs%X|`35r7$#ZOE<{HQ#ky$n}vkYX= ztc7G|UBuIAaxvj$2x7~JL7&l+aUwl`zAs>JNU!)^GJ};eIDIEh zV?;9^4&syH6%xa_dNE-j8uH5(J2hF)%hB*kyo7D;+3_x&goNeCQZ=OLE9aINLxrgU z<`(7b5~@NJzcuZC@=Yd=ud*MBPz4sl<*<*HYbpk?*R0Fw$0UAFYZ57~!zvrCONIoy z{AIZP;DhP^2Yb}{7z=6SW(32IzX3Mz(^M`nBqT()`)uc!a0%t|{{U^Gy^njzzg3IN zQ6C7Zy3f+_1rvg#m?44>XumZWS@b78-o|BmlS*FLQ z&@H1W@PNRF1lml!pa7w(YWvm@iiBsZy9bltk~=tsz5aB78#t1pv5ED=yar7a=gAbi z258}amX0sa->F7PwCgJFR&v9a9J~YG;RG9}Uc&Oqsl2`rx!r-Wj8qt=4%ttB;aetHVSi33VA@&XTOn*Arx z0dOT?QfGrtNhTNX?PIQbV5BdRLkG()7pPUZsS=3Ph9zALjx-k%HUKZm>@12x8qQsa zLW0uqSI8JdsuVwDL$25XY|gK!C4uaQ z_lFk1%yd@7WQADj;D*BVjYA*R(l9ZJ6}qZiNxYIHg-2uMP-{PgSi?*_omCxS(Rg8y zVcX*;KOOKW*OYIkXa36Y(Yl` z(2H+?T&!_uix7)%h*n%c-$E(A2}1DZ)>2^*X<2WxCE$|6K!v-HXyz_LcjDnQ2)3LYzm zjb&moxt%5M9@CWg~@krgySO`+f zxkip&Pz6Y%bar6ugZCsVsC_NQs8JXUDY(RVLJwnZw*Z=vzf!j%ZnD>b8$X-td?cmhNS%>xT-7s(myYLX@1h)aVH|q z*x!CDn6zHr${&S%irR!6@+qqrY{*j^1(lIce?Q1m`GO_&C0frAL_$^C7Q!pEG&Jsv zHb|)Xt2?P(jM9a-?`wjjF0KLy+|+Ljp8EH?0i%MJ^g*jT@ahh{x&zbDR?!7`@ow78CPwfd6E0$G;oQaR}bn9a4o&oKv1y2*mPDj-g#`fls3( z%d-r-y`tYJ76UeS5Q1s`o{fN?`vuQ+j+~s&$yxXoGEQrk;_I}5UceY0_Um_pMyHGy zAzHK4@}KH&2{?J9-zJkV@f)HXJ4!Gt@bsx@bZBF==(ZfXk^_f$LlKV+afh~Ad>(zx zHT^jp=h<#b%8%Re47Tq>mNWQIQU3X2QX3Ijn^ucyok0(rw(GIO1+|g>BrZaYY%5mc z{_I9t+^7x1eFF8%%?3&S@4+peY5)0!@P8ZajTQdy%Kmd@|GBdNT-krF>^}qcpSOUV zTMT166TS9EkhLgy6hqY7sS40mCfS)Eh{m52$hQ8e(OwM7cI9UC7xe!b<1zmQ@P8X1 z{yp;Xf9svrO8#5Pe=GTKCI7ADzm@!VQv_TEtIG9-)I*Mn60HNO(bs7cax3+xtJ~yv zb;!~p?hIam!bJ$wp^y*)NfuyhAa%18O;74ky$W2AR)^P z^NitZ+225XOum85kIYKqGkl+Pd=3x4fW!C>ZMZG#KM z`-I&yZLX(}DHTvw=ijBva!$rcfGHQ`O6UdeLYn$L5|w< zL^)-d9#E45%h1^C)|czl&pJU*igMFU(37Lwb`!cfp(7L2gw^9B2a|zZM<2%T6A!u; zVM=iSV31nGlvVR-H2%m25!$kf4W`u0f}Xs9-2P;!>s8{IZ^Tn;T;j}k+Ht{ase3o{ znrKEqEw$6k0>UKPaS(3xbkvWM|IliM(vNX&obV<}MH**O9+iyNUsD!=HGh&uSdhRc zp=_g|?5-?q#?&wVc+;6Da!a8v&bC93D7=S@-1y;Svv+p2*;#wK+7#{G+6HZx${0 z+!mgv@^~|_A>zcp@m7FDtgXOahqd+Gk`3$z)~ojoHwBAQXm7BRi?#?W%b#SYDBczR zo_hh&;++5`AHyN2u;{$Ha1O{Ver?Eyf|i~siMQ7-;lv$?U-|Nf=o zzp>d(?KBknttIy1&Nmpb9`$u{`ffBvtcoNF3iQz$EKGLX7a(6!rACkM32$NN9LJQPso@E_a%cahj? z*p{U=#{so5&{>awCt^m&`%;QBKtm0CdKo0G6}ZNlldC(af)n* z1pJMDsHB8)oc-`df+oPi#~caS09Vj^gbA-d5pDGISd&KH#=G0aBtbujs0eWcc_MWn zZi6G}EkR>|n-=nQZ8(xLdt+5xcdV**PhiXb$arMIkB5jd_95X`;Grjd8qq^YxkVvU zQOGyTbc!YxcD0Bi&+SE!M@4V<bp-=VZG=b+~>d?1(|*LmXOPk-bRy zBf7q0=*UA|Q2@;l;Q-HtH!#o)>-eR=63zRHV1qXWkB!i@fEaXL}}+NM*2j1|th+j-19Oux{m>%t&;F^CrUxhe?*C zACjEM7%ooBsGJ?0@GRnt>w+2YthHeYBHYtWzym}GJRpZ15ZT*0;uS=u*Q*lcjvZKe zt7M!fcQXV@+3{dSPt~W!QFWTaZb;)p?q66<#h?JxX@9VK<=OTw&ClJv=W3r*9T1Bw z9u1~f(gRD%;CkysW~wOaqIAk$Fr1O!^XL%{4eww;exVb9ea7v%+xrm)h3jWV^;X;O z^Bo1op70QJn=Um@wa$#Wba11dq^7DqH8ViEVCTwm<(&V4UBK=`-mBHr-W!q92@ft7 zKhV)$JEziob>9$)_d=Gs6?uY^N>0B~+W!2kYr#s@3!Xae7x4JuX`x#vHwX4(Qavx5 zBwr#IY0m8SP*)k(cgRM6EAeFpj7C(5q9Jm?Lkyp>5c-WqopIqR^!8WD!4}|lrncdQ zFljV`O<@%tg&8&IQv;_3Dgw~aI?G9Y3da?1qu)MJZq;U~E8=r8 zzIezLYqAb*m?R6Q4jg7?T$6vvW#GSP{Hu;Mh8NpBT`fY#D;! zKP$zMpZ32vED(WU%B$AiCy8MTZQnlHuffXKsKA(x#MYl`-_kLuGU$#rqVN9WKcq<1 z3`otJ7f5W8H3`RnnLYr)F`=#Ug+rB+acK$TcC5xlT_ZB_ZanNu{9B^uT;!Y%D@0>a zJvRrCB?{rOL}cD{f#V@fCZ6C)RB+9Lv8IqqMd>^>EBQrHw1wlA>I1?=1$Z!#9Cbv( z?I$6y%wj!qmd52=o!lwv%-5 z0ZpZ#+zBo;4+zExv4hd+_ySfLyL4j{)%{kl6Y~!iYso`ePTkEu!M0I{Jlu`6r%2#k zSnRkRg?foM%^nlm6o#h1L2)+N9yfF9Do#3`e%ka4k(l=}jVBY@NipO0RH}W)1W9Z> zrk^kkamU^8P}a7ZYOZrUY?5;iRe%`HeFN$==hf`eWkY?cfFsJGMB1+0D<|AI?@NL| zwaEjVDx96K&H2bx7!Pm4y8npwb7Z0^FB^J51zB&>S>EfNTn>iN`@~z5?K(g9%bIrm zZ58eeTMOiDKayEtEzxwLhi6!p7nd3AnnPHt{VTf4!V1FRQZ#XvK_xIi5N1h9Sb`<+ z2z(#{^~FLWP~;RNc$!xne1wX@7d8T<1vemLmqj)O9}ocZnC;fPbZ$S}r)zFt>Oy9B z`mR;(Yp-!VYECZ8*PU1iq{`M44yEn8t`5<8p6ik0xUT%x1F~C5O;9Z(!M}gLyqNF_ zDRtS_4g%Ap5ck}K(9)0@jFZ7Y8E~$AIAcY1r4)sx(v}*2LKT_lpQJiaKNO8ErK2!# zB2gYqBnp9vMAyO+VJHzLnNY70kRGjVtv*P^_Ny1Y?N@u-_^3v9qi{kbut2F;!f`72 znGq7=G>vt9i|Lrx={Uvq+gKzq^G8A3*)lmap5+B>3zh$Z&nXYrq?*IblyN%1XZWF|ox~AZ z^5JFqCl@V+dXF#uYl{)>mx8hjzn(B7=E+3=+eVrLP7N|>7>$lK3?|#RQnO$eY^!YL zoUYE?kg>&F(tA-cnk81*dOExC`;7;lWqLF+m{!g!kGY9k=p(c3e{Kf=WFG!U2mbBh zf3#bTmHp3O#r|h)eFy$8F(jy(GRxTkiGyjMzzkngaly`9mnrAGh)>foySJl`kf7Rb z%O>a+jDl{<>-4tlf^Nq!=+-QQW}61xqHWL(jDv2&-&EX+zv(p%gs`A*BP5n^IK}dX zKBo&foMQRwSPr>%LrCSCrbA2<2^8B7Ve0ML58Vut1ac;63iI^t5yw-5<%3YN%Gk)> zPWyutR@Cr{W2Rk=FJX4WAEyXa{U)QlkPDRra80k>)kf3{!=UK@X5yg;H{Z3PQBbZf zhDNbdXG5b@|D4z;?e1d8D5XEK{dabieYh0>kU97tosHIpZ~xuisITO|zm)wq$$va$ zt|R)qCskDgpV9*SRmG=@ zYKC9(laho~3QXBo|Hc&dHPtz{1UZ-L-&OIoQekiDkDIpG%l)-?@Z9R5gX4eyK*T?J z4561hpNbu=`i|fyM8=9dhp;atj78_x{~fTw$qJpYMWDA;nXIl zHgeoeQ+zBv!#L8~!UgwYj&lv%yZpY|gSCcVpDf1p^YnF<`=%7#5r;|ASGKV+M{hth z6Raev!JXw)-2Gqtb+>x=Zl2oz%8Wc#x*@yC>5vX_HEFfKtYrL$z1Q0>de7e+?(~k~ zTJ~Cups^wLc^dvNCRYr7Hr%pe0U*-96-op$e1Ol1)j=5SA+}j~1y@1SbyYeTpZIMS z*ywX?G<~RwpVrr@^>1~fIoa-3JD1OLZptAWJmVxCGclanbgG(E;Z!vt13chp6Wz_| zY(zh>uFZ(-NmOEM)3Tyenc7fda4z2(RL+e}+p>kI)4Li7ZI>93`(r{@f|q2&{NnHp z24v3-yJOvgBxng}+h5}wU5d=w#C)UVBd-uz`l|c4;jbg|x2Bsh{lu@wI4Jk(RPspK zapQCu5Bu&yll9QVxVzh^ZQzQjZQP}z#)TdC;}HW5!B!02kSW8{0fQn;$5WX0#v}86N4Wd!nxuF6qx~J&MWX{yJB3? z?`TAvGh-9TbB{Wj?kv(%iv!;e$K&@P(USxJfM)N%@IU_ZU*cPoCam{4oC0^m^U-#C zey9O%)Q1O6^^b=2v912m!jCoh5B?^ms0#_T$9*L}8>AUr$tczcPKAn@@(*Cw^9Nlo z$KP#>Fw=xtcKFo1#piHu3(eJg&9=ZHh^OD6U)*U77bV;PhT|B0Dmt{sicg}=ZWZ*R z&iw-m)ax7h8ZXC0UCG#zkb0!=nye!oYhhH;LU{;Wb3U_QUdVHmsVOc#^JdN=5T7GZSwU=Y*OPWw=QtWCsh3v5kvZe;UCg>fj$6w0r#q zBtAkB^uvLVZTzFfDM(0uZsH#e^O?I8W#p%j0r$n}QAA5iWx;~DMbO3(sZz+*$(b-~ z4jH0(J(7Q|H*|6Np(+1v>4cj1A2j0IC-(5z1locZPRnLOlqczj9!nTjxe8}($|4Qw zpLZZ4%Wjo}hDOGinvKN(=c4k=gzuPyee>Yndi~RmTA^%*jzLXfYG-bEFa0)ethX(& z4!GRZBdiRBC&Lp!rscvVG4SQ7;m!kG7eJw5&G7)iofv<$aDj??!s0U(kQ74R`iq8hoU(DkAp z{X|T@RqH7_nZqU&tZ4@sY@^Tbv7tVMM!WQ@+}k!yHkL0SrV{xk1f*UyWANpfW2$hoxOI-s`yq(lw8j9cDyL1#+9fG3*W4)dey$fn*-S|(mJ4BhEFQXab3z)HaEPWY1)xF z;$9(O zeS1|~D;X+)$$2^jx?&h(k4dQ%?gJm_J|Gz+g%{ua=tIFBEO)8O&&9x9Y=KhFoot63 za&t!#W6j!qTic**RqdAEnF2?Ws2u&CY>SpI z6t#r5y2Vkf6lzSYDSEVHWG|ZiI8~%!^jUCU=95KVa*+&Njqi2eBB6g=UJ%koevhL< zM>|%DM)U1o0WB{4{y#WP$0x)1m*iGJ;O5}JH8vW#_;1aP_UirrulN36hyVx285sfm zYXFPvQ&sGbPWj0nXWBEIX{(3-)x-bF-gEWt|7U*pUl=ZKF1!J|=&!lp25TPJ0eT)g z7d+RK)%~>=005X-9DPf2d|E;c)7UcR4*z`lYL~1VBle^jpSd20IwJ~iD3|RYzutSr zCCa+6SQDL!OVhZ&e5yz%asE{`brOW$jq&qvMkrn9g7|rk6S8@SqTv$()VwvJQS)-% zUCK*qO+rpd??d(TgZj;M*#XUQ%t8;NguD|a)WC1Q89+Jpk^P>erw@9AkMMlTPSe4J zPnfat;3b!?nQ(XH(quu_k<&doTX9AA@1r|YF2f9X2gb1jrUqw@{?i6%V5k?mXP?12 z4`bMO{1_jm$@vBaCSSvmkJTl=#uw_m?ow+3P?Nq{oG#3aWud%PYzF{u`|f!(#UhROjB^9M@1#ntB_3J%1#ITS(yQX6PoK_6C- zL9_y{W&;U_TTAfB! z1n&hPg@w#7PF%u4-5a1n>Dm5^-rnKv{`Mj2l?c{|{=%4S=H4(JkB2bPP!^m_k~pPx zlYk_2M(M;Tiw$3f8Em6_rj8=lsuaPvAy@Dn)+jN|L96OefheKrhks)Zfoh zBBd=&zQ^8G2sGkXaS7eiMQ7BXT5q?+=dHW=fDES+;{@ueu6Sjsy4CmN5ZMz+w$VYl zM3mlx;$a3o@@WDRx}mI42~XeS!}c^qWD@c&F>j52rEF$nIvL8VH+NixMr&Y=30Ipb z5{6aS0Tr**bh+h^N5BML-9Y@mWL@gX;9M0)&0jpq^JU*R=p@0{9wDE5B#m`0Of^)^ zBR-Sh3kmKia6%#~L!7xD@N5{yp7wB*;P#A9wR+w>5iQ1!lMQr6jWD+u;D)fkY_TR% zc&3pM3Xp^r(gR@$P3s(St}3LLxrLx9gjr2+Mo8^waNV|=o8cWJn4s|Gq9Rnds1O&f z5R=YD`E-t0*)n^>Hb|SFON(Mr5}*i)UvOwJU?aK;7&$E6z;BY|i~sq}&YeBeg^>Hzlna5!Uj$W781@2%=U*9%se6Bx!LrkNKdmch}V| zj^63?O^)p&>A)IUhQ@uIr*JBP6v@UO?~`OgASM^k`Ga*5FBu9j1BtzMUQ-8n1&iU< zKRCY}!xqE&Rb1Y|~`!opETLxj;4s$3|aHDIShqZVaO& zYi2}WQ~wqN3J&Cek?Pf$Pm?bzOYh7r?IE@SZtoINlb={?Z;N*sFUQk>)_N9t`9&S2(}{M1`s3iIji=5 zVAWwk|5~WibV|^kEsq8LrXFjc=*YuEwN(VmZ2tb-S}QB8C5BIqBAj4>8#dwcPcHH4 zn(&Ghk3$$R7n;A$cVh=&+T4WYX`we7xXBve`I)%$!5gH09M9clc;x|kyfkB*L~Bbu zhUb&FEV*uxt6BI`xC}SV8*{VhUGATjtS&DiB(j|(AdL*hm#MyZm9qr5@3S%PeV(PZ zFKN3YxR~4xO{>c0JF<74R;3#Hn3utwo|8K%1EbHm!w2Q);{^ol{8-JKGS|HoIHEkP zKlxj<`6A@TpqR(kXK!gckVt`kmTNu>0Bq9)k#PGbxc5pUY>7Wf{H&!?<>U)xh|`!# zT~`1oo9=MV9(BjoGa;Zqv^w1x}@Q*^ikw^eYp%EaZAYvdOrRZuSKsw+SYYa!| z=)UNC<$gJbyja=tN(0+juBZZB%w;|safpN5XIElJSNS~ApkO~A($PX}oQw0g_?2ih zn?J=G&RVqX7HOj)%81ZgVH@W&zCn_<|Kb9EmM?JuR`{zyd=>RiC(>*}{03qKlzaMA zG&+c$R{wMc|Ea}+;S%0sJupk_c+V=60PRq0FvV7*qbUMGi;}}})8QBg+GZJk2Y7A< zc*c@*m~JxDNHfoMOL5)RG?8Qh+by@BLzBkq`uyYzG^`yQjKI8|-O`pCoj|4emT$}+2d}#y8%5-Z!SQH@)DkR=t91*=I3t{ z|I@Mmx-kggJp8|QyY1P3HQJ9>_$E}e??Ycb3y;~Yfo)u3%0TaTiJrGY{C9` zTd=vQ(=lLRdqSmW zIo+rT)Y&?gCOSt0b95*N8=vTuCZ;^16w4k(C$})UYm$|TicD@}@?%Q2Emm~;2BtUa z_-24GPx5OAzGkEv54?)#T#q0$O8iKM#eA0sfqiRq>sMaB~ti`NASe!{bV_M1-4fVr4*1fgtV zY*IR(R18!$KG9rl$X=2^JF-LM&quQH@@H2yRQ`UfTBQ11_GhzRGHuC0(^#yx*s7Ms zh|XyrGz?)UT6PK5*>&BC&`j*d%TdT41M(}2-F1Sss5r!ENa{8<&8<=~OERqh8OIFD zAW2zJPYmHE$|_tiu4T5j!EoN_IZmTT-ApVf$9yh8fP>IJyDlz|bltwv23N9e8+Jd@ z9B?rbs9kb@lBR!Y2lAi^ETc7$?+I2U_bA21JfOB(XmY9<)yVTjrcr~@d$Y9UOlQnI ziZY$X!@exsDn+C5MCeBW^6}{>!}v;M!!f@=51p!fW@w!#G?RSo8s^c|uOq*6Kck@I z_NE?ie_EK)VhpCL0l(5VEM#VRA;u#IKuov8?lEh?hW2_@X$>pwk+pNl!$hZb?JY|l zB|7o3y-~@7#Pq6O<0^H-ObrbfCCas0?f0Gu%|Bo&lsKd_!rWNkZXXjmoh8X-Wxk_E2b;dF~8CD$dC<6j!dhm z$vgrwMh;-KlYryg>GTrVztT3{RjEyUr>yhvTp7rBb8M7nq^0@-(?gx1Lzas!jzf+j zw69T2gC=m-A=Bs-(P_@11A>K3sMRbY)Sg4A)pQ7T+C_xAa|m_XOlWt|M+^Fk7;P)! z(Us}_lXMX3)*!7-xfSA+dF{^U1UdIdz z#q6D_xoK*C7Z1bOo4b?jKDi*tE$F~ZG8H}mo|oPT*5x|b(!|HMm$cY4%ImLw*Hv3j zWyZ(z#cR9eAz?HqWn+sQ^GPitXd|iSd{PU^+DNOtbPL1cHqz?Or?rH{?O_rIW}cC| zhf2I{EFstv@A#g1*zi=Is0~KLL7tKs;bCf{`H9E`#iTD^p$>}+? ztQk$a*Xq0CtHtodYWb3P3#aU|my1~))?KW>y1zqr@pWdg!$7yG6nPn>DY-AiXw6mW zPjF*$d1^Fo|32hM?)pk(%lZFj_21vk{%exm3i7LE|J5$C|9Vt!H#&a&*ZQMJEBmj% z5&mmKi0#qz-FS2*UZfak#EK*BXRddJ*o{97`tau{xhl@uc>K77H`n?j`m+GwL5 zr>F0z{X%e9S0^82cz7Bk7}#{Ea`{XlPwbWO?9B_vVR;AO(a}48{qm>>lVPu15$yIp zp7ij9DC^j^Gt0mx_UmVg5to$fl~B!8iieXX3}lr}FVD_gFjNYT z1!pIh%q}N*Qt`Q$#MxkYMK%z;5hx&{uEBhg{y?zOvACQy_M8GCuN=z%7CVF{j#W_N z7vGcL{jWTo2!6{{0zyp$Lmvh#P|c3K#j;ZkGfA{zb9n z;Ks&OIsOOpcbjl9p<_k~29=8u1C3`Awbnrh);PV2ENxK0T5yu7@&!F*kpLR&qJi)O z9y$f}HltbSStd7xif|BRF!B`w3D_eLeOB%KC4ho#s{aLd-&_--U#*MEEWl(YpKGO6 z`XNJ_>UfY^ZPZWTB1QR^a# z+xeR)%+f;{i1C0brHJYNj}KNPHhr)m1uKqov`ZpJK@F{@RfFVbagKMk5>u#rr=2fv0Zq6GpYb2`M}YqV?ll~ly;I4RAc3UeLsnz()}N^CTRuGr2Uzwhms93L1v*>RRLxOV6;%A= zLM|xvjsIqf4<7hZ=`Tfc=;yG^U6R|<2-a~nNlrx;U&%cQhUsn$7o*G3d(_5dFx;s3 z93rSZ2{H1jLuz7Ld}o7X*oWK4C8_3g4hsx^g0@^#_;N(u08@lia+awaBoev7NP>Rq zxmFX~BdD7;Ip%ASkqXij9jQH37rHA^gAv^g&E!77{+eWF{g;&9Lt+u2Ht{?eC8=`S zK!E&oJV^&+V1$>+ntfwcV_kxa@@WtHv1eUcvNB=5j?eJt7&X}DY6(MD)k2V-F>7#R zwjh}?7skWp`>Xy;v>BDok?s4*C;sYOV)?Q`NQasemLBD^A{QW421bWL^x*V-{b@2J z6aMTcBK)@EUNQ9Df$pHvj?lU~U`wR9#8NspEwQc<6$Um;<{?Y!Fu_%M-eF{-@%RD`=bDo(BOIUD@MTeEY3MVU4PK zez5(b_iX?5aiwC{Ma%#R16JuAABEY}tpvtJZ33TJA8`ocf{x^FStCyEC@W_L-DP!? zKW=V;N}vZzdOlIl5ORLuBH^4%td)gUKz4zeef#$R!}h@es{pnFYeL&EvA35J34kDK zVQ^CP<|nS2Emz8&Gm8YZ(y`BX7a{MVUVy+-m<cI4W96Q*y2;{ZKZdTI}B|cbkQY5!Tc`cXXRfRpL=n`5-$@11k^JH59AwiahQ*|N5ad94Ug zrIgu3H7p_xk=ARtZFbw+d|OdU8=Tj;7$V(T7`0%r;u5=MQi0yOY|{+&b?7HZrue zUW`m@Bx|?BetfyVyIGK?A^{jV*6q&R>O_Iq=|6g34EN}T*~>YJIVYUGQU z^~fyFtMiOeFcnpzo)&Yt04A1YLCqoO+_J7|a+1Ila#;Q{b7N+=EH_er@U;59Ce9a{ z8?y`)=AQ0{&gsq)KhF;JGR75ZNyJs|`01^ln4<4Yj)#5s$;h0B5XANw@k6kV^J ztMjn0g4WH_)aPC?b$tuHQq6gvk_-f;lR$W!l2&DUoX)%=+t*`LOGQ1wxul@g_M@57 zz+WWsNb305yg*)i@zg#^NbF)MJI=IPHx};({XUv>SV2HI)r@pQ3Krq9e3To@M@s9Q zf9!uE?$o#BbD7cnhVs?79M!0$HYvzWsZ!TPoUX4cxlc9aTXid?zEe-DzKpARYK6SL*7drf32&zRVyt`^#2{u|BvNyXL@$z4xIhoG3;TIHEapl5 zMM%=?n&&~cu+w!|vW+p%^2IA#R2-pW$)no`TDd%mVAM zsHpXNF=sgnSIWI@mi%Lr4Wkt|vz`_z98*zlH*@!t&w6xy!S4o3%^cg7A%s!6TQRy9 zj3!PRb5@QU#eI>M-2{oID@$dOih3aayXyHOQxE6AfC_)vg46Ld9@5q7hwXnq1Bv|b z&GFvuQf;*)L24_l!jEDISCyeQ`KM?N5+M`SN(RIbRv8+r5g^CZAT2?rvWy2o)EDWt=`l_QzsCv9>014>*beR#CoOIzJAd9h>o^}qt>haN;uEb zp%C_Rc`X*qn3W3)MzXim5aB@fQrODHZB)();TJgTz{XAQd0ste2$fxew^AiDD=Ke=Dab& z{z!15j|AOzasmk)vEDx<2Iz%EP#+p490i~saCt~4=4@=1nk42^(NJ`0ChHNfU1o!R zq8wx8x;?=t&skoR;dZ86D$oJ$?b98nhMg!yqWN8}^|U%Ld7+M0X>-H3iXvx&P*X(N zh+BRe?m51WxC-{3^?KxxsXz1AibX-s%eJwhwiOo6@iTWNheZc_VOy;VFKjv6P3!E* zEA3vL-NEjs2X>>XBDhD|3K?$~2|SBf4wH3%^U)@*czkIf%q34m=OpB#&puxTOGwyL zemrG5QMPjR_s+*+IUeMpJpW8ykTEl)z#Gj=JD`>`QSGCqqQo8}WJq)vCCLFrKg;g{n7=0j?{tN49k2N3rH0)-r~* z31Mx^QznqLmtY07_MGz8@&T>sGl(j=fY!!^6^7loubvK*IPGbuOv_bHhqj(E=ALoE z9c^6T7}DG+wmAqz)fF5)+nYmbULZ5lS9$*j*om=>@dWkjRHB3kF?6^fL$>>9jz*_F zqXN%AuDAkuOU*U>kQ-h&gA0d-T=@h2RAISzcsUT_tL8@a-QfJ4ijORW6OOxe+IXxZ zK&uH>(Q&!An9?|vl!oJvM98M3!f-!og(+F#oGrE*O=e3?e4AoZ@m4?0Qy>gh`CX( z*Bg&dPg`B50C0x?y9G8>f%<8utqV9^67?CrIyk#q^5nUltL3fd=v?Ry8mlKH}pmSCE^-`)36t7Lf%_+*D=C$-(cX6p}Rhe-zTc-*A9Mu_HKMR?6a%RNuqFV2vJj^+E|{7 zgAr07hMb)C`Kwweqeg`qgI8Xa?^&Gb$sn@9#Q;upM+==ndl26a7B=>>Ej#kYG8(}m zLveA52ZrDkh7rx>U+V9Q1kDLvVyy348>l?O<5cI6&vk2Ola%i`&Rtf6>u@oxT(j_Y z4CaZ#>%r?R#Y;GcKQowTc1q8{N% z4H|Ki#r18!m^ zAZPR$5f6UCnecXTz>}Gky$M(Lrm(U_z)g_vYG zrGKKF!JVO8W4F|?ST>p531qpb%M6HFpfl$H-Nx#R?5TSm9N_^C=h3sz0i5|gMpbVYfBc=h#6jFH07GtRv89_H@6!nuXi#A!wmD0H_=q>lc{Dm*aMOH5~iVNLb z7t3p1TuUKCC3W1IQxttz@Lxft2P9gDU*U=Cqc4>g=aTdUj*bHuykDqWSZ`D+E}qk` z-ll*Ao~X&WR`Eb)3&>Ws@>E8?tIg-7)BtXeETqU_55|%0z9_i~D+mZ&H=rFb1#Klk zF+rQ2e_QZm7`wN%2rGr$d>b7Q-B}u=r^N`w*3xyxk~h~NwVWX1qWQ`-5S!Wi$3XoC zw)h3yl$Qkd%{dOjBvWjLwNXWmrB)kUm(SwW7}Oeh3#~}q;bxnsOk+0cTgnt|8D>NFoL0{c~t2YH)y}21z zA)i>iDF@D+(Alc}pH)0Q#E#XmA(SToA=?d;IGZZG(6HQ&9$>Kz9I9_yd2{4IA4;3# zyuPur6)5WKr3@(wY@jw>_fT2HgNKizIu@)7RxT|lPI1pn|4V`~)ld>_JmuLYEZ zi=O_4+G_)9Sx(0w@SIvV^%x?JO6g@!RWRw?j4MuSHjr+B`zAtvKHyn&EKT(`e9YHhBE*@s*14z#( zfMzmubkpfHxyUd+C%?lUU!F|TF>J9H8Y%(S@(0)xab2$SvXhU1nkqf&ss7ONFp86{ zW)w97Nr#-)443M(qo^f0y;BfO)Ir#uMNe(_G* zXSk^F%RuEXoyxtsJ?8_J4V%o<2&N^Pd=okoZp|N(^h$h85khBuUB@%!FtNGEGrSmR z+S0eo^E%_a&_XY3r|kugbpxL|(OdI%zs%Q-_clo}PgD1sp=#Ps#|1vokML=M17yOa zoDAbBL9k;#Pysa{g&|{gT?l=Rk#Q(g(iu$uM84#=npV6n!7rN+k*3A5u}{NV+j0=_ z?GZ@g`GyL6nj;Vdy49;$==s&i9-0r>F{wJ}N>jW#m(QI&>pyL<&-%#M3 zcyz8K!4jgS9m?!uA}%h6)4>D{39dw2fFy?jdsrHX(b8aWhWfoT4AtsYL_4d+0yOiu zw<|>MF*BFxx$vJO0)%#RgkW!LE2ol~9Jx(*DBQi$f??!h6)1nYrmb%JBA7SHYxUqFB@8G-gN_2_8SlYPB#k9EJe~sa$r( ztb!;}?TX!S&WrU?=#*?M#_aQ`*I2DqW0(sBVZ0oowi%`&9F`{xWPfKS54`(y8ihHY zbB^}Ltajjk&5c$u5vJ03G$V_o(t1=}k)+anT$qK1PKd{?**Th`QGZOc2|E?15`_f= zVOdDX;ke&NcfvK%{D0dsJCJlr+()fOG4IdqeD%hR&NLY}>W^pisL9uE&d6ucYtQJG zU7OyF!8Wacf#~>0iWK>_kAKhvKGZQfkN(vVUl}H1NNby4kY*~5o8qgE`PC9%na+*d z;;U{Hnco}YtH<{5j`*rkw?90B4-MvgT(S9TaU+Pw+^XyFo zSHny5X?u6~O#~C$`gHv2Aj;CA`Ealw4F|?}=#H=9^m*v#c<6gP^aD)v^IY^jHbm4% zMnbX_NMe?(aIh`OK4SYq;Xox`-izlBE=~ z49Qs(n=>f36-A||&C8Xvd8_1n2kWjki-|j4-Em$VzS*HGj<~rThi^|v!$IP(E&Y1E zcq-K_yi7SYj-DC*l8D5sFO^Es`Yx}%ZW;&t}2|2E-$nz1HNvNRJ{M{ z_%$vLiVt7X0hQE053PT8+ExbZJ;%x$`s%#>sILdxTy3>ryHyL09;eN7v@E^5_k8=! zf#N$514_MA6=qhar@FJ|%{}>Ey(}M|1?)X-nO2y+c=|3;tJnH@wYmxi=W_O0O_444 zlC<})*RQsFJNwUJ%IqEN9-C!vo6l~U&z@OV>iB362=4Fne%yYwzrDM^V{gvx z7F?1q4r14eqDr8e{Ct;*B{gdnH~J~h6%Aj!EJ``te!c(W9$s&I+eiCwCAki&&OQ6q z>>&n-W?j$B8M!trAyEGPhrj=UFkd^ql{)DCuT%8?*RD4@E%*Je(RtKpt=|9sD(`>% zA8Kr9&g5SH@ENa)e|D>|9_kzP=Og;_G5*=82j2JSeFIh-;#?*e0OPsx2H8gg*)uc+ zTRrcsp7&PId#mTYrJwh1`*qKK#REwv0zpE(Ey1bERtogGWPipFB^56d0gmJ>r{MD- zhq4fJH8Cx1H z3j$xU0j5#4DBC>|cUY}Fo+g{P{NE?ZMBdOO7O@V#u0Xgco)z3=5Sus~j;9>(`Vx(E zAIlH8nU^fRp?s1cH9}MtaBld4bwtH_$CP*cs0KnX_C%)d3d=)tMKyFm#jkA*gHfA; z^n~QGWll{C%~Y0M%b&GsaIyJV^XOkKbU!8}2B`Ms&W zPeGtilO8DP`LA6`J+35>dA>PklZv>NruAl6XJ7sqW(w%+r226O`Z8jo+_T9p^D0^BNw!FC*tCPcjebyuQef`TkELnzB>>o=$>t-$t$b2?aP+yqeEx6M2R zuGk)uES9V8a_L|F3GC@|iSm&;b@me>^!CS7LGTCT4+c0#4wRAAFK1*g-bd%}EW~1j z3mar{fo0JaO&haQ?~Z1D4x}zoHb5Ash?ZxUSZ+{I&zFnEAl3bzJ!@ z-Jr9H=Mty5Qt`k3+KvrW^Q)_8>MZ*AFH{L^J-;`l%k^v;QIh?#EkW1^25k39J%KC1 z4+?88rB#|G5h+dT!)0Z4L4*Yaa&n}{$?K^HnNGrr2`JnO<^%+*Cm_g8K+|1wNzOo^ zXCQFQKw)8BGCu{u9jBmhx0_SYTs;NN+!TcFn$;9E^%OK6Q&3n~m&{K=^Nv$cc%aQG z2v<)*n45x@yJj^7p`L=!F$IN%b;cGs+?prxmv<(PuP z!n$OB3R-uZf_ehS)moPxre$DD%B>M7{t zrl9MtSxrGlPeI2q1%-um$@~;_?l=WSm#Z}e-PKdj)l(qU9BjF(R&&tRbI>*BK&VM5 zEUk+Iw0g22U0+BjS@fct^*SPAtyM@cqIxnLn-T$w4&MeB{qeN2=sbVyxAfF4ItAN&qlam`WHdfn*7$)n@LLW&S*Q8oiqYG{zt;rtci8>ihkY84c?RfWTTW3wFiDlg)mG4}qf(N29a$N~l_9ZYnbDv(wgjF*H{ZUjN zcFh#b?kjLr4gvU?f+WqOc}aC_?Y9*1g*b`GS*PncRkA-PsdQZ9Fwg(Cb74Uji$S z{h(SGr`Yv`lr~bAt_~+YVm6g7R;kOL)Hh&{qlqZ?6sr7`67Y~c$jZW(bz<;n3MT!V z*%e$<__-+_uW? zxN=)6x9!ReRc_0b+f=!sD>qQNO;@h3asyXxL*@F8T;L!fr{T=$mP=yGnbU!st}~|% zIUQ$CD|IH&b^?ScK+6fxOaVeC03bVo6J)WI7&c5)-utL!0yGbLwF|N^li4+ZG#I3T zAUIcXU(TGs`8l7{H$mpQbHPVWK7p4kEd%qg2Bk{SaJ`Xe=-p25_~0NYl`60y^MD$x zt--p>z*-utvkWZMVC`jKO%2vs1{P?ra2c4d!J5m!8X7GBhFC2b8m0agLsnpG7uR>- zcNJJ;DVSV{%9dCPCKsa8T@EG}qS9FoCKsa8UJfP~qS9IpCKsX-y1+Et4|*Y*%c}c9 zFGR4kx|3bKV9Tm|`C5TBoYlGYG;Fs-hPFl~BcHTQiW|P6xRJd{16y-rOKWaaEGRhq za)?#85=VjFM!?DsKHbEFc>)+`PS2lmCOqL9V5*HF8(pb&;rrWVRSqBT!*`o+(msa-N&)p~;4aHQL?m!Qnx-wY7i0r*mSdZBT_;n+$v4j;*LI#u2%L1&dq_gbh>UfGw zlgqV4((W7t<$WbXf}{gck~mauP?I8CPV}3?PZLje#+IjvFV0X>Lu9*SA!v{JAz?;Gh`1oHT~hm^r2>G1l zb;W2M!yOe4ccLB=Zq42AAb#Ir7 zQGiVMv-MkoM6;>1GNeLmGGvKx59k|CDw6XBQksY4Utp1c7VVeSrdPydJ&9N@qP|BL zJ)-KoNB!$Z-rvvx*x7i2L=h$Xsat5a?}xuf`+JA`eyx6VihohRb`nj`7Z+ujk}m>O z9_isiZkoqg826L%et@eFJLabl{bVp63-RcmKps9Kpxvu;ZN!zrT}`4hKj`YJ_RtU` zjr3sDm`KQ4NPsUetaS=l3thb%5vaVjcBL@%anpCe4!G7IdwU1FJ(&OAVAOYZb4Y-2 z^P$?W1AwPXM$l>)GlG2;8K(?oxgy)h6r3KsKq0SV(J%uRZI>YQqSebP$yJDRYHBm^ z685BAxvmRjJV6Mujo=ZE(RfS8=U!Tb8p48KsPoVxFI08MOo!%7_lNKM(?Nu-gpNUw zT|`ay2`FZn=BPJvte}i!mR~1Z{*Jx=*HyBRitIziS0NO2RXTE48auYQzh<4coq|A4fp1Mg;HY`%T1Z7>JI`dK&!jm^g(r@W zj6889PokcdILlWj%{S5GZVr}H3J+MxJ|-oSUAYgI1C%Pp0=WZKqKPUkTY$8WB(19H zrq#6jjkKC&$EM^wFTu(KbL&3J^Wj_P!}rsQwgv^q;(RVDkArU2=xa`NA%zXquR^23 z!Xp9oHT|XaDNzX3$ATK?CQH$Jklkc~+GIg)lLfg=7Tju+1?z9JpvDF6y~%<`O*gHU zFZjeZSs*uAU~RJCbKhjJUA}O6uR&E=Ni+Y~=I3+p|3CYU{C_k9-*4spe*_!@zeMDtLx|Z2QE}zA|J+)9EZ@9d8-Z0|qZP>C={!--}zioLJ^M zVzN-)ClDm{BSB(p?WV#Lowb}r)Vj(q1o|8xsg86E;r0vhp7^o5`h?(z=!SfV4qc8O z)Dxx_>n|Gil$M;n2&CB7QvX`YtIA!P>qQ2A~-F&ZcT5IcvA;b^k#j;u8u`44N z`Ao$g>*d6ZmU<$PJ*QE^CZXPQ{1o;Rk`6-@`sTrA@LK5$^;DdWO{_6G?xxnuHwST` zRyTc5z0WXw?2x~57`6kB;<4Xupy)VU4Tfx4^Gl}J?4GN(#Opw2u#4-NT(!ipCPk}~ zF3ad%%aXcQ@Ym=kElcv?>!Md>RIn-sdR2z^T$NlQDC7w#3?dEtB(1ZLN=MJMQNiTxv@0Tc+gNs5)@idQWE4bNpuz6e&5e zUYnLFR3mTgteV(nZ7W#38xp6q!=ZjatF`At1TzqHa zIh$!(X(N|mmu_hax5NhSvC{?)S;m|Z-0^LV;L0Urn8G`oz`@dy4crusa?;hta>qr+a>sdNITW3eI-ZT9lA*n8ic9 zcLy?7mhEM}P;>iig)U8BDJ;KUqKu#NT zFccBK3XWr7PA?;L5sQ9fCu4v^$CBh@T1M<4a+Zp7-U#K`@5XaQ0^nnaBNR~S9>y=} zDYX3PkeN%06F84|DLUb$_h3zNp_sCmiZaEPa=wH;VSQiO6P9vTgOFM(nHEsuIm$OR zJ&2*+QU}7yR8SiTN&s^IJ2ET;*)EV)9@!trw()}60(NO*w!{}`GU%+KWz}#dESti| zWK+o0v2b9B6()tpPLsmpj7g!!E5Rp&R|4aS=XXXcfnV?d6a)`s3nyP5_;{F>aQ)N} zj-U9isfKG9(A5H{)cPlZ)q)1`R}!r$(GF`Y0RICEFt7iP$nIm<0Nw@-N;ckSY2AI$ zp_*v1&P?Od2ca&Iu@w!vI>#^;{nW9eZH7AOFEgp7xm#|ndu&IzqMJq$HVdwI(cIQ?*Z_=5dY5(K^+%Z?3a)95anU*S*p{$IBJ zvwf2%CU4KBB&*B%yp@xxx$M)H*JK_Qi7%Rleb*>`>UbPvDlMB8ZCe5{TMA}jqU^Pz z#99W1bKNW}rDbbdmn}CbdrT%}4vVs5=_2aIkGm%awLn}=ugB9NJzZ0jZ@Pa;xKJ|f z$xL&y$E|Ng6zt6wYk_q ze*m+LgO{M80wlXK2cYWENCBSgLZy?dOGkrdcUT)mmv7LJ4_@rUqzq=LjwmYqvt+)A z0CGT$zpE+G0AVtwXjUUb>ubZH?c~yIBjq7Y!;DoUi?GMaj!brhm#+L++mfXPqz#$c z0jdNJUn}n`STxa+`O^46DB}YYimEeUm2{R25A0#Bn99(YC8yTEQ~~1lOj`u8+7tmM zxqIuT{F-di*e||Olw0WmzYoVW8upTr-6HjjFi&dj7!b*s6+yWlI`7mdZRp2LrK?7L zSEK&&M%SF9K+chWi|roe7slA{(wggW)|%_FwB~xOtht=~-OufJf8G7=ueIO(ng#o@ z_q)&g-M{62&vIM0Yg2A~|E?RKhW;3R&82&=>Dq(M2i*97g45>9)8^mxv}L!2ee8UF z?1JpE3)Ha-+{Z4+9lK!NV;8J-?1GvF`>~H*z{f85EstFwk6o}icAwU<3*@m2KF+a2 zA@#TUx$o{X<^4mei{;$()H#YWvpP&67Z<(9{V9-G6 zBm8a(u{&K{%%(TuWsF+=%JdI6oY+m0=<;lGBhE>OZe#AZG57n_%>9(DA6cyZ_U3*$ zTR*I6nYG_KMtwAvj9uTIjQX%5%dYRPMty0IJ`bZl`Gjc)Z|&{FWR_FQvw6TCU_uL= zv<3+h04YwCndphXDQznf>_3hhVjD)Di4uz$K4p9vk>5>B2q*!**1nN}S~0cB<;Ul> zZ)Ct?Obsa&%hr|4Sxjy*Ft9RZt6RV=&99ORDVvVl_ScU6wOcL?qXB;lLKp^IIsAMD z^EkUCQw|sfy3AzH8iJI@lEth(DK&`V^=RNyt5T2K01Gvkk6<_uBe$z_1I(q_FtYtX z=QpVlvbi$y+d4nQ{4aTm42U4@W{YZ=vfdjGH6PVi4)AjJUX)<+biMK=H@TWD#M#wo z6vYY-z&g5e0z=fcz)NqT8e_1o9)$)ohI4hM7KJ84+v~A{E7`Cab;-!a0Qe)Cmg4fv zF6R`(jMf7oArt4EEbro|KfDp>Q{-w+ng2@Sz9`vym5R{&lzMqG0uA%TOolk8)P6(x zt%F4XlTyZA1%MUU8@%(O<;!`$L>l2!Rt-l$d~M1> z>hmCzd?VD-c3D=j&BJ9+beUPlu*;!*vr=gtG^5OHw3-|K@AKpTXv^5_-=4|-(eLh3CUD~bX2TI~9KdWG zzFprr(1F(3uxN@vr7MWy42 zF8T?agNU|1k?})P$usR=|B@K`df4;#v++Itw*huXgYU=s(tcP&6&iaoub$VKn!>FoixuRINhCh_`?70Xz z;a6-FC%-b*1?bllXV~MO+c}UxV^36-SoXhRs8yXXuGM7GXV2_TBB9+|h+h<_{PPPm zQQ@hq*1ka?nhmN8W+crjoQcwZ$|bG`OV36$8Bd{0CD+X8r7r!dx_~C4)YvcLYgGrV zWYtkMCR4=;+?n(Fu$o_HJ;kvp7_Ot=EP^u zvbaE>M#frc3SkGSKv`iV{tR|IgMA}{uqyrvzs0s7N2Z08$|4X0WdwHR`jcIm85qKK=rUJl&jD^g(zNQc%0|8 zu_XbrVClK2`8ZCR#9W?Pqee)nOj2GE|5KpkAh$!%D*kV9KEP&Dg zBE2txOR&4B3NEBHS;+VUN=zeW2*|_JY#OO(vLs}Z+pHo5sIa@xi$+y^`K7u)*4l#h zWoSsPaiByDRkHi8s*a+uQSE~2f-k2R5?|D3~^Jax@^5%kgMaj%tq;8*0KV}oaW_4x=(*%?@U&D^%aTyNSh`==h2G5w~M0fkK zA3!}nM(iRdVF~y+v8zC4QOqYOP#{k`*JHGzL4|H8bA15}KJR?8YA53g+PfLLRki+f z0Lh})>nE4Jo~S&+K0Kn;u%YA!IGzAcy9@>JnmDJP@M+727$a+{5xT6iqKfgLpj019 zd_Wg0?9ZE7Y6Kfx#WCIvmbQOxFpMh+MmcgfhclW#s;ch3P8UHV3d`+{tedfxjEJKT zn8eR?NBgSEwsa5(I3$YSOBTj_8A!9+aO|I&pwts5>ES@uxkSB@{ z5}hA;TKJIQ*$}_(=>A*P^yZ5gXNt3`b{jNh=Cy*GiMJK;6l%{&j!H8a>K3**4(npk zXj7uRDZj3nJOK2jns$15H-+L2dE)1CZPkvU{>g2lmP&b!qA8{;B1PcH73phYz579; zYV2mpq%E82FYVRzf5sxe$^jgVr)*7SxNeDnj?z0w?G4QVHg?1q_@8t#;d_pUlb4KM zmY>EyYt9E~Q8&j^#Fy|wLKVnAy0dG;r1LW%qR@8^KxQ_Z9$z-mTOMQI| z(EBH@)|a(RE1oOFyehD&+0rHlqAn+-d#0jWBj2C~A}jG$q@7~y_RL;s{cLlpvfd~q zs*?ExPzm?N=Y+H zV^so7d<2~Lws;gj5*68CwQ5k%DJxx0S!qd3!-R;6LFheIJxqyad1F7t+aOI|1yZg;I!f)^B^gyM5DHS}@tR`3Q_ZwV2>SpBX4G{=B zo~gDalhay}rZR}Qlz%tR0~WfPTB)X^5dGOLGP%e5KkLENFFt1cmqxQ4wC(r*pb@rP zoA>|E<^BI@Z4ds*_kXozZl?tPh83<@$?__ej&6x&qKk%f12*sfoA>|C`~T+s|JLvS z53c~gzDcCA_?z96m-}ye-({7^b$VH1S#f#;9K$6L&?xOipVub7OT-=9-#z`ljQjy6 z*@T$>!7H9#*cF@;is2Fh)R5#oiOK`bhNLAnd2o1g`UWX9q=h`0NE)B=^Nan1-M2>y zB%6D*dunExz|VwV{#CWNqg{uq8GL~=%xHuz21yVl;%@5x*!tel@#$MQztFIm{A%~j z;Sc-0lieSCyRQ#LgZl7B%cof`>jyP{$ij()gLfK5!o?*p3uIOgC*%9q$FO1d$-Yxm zfD`#03@M%T-*h}nf(O?BETsQ}pw-UC|Lgc0`tLWR|9Iiy&Ya^_NvCRevWViocm?}F z93C1?469Im#`Cl1RUb~EXpp)j1ef2exh6yGGa?#Yw>_dxibKbNBTLGs+dhB5@RVf zy}`{!>b#}W?(2x5xo9+$PvGoT(r-&UHKQ$*iiccJJi9u-5NMdgBG^l4aTvu}F}S0? z8TM8i6=G$55~{!N$K$@~1T^1tE$%4Pnc$Q1b^nHE=EM*I^BJZ=Ur~^-t}zgnP09KK z!Xa@J`gt&m%c%fR)^i?5eR^)b(4pJd%P6Z5#Qe&yv|r^rEnZ)0s--O*wt~a3-tc(c z0E=En#uJ2SKxb%3KawKAg5QVmSzglY(D&%W91!<-F}YE*fxE@JhCK0dZ;w!QJiDCX z=<%HsF2RX0y~!mHgT{wXrer?_Gu8|Qy1J9QZj#J!N&&YYedkD z(>*F<;-xi<=zTP$ean*iaSXd8nhX=A>Z7_g?L&qAiLOPyb|RHajK|BDC;KmV-^dW) zlKG^Qj86Wd!K5EYwnp=$KRv(dpGV>X4xzO8Q#xH7DkfE?Np6z&Qf;8}v?>bKx>zSm z&4g)668Ch7OIAE*kE*Tkz8Y2wM@tx(1j4sAR(y6jKjhykL2TQZHQ zs86!oeDgkPJ>Wq(gOl(Mb`j#a@uDnMg)d>Z%AG=CDQXi~{RzL)7%w!m&tg(Dv1;XN zRMoIS`BeAe^i3Ay`GlysP<9D2)N?!CN6!a!+7f+1D^sL)}m*46;1k zRyS06X7OjDSruQ3|JN)~B)p3rKB^x9C7X;){SiVpGh{f7iDIxV5Q+NNpW%+1%}|9E4%!aEGzo z-o`-~Mh*oHI!BgjCgBeo7U*rN^cpM;WmlzlHJRX@_dL5RZ#QN#nJ{$6Q)3DDa12fB z6#1nXlAncxSLQ{@?&XJK@9+T5*U1mNM{oD}Dj=$YRZdb%x3e2XRQBCE`$AE>%%rGm@ow3?$Z>hTe+-O z(Y{$>*T^0|UrR#?P9xl`&O7y1mJ8(~9VFX^VPwr0jDQvq1q!@TAs^ua>1mU(sSZ#wKdDrJzZfLb_0oe}lY`vOYtBRyl zf~N(x9a80(Mx3Z-%Spp}gxo04k;$X$OH^;TY%BrAzhXM-q}1eG4rOIruy9&oI{(|8 zPs>sM)6mb1|qlbWL34~DX$X`cZL&0s8o zq&GB@lc!`JbB!2=7?%5WKZa4`7hpREKui(tpBbfrRvnFL!*RuFI`mB{y&l71yh76zeAXWcwtN&l#c_vsU8( zv%b6XSWraH@;1?4!|2Y#XVl5q2$QN>aB4X79`wwn3$>i(kyCqA($a_Qb{vOoBjF6L zCSvyB?JLS9qpG{1)uo_(`j68e zmMSPqah5UPXsM8h$@pEQj5WpO?ES@9pxd-37voA+ysSe6&te85z{#u_P}aAVua7T6 zyT*pcpqUyopt4TC!IkP8(yR$H83O9cLi`J6J?>ic^)xR^hiQz*(R(S9Ru{68`{C6E zM;F@Qdd3uXXv}Z!v&`aFf{Q;hL5!FMT*-f-J{X@{7wu%lt~B(ULVgkf+j1R+Tj z;V7b-H5UFX8uVeqqWLpfs)*Nzd-_q4#KdgflADw3+0|r-;@Zn7Nr0$BX(uJoiwt4F z;W&;43&r2@3m`WC^7u_vQb$U`=)1$p2RLc)W3%;;T4kN|s@6eIW5ymG%TkU)DYT_# zUulT1zZOBKD*jhgy7W1q&)*%2{NBa%1ukv-7{R(sa@*A0ssiRcT8?qcwr5sgYe;ieqooMH#x$&Vf#IL?D z8|?3tzqlgR!tV~%r=w#<4o$9-3wfvp7g18@t%#3-`yZfzNhG#vp*j@m5ngMgyufFt z8BEe&68#EaL_2j1k_ioa-p?jL_Co`eM&wz9jH# zfWnZs3Bdx?c$zGt{;>W?TO@p$jWQ6rz}(_g2?e!QSja9CQkhUjjm%Oa z1N57)WH5z~qkmt)Y#YwrO^XPJHkk<5GS$f1QUqO=_H=03a2U$l!g2$TKVcZFCG;OM zS`QchshIxjgbhCz|EaUF|M;!wzay;^xUmG;P=Ff>a6ejrU#d$kMC!9LujxukpO zpd0<9T#7?}Z^G`ux0Y1jgpY0bIF%8c;tu%_DdQBC>PbX%qa#eIxSSkcsy``NlOO|3 z*@;$wDJusf;tu#NC|;mSJBRMsBclvMUzvRFdFX5rF-PpT0lT0BMGP2(lJN0@{9R2Z z(uH0Lh503nLWKWnejwYigVG92PZrmuxR3FDC`1o_9nH~gkNyhHVUQpWii)+!(oG+u z*w|?SMy%=DX;_@PfDw;I)Tc~$w7bBd%TUxL1p&fG%;CS#1|_G_P7iMBOr;7D{9KOv zYiijItME)}UgCDyjz}c8Mm8i7^(X-NuvAI|Pf==!HBl;*HR4I(TEtL@vS6dBz)f01 zNJY=04!oYt(X*sW!CYwo*@Lr8kmxvRmHAj{`)S3a%zI9%p{|1xUDH7164Td~-U0Nr zt@j6g?NIC|`fhDBKRcl)qt&zNq2tfN1zK3(v(%V$qDXHlW2j_IpsLZFA>&9G3xw@s zgkkDn-|DZipDEYa&vy3%6=VrFC*UMHksNXIONY}`` zCEmqIduq*Wzp0k9SUiS=s?H*y@r-I@K)N@E(j?jTA@%!Cj3*N)6eD#_Rlt%Qu*OlR z*37>2EHk(Ca7S<*$W^$E4Pk|nROFEArO|yqW)q=&-qUn0@O+!KL=;CRSf`G=8TQayF;z?uQ zAx5?1&shs*t#r{s(<&}Ui`KD|n9)3ta-V4%A!^bpg>3G>_t3sky70FGw47PHHvN}$Xo_W=)rz)VJZ6E8bjLnzRx@`4tRbydn zI2jsjou=Mqo672%>&A-1!rh`dWhs68p{ej}w;Y?@*lh-PhXz#yiK5OF<;hqQt}Go; zA{_+xU2iM=jvZavPi1e1CzB0orK13CHX^MC_*lWYfJ{aHidm4reD3{Zo!+m*mH)&Ue}Bhzx?DJ0QQC;qNFoB?n8< zimoOSkzww>0ZjDQAlzQ0F1v8-A z8a1Ml@zQ8<`6zKKOw2_ZjaB)Pa^1|@TxoDMG3|A=3oY}8QP&pf7RhVazJS@@|GC@T z%@dBer5uHHMGR8CtFd?Hw%3Mxc13Il25{>YO>?`p8JCtz;?=9Dsf0t6u(dhRY#81y z6Ky18-N>e%|1Bpgy)30ovuryEZF8e_NE2gJg-!+5j{|tS=y#decX(EFvG3>rV<)v) zdd65ijc(@|q3`Y;>5kn>ff5+7oh#bOrF1jllL-$c zb0fl9>~|hjbCHjq#(vWRYD(J#m-QW@e>1%*0Di|EA}yKk{MG@{aMp32Nia;0r)b`W zLC_vFtX$mu%p#;MVUa`*ecU&!+QY@DB;QkG^Z6H*WeF3q-S+f_Wqa;BglO5AN4OUe4>ME_Ek$W~w$zIS{$lZCo96E zZVQ(2poSBJWngy=;bwa^C<@=UB!n6g%Y|{=GUZkUbX(~!VTFBdfhDcm0+(rx>v+5{ zyse^&QFJ+<#r^ok@Oo;*XOqV3AKGO8++cg^CVpvEIcQv6IYVet)VQ^S#zCb)-%%@k z2BMs+<|Be+v7`2;8G7yjevHs|p{v_1XSZ9qid*iObZuv^TWPObR?B75QI7tNPp0gK!L-@!|B%EU4m zU*g?ps4-bi&-+QbMQ`I0$#8 z-=^@94z_Fpn7qyfGNoXp%8VF|hbOicl{6f-6HTk(ub!fuvbkNX!iV|cwpJ3Oz=T>Z zjhU_O)WTEgi&*+v2-Mz2X{ccX9(T4aYia4)IPOC7qdCdJ;mcqZU00)6UDm7ANm8h;gz{PVPUfXKAU{x0A%cgr7QDQ@z_OHCuvg0z%Gwb`<5-C{J?Os9gh zEUkEb_G-bc5#imST~a7d6j0Z{APqJxew@zc-0;z?KXj?D;iZA=D+fgH%uRlJuIhx4 z-<{J0vhp?)*rwY|VH0jMrHjVNDuq|VlMmfIz0>I0x%509-di{zwvlGNhfEw?wJxLR z-*WkKA(kffvk|R#`uv1id>FS@otmkNzr*e8NhH!IvsH?klTlZ&x#RR6_%cA zS?b5jP)tT#A+t?7H#qfOI!XZ`2(zMX3DM9He!0x)DGo4qzQ^ZH&NuGWg>%Mfy|z4w zRCEfSJbT@JGXA$$o*l*5YmaBH7TCKAr%U1lT4h+{Ej@HHOV1*8!&?WT{!fAboA)2k z`g;}s7j}HVnc@H1t)R2v|2|*)Z^`ueVs{Gc46t1F%0U%%d6#%&Tv?d{)z^5*E<(m~>e4c)Mz8#Z*qhJLzs=wF+5=--%-$zljM zz6}g%;~B$A#`fg+?W-5Px34Sj;Xqae28ZEjWYx<1D%$r!qKpjo|0?Q>@jUVU;VU3g zclZ8>-!24DkNQc1UvN%d_D+vrGm0&p^J4$ow=a7~uv?B`q8e#!qsj2Pf^;hSQv<@k zD*g#msmx@o*dD`c4iVysCr=)UF9=*bI?_s}R1Jm*;jA5gf-;3Ydi2U98PT8qX*+sH8SJ3s(11(ei!~&&5L7 zxU#O@DF%;AB^%OhA1mIa!J)Fs;v6a$SlP&ego`^33-@Y9{?__3;!u{q)`asOOR%}5TrqUL+6R&vLC;LqxiEu zt{_+a$!pbePHi91=ld~QN1ndcG$f0-P^gj0xv=SsTS`_9CdnFmaY1jnnYiW@w3U@P z*mv-GG>u}QAraqrBO$aYW8DHLdIDNivxc0(k|UIe48hGLm>OnN6a}jU;5v zW=;RBMTMcr*=%v4%9Lf~Jx6b^(IF?tfM?+YQ^3%(8dTm4YG>>_AzS@<9JD?B-J;)& zec?m1ZWM2aMa8wmaNdXc@z`oe@;x(>l+ED!onBp@MX@0q7L{=w)&p972JN#0!=MSD z!z#6Fb=f&Bqc}W5j<7|)+ebVvapy>tPy1X@zNL!P^=?b2lXyk#7f7yL!W(@$MG0x5 z{0Y$>;2MCb!9v%GvFnh5BDwH*kra7V9gnd5G(wl3{rHBlOM09|?HgJWWPWgnR&F43 zL(YYnV5k!d%9l_r&TZLsG-Pg@b3<82>qPD$d3j^jiJZ0eiD5}cPY!tO((%y(Gv7J` zW>wM#6cpZEL)q!7xdzE1>kipkJZt9EenSH_!lTqAFvL_lz6r1UNj^F?+N;U#Rz2lom@j9AKMfFW7CoV6R+%lcq_(^mJ`RVAdy>ckJ<-{cQ|EN^NLtN!LGPFV>3k#! zbWEHN2Ha!Zy%` zn@dhxbgK02l1ks+rcz~+zE)SILl)Gd5@(L$;{3my%|<_)P$wLegSaH1soIrw_U)^ z0^m*t_}3*1`QrHPw@3RAx5?a#+zu;D?^Tf^Teix#+@7~sWn-NKd!1V}X~rU3D>q!Z za@KMTZ?_y@j7O+||9ZFg-Rrl1&#unV@vE2i3LT*`zezjW;n{P%h?1qro=T}4d3j(} zf<%vd*)fw@ZsefU*-LK69xGBm^>@yg5jftm{ zj%&@g71~&7Gu$WwIOHY&TY%*mZl_eUP5=*E?^ua!EUSDdn7&m44O48Puix zCrZjN^HsZ7RKAqH@4tiNgYs?Q?1tkZD)tane>La88H0FyhO)f8e-lME+V<3vQe=eK zB7{i18n8d}ZNPof+XoS+QzlMf{X~T~@iWn^imyZniHbI*C1rO@Pr|BnwDcdNfqzb) zG`b(Q1)x>iXQ-azDf;{P6(>=Z!4iTf9uvm$Mr$^}y{0)cCZ9IeQ`pO}{S1noIX$vp zmoE~U4I;LIJ-!ehlsEi0*%$VdV>w{_g=Y*F?h8}mlDbut?s{?#6$`vz0Wf-0T)_w| z;@h$T8hhWC;4zx_oc z(Rl$jS6yR=5F|xMgt>@4CD|gTnDi{{9+XT!udq|3C@)pP!>aLEmVUKP=8r6CL8nA; z7Jec28Nk)47gV(1YHNJnNf%knwoYn?u|1<)HXg`=yl^WUN#* z>7k11(9aN7VIW?frEk5^NDbOZ{o6^T=VcnH8eBCJRob)Y&}?>`AP++=5mA*k%+6r( zK_iOcP+X!}_XR&T&Qa2UKJsA9bB-%CR)Nx1c$;t>SG?e(g_L}0Iv67|V1B8=E|A)V9CR9H1d3ZaJB;V1-B;&&{jQ(j^Umm~XPZusNM?ijagJ;dW~mwYN`m8+P1D;Y0$?&46|;qO&p z)1#}wyBl!@^Kljp`uHFwcfi$j{O_ws>EB)Bi_}7@dCjh3t`MD;YP_Sdg~Oq(>rlVm zO}!1eXaMCrX2qbFd#aTK&3n*sI>e@SrTej}rb)AM*i;5fLZFf;%y)f4@77c(>vI}$ z`vd!^b~r4)g~#Hu@(^fX53Ojf{l+3Oj3hFtzRR%nsZ3wU5=zybA_A)W7IxDmlG%V4 zEd2`QX_mdEx-hU<*YzI~5&!$YVku;bz)^F^a9j;-tmP|8B4d+Iw0%AEOGwT~lyW6# z5(x!PqVIC3EHYt&vKMQkZ&O>(wFLh8lPixdX#T`aQ}$>Ie~6NhUZzum!gMR`nVt8v zo8Zw@A4~h7<=;PC4U}bU;KFu{`tOA%ex*ZH-MQ@ zg_fT$Q6o0F)Q2o#D>SJfbvYm7WjmZj37*>_zLmiaNz$VneV9jsg_HhME)2&gS27qj z=^Oj0@&PHV=d6^EQ#dW>^f^sPJ!r~00HypC{7gi)w#q^_K;k9I36Ov?vGmWR$79Fq z7t1FW?7dOO*Xh5XuK)a{pU+eugDy^a?4&cj_Uu{B=hzT?4sKQ>50n{#4EiwnAS zZ9$abcurpW1%B*up1Yxcwt|!b_!6hN@iXEl)K07;2O_D=>>jt_zHy$bO7EMA&CilBA%VHw;fW#5=Z0d)dw&0GB4$g zDSjPKbup?(KD_sli(SlU&!o~^Sz5{pGH?DV&XDeW6fLY2t8#*4aXRx%TrRc2#5F1j zpbmu6R-4?&!U@{pYWe)&Dvp(km=1xgh%Ao3EN?$crL~~n>7&g0&mj5%i*UIuUd9>-;HcMx-2^|?u~v5s9b9;qGbTCIAT5foZNZ! zco~MbU52JE_8ZLSz2CJm@)O|cvoe%|P8p)?T(?%dRDI?TRrDNHu`dhf!_?}vblgHf zmpksE>?2gZ^}D=B-L`}6aGehF*W2!y`#(7;(aRxG^?VQTJ*en9r^ooU9L8JH;r&m;36t41v=zv$EbmPs zOPxX?jzd%^>$QSxq>GV3h3a*%Tdl|;ee(@Q5^%70O9Ff>t^V{b)!Sh^R(9WSn+?FX zwfeti1E+Ut016dJE0ugi1$Lgp?c%#<*RrN}S$ zF3}Nen~6LT)KXVw2w0X>9F%vWGh(FXe~E_jy&(6BBPEmiAqSWIjsa|>+&L4nMy0MF zq{b>?hNZDHtUxqMaH<2)r20{I;F;=9{&_?fM#*OSQ0xjEgUlbgVKg5DGHLo=pljI?m;K}& z8dAR(Bu6&t2)K^0-}f7hpv&P;hS%te3X4~v5?KdXlguamvuKhFGSm3bY@fB7qmhiC zGMu3+Bvk?RVuv1D)p5gFGHVHCNR>g*@Ecog-3{yo*Ad9cFk%3z#mGjc!ATu726|H8 zKZ$8HK~u?J#pLH8&>YCY`7J{s1sUt)}%DMwD|k2Ob1f0&t5a#+x>8OKse(D50#WeuYovqtS4{_WA#u{&Vrj zNPObwQpW`PBthYsBM(bBGn1R?!2CX)%|GT>`DI)FA)f=8KvRrvV8WYzintIC&puuPjWG>9t@!@F3_D+7MrY(NJ#PViSIpWWH5<$DV_ul40Ee=waz#MWm_9(`hOJv|Lp(qfuet{_Wuw6W&Qtmnyroh$Ir$8Kz7mQfxI9deC&(NzkTK~#!se*@Rw_;NlWpMcTuk#4^o-llzY$;s_IVxcVy zGbRneUhnSh_W)rW@9pC0`y}G0<(7I`Ks8zb)WBE<6gJ#*l6#^QHGeroQ`Cax5TU3w zmqWBfEnE)K7PZ!Lh>obWmqT<#t+Qe7{+#^Z#r*0+Gx#myzXiw`Wcj~FySd^2K0p8e zYS%cJzt#TyOIc>HAVvVb7WY-aAl|JL)XlD+mMu^HoA7ZPw(v7z3l&dDoXu~~7UpOI|1qS% zE`hl!J;oq%{mEnR#qOJ3Bl+?0W{S#o-uH(`M~8dIFZQvPx8FiVrN;=1b6&pFuClLX(45Ya(e z(-Ti(A6ni!IP`s$oXjz~DU$Netq=Y>WD8=JZly=AiGKYBN+TeQ=qndT8!V*B}kba4_27_xD9kawn#6CR=G9BRR zS!WqrV0KB<(vSO>8Z=;EQPpBl(h)tIxX#{_ z7|zaQI4j}AVaG5K22L!d)#Pk)5)EiNyT&id4=)>{T_a7$<6`SKOieYsbOga={(N0A zBxs1_n0TJL7e{S|)VFZDLsFG94nsG*F4dZC)qmcYlo&RQL|-L_Mq;26yGCM@2Qr?r z8mH+@nVg=?$RuK>!vGpVKyes`wIKRO!F|#fY&8f;=w&&zuP}$u;_ZuDGg>ro)6oY! z0F0&;TwB8h0fPkrLgj*p;!a5KE5s8%!qZmG*_o#p&___Y3jh_(`>Yk3WNbrrY`e(8 z3|)Zp5h2A->a#gOd7P-@)Dfu%L}l`m5HuLZoB<=!sbQqj9}H&kP_9bG6HcA?)#WT< z!&1bylN+gzD)%IuAnDj&?&G7!FDv0Ov4x{ z!SYcQ7#Kv=thMW|mP}pp6=Ot8v*xoUH6v_M)fjNms(W}gv1`64s+k~N^|Gx*re3mM zHETvQ#L^QqKFwAvL0wgo6-B1z$s|+lHC20*t9LRfo`-grsWrJw7J+lk94qR3q^x8% zCd<3pv*ehLW}CF51Let#4G1}mg^cq_XcEu>VB5dK&xa2;H}X&cVHjVj9tUt?@!p}4 zoF(36zl7i5UUUtna1+U1tr|?zF_@4B(_D8jIFw(0aSg_AtsczB8-2KX^sXJ$qS1%z zjsE(&c=VlH4*vI@t=8(kfQ#?f$F$+Bn$*&Jfd~@jT@x!@uQh`?sBK|E{y`yJx$-dbZn++3wJ6w;y7*+dSL-{@Iz} zxgL$~hK~M#%hOrCJRQgKbZL1y53xKQTpnDU!9eihoS*+j2=))Sp54{!X%K8&WhQ9% zomaBEEqEP=L&58Kaq)>>7N5_`yVqMU9CAkZ#WSO#OTH*1<``I#`D|`V43KZ}Q?@0f zluMJPj+;=bUMIE)3mXNM{E1nv(%JhGo9LimgJRg%qYvYS6naI|A&SKI{j6NkVHAfu zXpaL5u^FKI%7 z3FF&0nW;|`eUv{nGKm2uhM7b|QdQRDLWCqmAyORVSOP&ZA$n;;2@_3*mXu_6uyea+ zL@#*yGkZ8AhhgOA+S9?du?-DryxNH@SvNLJslNYrl*o(T%cJ9OcaM6#gPtv#Cc%AC zE;LFmqkX`@b&7r_0E6%E9q#+JqsOQCSL}Qtj-u%~oSxZ8>`}yDaX3Y{%KQwtPuojE z8}&3kFe-=gkRuM!?J{EfSiI?<0~lQn23P}bN$u{ zKv$FK%n!P%774V6;kL*v1QxjsK zAYS~~+dJ6p4Wm(SFzVYKjI6H>>)7w}{6CCAp1hVSGh7}m1`B` zq?%e{yC4o_CPQ|nMGn68QxMXz>SJuOftv0VkSbHdivSoxrpuIHSgSkW=*}?r1Kgso7XVku(4fv zv&sD$qGJ^K;1XCSv{ z@DSV6-X*Za8(p}K{$Hy9CpD`6>o?H<^E+WPtN-UWHu`^`q5hxTHRu(Vb@!TRz7>iS z;4fyA`GwfKxSF1euNVER)WXGZB+U;Dt!;H(s!~C zHNk-1?C*W|>iFpRxr>L?&pe~+05)VC0*>bmx4iEw0 zEK#T?tE~8&Rs^XZ0Ta4ytKDtiLlS4}-3f;vPG~_~{fKzQ?Xt>HqBzbVDbYst?srqY z6FJp8VX5BnDmAz5)l<56BBy(&JzQ#ex{{2FjA&DL3%zt`WxSo7HlEf)ySGB#1M1_6 zCHi>6p^qm%IeonA=vE4O!ljTWTnc%@rI05+0fjt~QOI*50q9jmNzW*5>gkE%;%?upILtU77Bhwx!+j9Z;hQqz1qHohM!UH zQ`hiYbNJ!*EmZuBa(^@xzcr_;wS5a6Kcn16$8Y&``|jy(Z{I@6&nUN1^80Ppr?Y(v zEkC2&M$7LLUC{3KE!6x}of|d3&rHpa7jApGo}W;9eoG`jP~K7j)Z9#73s6`(RE5=L zbpuoWD61YQR;UNoj}AyZ;X(BSi}nBV5=V!cSzhXBR*?}r2HQC$!0m_A0?Y^>Nn8~) zww+SQz~6QXAp`7CUKsW;3W36<5GY&5h_T5FXPfqzZ&SFMC53)!-uYR;lu}|e%1*Kx2TH@7;QuLOwj-nJH z&YA*$FvULkp1~FWQ55^+TTD$3?zdO$lg|vY0}r9tC->xbS?<>$w_gLbUxTIlHOTMR z;FkL}Sa-h$H3j}qihc6p<9a^;en5f0SH(VgOV{LJ9#FAQ?t~SJeQy0P44*h3eAOR6 zhzi(p{ja9qYIm~wUv1yt=zo2F`d_qRT+ZKsT!Y_Rt6adDuHAdtP&|CwD( z#douK`tCh!eb)8DJ^Ff2>?TQcc{aHb=lIgIQ3Knkfo;^lHlE#n8}%>b`QXepyoUPd zd%pS@c!B!Z^qT5p=!NQI%WJ8RZLh69cD#=I*!8;V$d%l=j+z}uIKCa{VmVeJqQ|JpnCwkdXSD82CaJ#G`&Fg zAPBuc_aJC_f$l-j_5$65pyLI)2SL{hbPs|pFVH<`HoT_pLDTn|st2QVEk@~DjMB9j zrE4)t*J6~e#VB2iQMwkRbS*~dT8zxK7@2D^GS^~cuEoe)i;=k&BXccA=30!*wHTRe zF*4U;#A`t^3W`Kow^VuVrLL%o{-3wszh+0^l__uuRe`_LiYp(g;sbO5FG2B$$bm;F zO`8o|Dvi5`f3G;S6f^$em4c#pDwPeb0JW^7Xs4y>iMouTo>+CH>q)9w9eQe1{1j#< zSxCJ`*mcjjuW|UCI|v8*x$I2bey)Nj$DQXR407Imo~{GysMQB3FcPE%`qS%^pEc=@ z+XnqPPOOR2iFGSg)?%jp^y2jAvYD{0+@be+?eN>fH@zNeozmP|l_7fG`)M)2kj1#C zvK_43mBK13%^kZM`y1@)Mi_d)0@mw|8t`iH2iY9#4*6H7-r(->%bd$%?^BWtC?zk{ z^8pG+3Lh^=leiQ&NKQH|A)=@?gG%gIRl=563qm6S5Jt^!n+YhQ>{5bE!AAmyKvs;q zaT!zPfd5L^B@Cso`&tV?hgTm;C{?9@p)95Z+NZ2gsl}_Pn1pjuud6Y{+>5w{;Bx2a zj0Wx^%upLi<-pKjQ&AB$`;w1N`vp**2pe*AO5w^v21X}B908eLXYd6{?Wz2$*)`H{ zNE^`@ltLBF8nhE^RrxEl+cm!WK2ItouqrI-Fb-m$1^E;ZF|2hI;YG8cy0#d^qZ07Z zI2DNCAz?wQt~CW&jck?}F9CYP$XWpO$B3ioDFsR~B`T41OHtI}(c2dXBpfd|Y=%*f z8fp{g^jXD!+O6_N!o-jh11qt`iA^i9&55B-q&E@F>2OZV0`GES+e+Nx#Ez8+mk=g) zRbu(b-_Fhv@LI2Pb8|K-wY?(>rWuUHGn9UGd93$|XlVQf z1K(h`k*=GhNS7y?F}cvF{Bprqo^!VFEi6p8J&su8^ofnq0hz_v>+F!XY13mPkcawy z`5ED@ucidSv0nGoGBo47ru5b00(3S;4|Ai$Zmpm^-JRPUrUZ}cf2UVDO)K7@e~|0^ zny>TpvcBf)+z*TdTKlem@wauxaPUSlRvpSsBvI}%MwQZ+v zacaj-^^vo~Ydw7EYu#_VuXRdyT$$28 zPHaib`RuO3mOIK@mWW*LB6XqiZk05u>#0-_y1#S=zHL31wcSBd!xQZg*2s*kyoQr) zkqxJ#39^EAk2MCh}?ijzr=oCi0Pr!-`Jqnrop5xQ!6#w-5s1o#XQjuUjZ#u(EyH&PcjG&o8@@BkcZPpFeDXPRp;^50Ae1X(h3c)Ttrxo|KOVkv zP+Kx1OKowoO>J@7TGSSU+NhC32j{S;8&pnKF)~%1A=bq`kNUsdEOKF6Py```6m@Au||IGX&g{+bN? zi#~}kR0WWZ4s(0EM~5$8^$vFT-asv#E)Qe>Thhkl0#;z>w2xsyAA{mPo~`ai5INag2d3MEYrjO<6h zoIFbNO_Kw&j94gjWgEVz(7DXC z5v^#WVSxv(HqvpxFlybeYPo?7mp2k@xe%P)NK-e`ghu?}t6C6dS{bZprR&-}b}ON7 zCB#U3(CsLi8DR7hZ zjHA(N5?eYcdrvZ&^L~8RKSz^=$wXQNpWO&xZ_zvQJL&ZA6Zij}+J7m_>-*S&t+4-U zqp_D|{}uSnu(7fK`Yi3g(hXB=2iCl+HCS5t#s+L-1GcdN+t`3@Y```)U>h5-RW@MC zea=NR0bH3ro0u@?vjQ-u+1MS;!O{y{nS~wg)$484&aE#7;s`(g^k(m8k3Kn`O47%m zwI7P)ps?HaLy?hTJ`|#YeioUJkgWnJpS}>*!!fLrBNh0+2OwZj{3-*`Ij_IYU3o4kP8bQU;kPd@{*`i%eZ)MZBIK7=s2RuO;oot5ILMkbD z@rHt^k`tjMODnRYU)Qb>-;xXe3clMR!?_ESR8{ZO?NH~_VkSDrZ|fX(MV;m}LY0H+ z!9XPgJ$LZ>L<2yZ3ZSoELv&^kHe{ysz(2eaq|{IgSTBi&_ij8-wHVB}0~ksI^#k8U zk#a0&Y!2+So&u$mKZS!N{p;g)qPPP1p=s?aDd|C-PJtJK@Po|Gp^QLg_}Pr6%m}g> zq0DGzGg>ku%x1J@Mk|}qks0l5MptHZvKd=4qnpjZZALj;xg0fiKR0+^k3KhiUya`n zQr#k4NmhJF(SgDpF`QaNI^?*Y!$SaPHk?HXWna(YcWTR=N9@iXXnsVBj6%?Xdn_4= z1?=4UjBpq$n$XDyiYE;-KnfNzzJ@BVJ*tzZbwoXVDP)D?G#0F^0>gsad7XM#-v?1v zI@+|d7FQN@ySJ!pR8U!4_AHQae5DKF_do=%kD)*NCwJ?Qvd39hU3$aneOy-WTC#dUhy;763DaxI z>S4N{O>c2}kWFuMda68Yv3l2%)kBalTeQpRt!(-hr?<1|euFbQ*$jtKGI35zSvffR z56;Q?owm)aT`Oh{ay}(ytrNI;HB5K0YMAcg)G*z}sA0N`Ps4N6iCx=EkP6mx~{&4(RtNnoNS)=iA>{%z+aA)gsXYF;FGimm4EAH(24&0fv zHvv5Nth?dP9)vrCxm=SwV`8|~UQUqd`qp92?opY8k-A511+1B)M#Y)6+IMBlpk(uo z-8@~VvU{>+P-Ae9?qyi9d(`IO#O|@erw>}2$%hr!Mp+?ch3o8<(~nc@D!yzL3b6RH z!hRLppWe8#fQ)t3y#xpLhztGGBD^M3}OEzp+j z_~77l{|z>en#dm-zTxo!sawNG#OL4$!yeLEZb*ndmksG-`_1@hjx*HOE3XZ?ainoi zM;ex8@y3_NpV^m2>0{f$JG>f1PMc(N4hYc1h?%tnWcZcD@gK{<$0uQ$zj4*@@i(Z$ zX#P{!pey}HeBvAQqj~~Rl)z`>5n#Ffe{xyB_}KAZ{YJAH=HkBw!N&goGqnH54U@C` z_qVpX;$;MQA&zdu|3oA=+Zga~4EQ$&{2K%Q-`#*;$sKl2zgO4$i^CJ_?hpHdWd-FF zYOi4sm~S-M>lj=&-adiO_$_>(_g-H)^=Z zs_&k>tW0L-K~>;ytm^=JzkhUqPZ!e&&pg!ef9t42_ZL7rF_JIuN#Bj+fpAJ=j2tmO zOITJ)$2-#y%qweKsad7LcvvSO@2a5Mg_*Wv6-MGMQy2;naZQElHCh1d{UO{4v&%Uk z?;)+jJe~n22dw0=*z*7OE(f!#>EbV<&zh~I=!h7D)FRbWl(lYvDGqp+Bf+JijUh^O zCxnHju6Opc2vMQTqc;IUlr!c&A_^-Y-w_ZACZrKK=uheHz!#(OVh2rJ(s{9~{y9*_$m4gYC$Xy>zZ*fG7gnCcel_2(vk87u z$Cz25-Wx=My}#kiPio;#L4&^UXc0A)xW&fV-_B~kih#nURLe(=VTE~J3MZ9NDXgb4iQVXXT`O_Iv7Z-3c z<*7-lk|kBq65OaK|4>Lb(>dow;kXxe^2KaCC@PLp-rp1!s@`(NMfS4DWvBCzUTFI) zv;DExpgDXsLqtBLn`8_`Wt_q08r&BGpLcTU0j2La^O`!(ogWGV)(z4!KteZ2+W={~ zK{^IVdq-(3auU+KlQCRwv%|I99?;=5TqefNG0%#6e^IY5ei<2P1$2i?dIH}b=c{BR>b{8Z$J zrguc(Dmisn>GkIGK|AdAsv7e9;}`qAz3+|>_x39vJaJPMHyP3>5Ah*KuU+;Bz{*Cw z!Nm+Ve90^VEq202!=sjgOxqDJxJ)v;jKn;Nu7r|qR)s`iT5UWXMss|!oyxFf zUn=p_NW6S~l8Ab}u3Mj+UzMyjC)dARd15lWsv0mk5N|R}^OH<|vbgq=g#~bxgSbMF zD+}gB9_Rx>eW0;ptUSgP5kJYR@yNt+tkp7M3dVyzd`SlikiBpJ@n-+jY9sWzRa8pe~mxxDohJHjlZwIbOiE!cc;SIDc z9(~^*h~rc7cS<@?y7d&h@8#8a7(LQzV(5aq)(C2iux@PPSN{Wto5+28AfXo;Lk1+X z`+X0N)2;>83_RR$3hH$Chy545qZ6f!V1jl%znz*Y&1cD&FHYEvlUONw9ug|%dj#+2 zgV(I`iQ;J%K+pSwh(+!&K#95INX7fJJ8}T?Pi(00jaX!mNTW@aI{{6(P4^|SVSLGnuhF!7HXV)6>lfeH$(V3Ex2~)b=FpCu)=sOif~#|G z2XaSKtpQyDLMbMBe^ml>GXT~Q70?y}K?c54JWZ9zqXo7l^^kkHV17sR%7EB*TWXS* z&`)#Rm2)zi0_94tEs!j(fE<}3{rtT?|AkQ@pq9F9GSmMl_>TZck5LoZ_;GuW?e zlb}Y{Ptxe47`e0S#XgxQpf?)3FboXF#U2!3Lo4$X*29u^Dd!kDvSQ+mXYHry=B&hB zse`{ek#8URNkpDr`P8H<@8C z{+7498BZI#Car#4v1JJ5IF17Ls#%z!bf+Ed`p3Eq0X1my^op@z$f%dO0jD9-khW* z7qrZ4#>l0v-8Vk2H9JjDSQtiRepJ9(2_9y_pNZ@NHNjhX@F2ey8oZqcZ#uv^2(K*D z$(IS2G||n2x0Zl!<-yxa!2O1o1@Gj+%SZAmLGsyHbflPa3w1UswY{T&H!7P(Cj8pn zS9pCg8kW$8t!9%qHMGf7G+32FJWJTX1sk|wn=V-24I8>(8#!2BKP=F46cAhP%G)m3 zt{b-Fg6+6ryDr#vVW(-K(c&&&sO4&a;bCLs;lm~Hz5~9w1U_)U2P+2QHywp?OItot zf!2|*3bsi9_KMNl0!4hOA1Soug}VUApky8m(5Pl;B046{WG{5=^6yRSH~XHD*x56D zY#9n6OoIw-CV1Hn1$%Hp<3R>WNb_Sh7+lS7Qa%DPC*bjv?&&9lS+5lja+R=54K0;L zay7UBESpvhd{nIq5tkW2@3@sD3rh=^<%pj6v9zk1=*>MBzlkk z$CG~3=-yIOsb6nh0v+n64=rByZ_ac-eb|uMK0?~Jhi^_j-gB@|NH43bTUO1IV%6N- zKxcSkqIgWU>f^chNo(WDcd@l7JjlAMgB$x4|<7e_Sb2*M0a>LRT!C;%Y} zY~u*!!oWNl2A`0QYoRY@BKua|I)SFX*SNt0MNzMDeQVe??rsgc#>JiDA1tuOt*t9x zzc3@xP1RVd*9xcMwab8|Kg{pNuQI5BB1~gCCQ9QH1UklyqfgonKKWAP$(w| zOclg9-I>q+uFJmHt^&NIyJyVPooMa*+PAgW?S}}ME!YF7w?Pvg;vz@0@52>?nVbF9%|eElhER}2GZ70pIYP;zcACqnHS`` zIP-#R7iV6E@8S{*GG3f{LC%XaFUWdv=4E&r-#q8j-2q|oDF3=yOdB2!ebxyxFW z#c?R=(+m$@z8qTyPf2ldmDRgHqm7lr)&9i(#!t1^ntvhN&)#?@qLY#$=TGXfMode; zmtv88Jc~X?cr^N?kaH(KpA|BD+ndwd%#Pv>vr43QYE5-2r}cF4ofT8`Di}V>r~06e z&}6Y@d|c-av50hjyEEo;#{2JA#AX7vo!BkrH<6K_jS>zD!*`}+skl!CC}v1(&&!%{ z>5lr?V2XEf8mwe-xgPd*hXS+dKIlcYSd(ID1)>_bZ@C(C_tZ;u`BB7qK*oTD5b=0+ zeol$&FOd^rjxT6y zNuYZy)}ul;U!0Oc)A`gA9pG#vHx7O07zV>+aoaFU_{{I>EV;E#^~tu5i22wTmJ|2G_^l;ydW-uqTZdipU<*HO{_uxkvWmqVaTm=#2Fce7E z_Z{wAsxOeFJF@rI8wMsFlETueV@Qz_hDs?igeMEG+wBi~KYl2++tEdvrIg)q2RO%W z)GLj~aQJuE$qo@N1z11bc5;20tPcmDqjoZzpaIDWG)o1EnDB%z9R3&l{a+Oh0wO|y zgd&QXOoXK&yx@U$uf~^`(3OKxe;i-3jnCd_8eema5UQ8T0_#|4d7^`ukttecTo9yk z(j5#iD#-s<9*IQLW8E&gSQL=#5Fq#*P$58a;(r*9=(5Ku>_<+IQm*z!UZjjC#z)bN z>(O%D=rfzr2^A}$V!N5EJ;tFrNavEF4J}6(E1qv6a)PsTLXMpvLwh)DCln*)^&>(k z=tUxa-%!gkXgQ%1u#;?opw*NcWl^geGr{Uu4Z|fsw^T8sD$XEku>vRvYQj?!C`b?c z)|?OuW}t$WFG_*cD-KgovAbn-s;;Z+rPe@Op7F+JG;msn|W)G)WPL zOp44H3eGOkJ*tOhJzEjiqjsJVJz~3Ga2h~cL5i*e9q2Ex0k)&O8jP8$S~Zw`=;hVW zGvgYWHPnn6x_LEp?ddVdwA{QkXx^$cZ_bu$EV+Whu1(Iay6#fvhTOZH9DakS5DVCU zYs}tzvHz}Z)f$_Q{dcvp`4Io%cWeKx7mUviyh;HIYbC?fyA)vIe0y)oa@Ik%8}0>o zoaj~_Ou-*a!5>V)A56i2lcwN~P341W`2CxPKiGW#3O3)4t@SIf(KnLNZ}a`?ByF#K z3&U~P-f+gf*$L1{SSl!hm~hF%8?=YZgG`X&R=9+NUYIh`kwH%iI{F7w45@+_?Ow- zkL~aGPEO$pY`;4=YM<==zmEqe(D^pd;Bl~2iQomyI=s7JB7ca0Um^uV6l-nvWY7(g z>&vq-s^Dj5w9ABDD-_+x6 za8B3l@^1eR^9EoSHHV>m+!Fc>h1hYWin3?EbkiqIPUyZyj z!6?9iSSS>Jp~N6~3!F823b5P`3;l~@0{koZm#pHwhRUEns~u=B!VnnEwffWMbLbab z3smLN$9Hs9?w-8SE-X~fG8`7vB-{RQ{Ob8hHCQD*z=<@wUgd>ZgbdJug3N!zHdM9# zKh?E6Xya6QFHtP0=l2A1>9u!c&T(Sx_^uQvSyMzk@bj&0;h%BMUXS zR|m>@h6k|m6xRr3_`CENxj|#k)`Mryp5co>LLG>BC5rjMyO?l0WUvajYo5ZzbenmOx8TQ@HKt2RXp-x;*sj07-CCgYu8`ife-&}y;?fyDUgE#myS8v1kFS!#&D!jZuSSLMvo`Uq_i$l| zqAYp(a%`dd-qTdx_7lSexbRjl^k%UTOfA`TfE&EPJ}oO8dl@BWg-5O|@ewA8m#y={ zUGZy|Ef`0y#NExeBV6cgk3DiR6Op2!mAIpgccf}dIb&7Q%Kv;sKIsUB-go$@jirSb zTh=TDK2*qp9@2hR;f`%7u?z?n8HSn=SmgyUu$1*Un&G?nS9y3>C`!Nv@r}mxy6n&v z#wQs`W{G2AQ&yx&ANNa7dH#}JE7ib)L|Vv(yBwM#r4W0&dZ zl?JS<*5fH_x}*iGoqIh{Z{~FFT3&9LD?4{RKX=W}y_ui8Zs%^~=ian)Z{_E1*twhe zxwq`x+xfYhc5Yk-Ik~r;++l9+uwv(~=I0LW+_n7NRbw@t-U1Pf4wrM`6hmO}U#9BX z>`U<+S=EmbhtPDdEyZD|e1;YW3=>r-3w5BP7HU``iiIloz=&BbY+?)U-d>{SerC-L ztl6BT9RI3eLBG&BTU;Z0!+pTB5tCd`bOA36Iza|g;k|;8kL2VK$x960sGX?{87Hm- zQxZcLu4&UO=7D}=v$+b{Jd)WZNtU0#U_|YUe_~~pB#`p8*nb|g)mD^e1dABBdt`q~ zL+C~mR3N4u#Q18(aGYW!l2%dt_k>KX2cwSZd(Eag(;TAn-FaL{9A|gdZU*J3&VsC{U7^Qv4 zvajMT%!>upp2aeS0q;WXP^jPMpx+~0RafFE%$D<_A{FYC;!_XeWGW|IaNQWkLHSeC zU!J*RW6z-nJO2CQgV#K8Rbq!Mu?1YcQ+K+8gQE|2dE|zN(uR7o=&vkY56SH8n$YcZ zs7%Bcuj=*jN7ScUb=7v1oAgq39UdRO@zqyP)h8UQo8H>f6@LW6HSIb#cQTzJhi7yG zZc*jJl3RSMiEqNKVWCl-rWnhaFxB-%IO7P0u8Gd{H=OJ61c55 z^IGqCTJPMnbsT%GYPY_f)A|*Svu?G{-zqm8yW4tL`DV@I;2U+P`7o#XoYTbD8~&{> z`fHSs-OQ#+s$11xzgwggak^Dos9VTKN!LfELO^W=$pNIlW<~jW@-+p$DG0~Sj&ky3 zS5fR4^_+g??8K}^5o&{FTbJnLBWVE5TsiIVxMd@7$CElIlcIt?DayP*h8f#CaY$2N z=>Ey_$1w)BBfMDqz$g{4v&d@6clDP;cQ)0kyUXr+{*rTRdc{N=*u;pVGCk9T@Cc3y~Hh|fNHLtUbnzo$co?7u%rtY8!r8fk-G-H?76?5xTN5PydQ58r4w=U7aHRO_6h zjDCY&h|q-{4*T(WJm>{E>Shjl$M0U~02;)?4{^5?tmugF$`^5M1h4#(blqHAL+{;U zVDxJmT~5YvCmz6)V*>AS9vttk>D8EZUh?^(168mk4~Bl{PIuyjz3oKMcOjq=tH$;g z&XHcwJfn>pQAkQ(#pZ)F8jkPswET;jP&y>Of^7 z*J><|fpNZOY|l*51bHnN9OD9N0Qa+KKt&4R{;{xx`dAh+F?mA@??!d*vvcDW9fVnX zlR9W_Go#y;#;-6* zo1!kmOo(nabaLhq^VO$Ei-T2TEtrnamQL94a?aFqqWH~LaVp`Kp+-eL{gm)Kl$=-z z_TrU8=(te6Dp#n2bOUx&ww5C>TOS(kz{`6BLq*{h?9O_n;#9DIviojNjCR*5js+@T zwhcp1C;Lk~d#U!|b^PFUd{17-SvC;b>Dc;q2TsTHy^afa=XG42=XG5DHN1{%*>1iy z6TZFW$8I;4vvtap+;hZO3V7&*Ps43`(BFrL^!@uKXRKq}3$_p{oGEPq>p48(-epT= zG@1=d{Bs+BNlFu3@1}|aZdBF4=E^+lU+fIJi6H!GTbM)VSUHnwiIjq8-C>#>7_Vu8*bbT5^#rSpSWvIe)p_+q%fG*3Tb?$49}xB5HC) z)RtWlo_-lqSX+EKEL71=*FsL^%TsXfD)=r4_$ee_L=Uiki^YFH*pTk++sKdq5LUxV zXvcpDw>GzG5Ah#}-lH*pk==H&g$ z^)L$F0XG^=r+HZ`&EO>J1#df3iXxGlb*sb$a^p~tOxliV5pHicgEtX$CXTLyzeJ=C zuwqi|kK+h05apVCfahT!g~Jc=DIVfeJjADXh)?lt;!{XKutx+4_Q?Lw?ve~J{avsF zm_X03w!mqtBU#rj*s7@`44 zDqnJ)d^R&N_bC4TYD(7O@J5lT^hgSHpbP{k6WU-rEMV~12+DA0iI)UWppDf)6-)@M zVGaHwN~Fgo#OzjiH9#!Z680_rtUN}UPmFAdKEg9Bw)-i-%9M&2buXj-;7im)c%|Uo z?oTiG+8>W#{lE5RosOp%L)Xc={OGx7gczlpFB$dUh%zjFCoTGl3f_qQc4@%;1+Dbe zwf?9Wtm4l_J7rDaXxSgvI=-($Sb~HI0%1VjAE5X4=})KMQ`C>7b1ht=l<|1N22toZ z6$jBjW{_P3fM7PLqwLEWvnsAVCG+Rqpci-gQ>s=f-ifeeBph{Q%v(_nStLO5%jj|( zU-K12;1p;T+>JKQX27Mz+*31{zlD&J5K0MkA821b{^u$Vt3);v9nr%;^bqY1fGZfEN26#wOO*Be zbUZF`B^(duasX=xdf!1_f={);4$%zbOr~wF_OH#qwIE$dOmUqc>`V&@g+G+>3&9z- zm6q8!rf5Ab9LxoV+{zP{h-+Qlv51)foM3@zUBG;Y#DF z&{!ytf6(*ITUk)|;Kz4+JHbJM<}$?Q&@C|O0JnoPBkX?&bP*_?h=2o?qC54T{@SVplZM!s-pj$U0v7-^{mNZ z0wZlTX)TIb3xFy5vv?v|2XoAhE`dwf7Lt`hY_x%hA3gvpuy^ztSb=t1R3i>6bxbLL z7Q@E{nAjQlH%R1;fz-eR!>B*qKzDq3LJ6&IAeuF&6aUaysk6_X2Xz!oG1SSbB=ssA zH5JW)6RgVy53QSy~&-^OZ_$r9pD z4URq@9zs9d9<mh;?TqAvJ;K6+j}X!5i5vPDFi$ z?qe0RQA^VvZ{y>?;BtKsq5oUU{}qDyeaZjBu)dXw{~U&mhxpIGPx-%EF!T_#h3tMw zxla}!2LCg@7zJ;~@#xd%K{EAb;z-hsk`~@?b3Exep`@v2aDoNGe9nw&hrAeKmdKam zgKYjmHvb@-e~`_8JK6j*lFh%cKPcJ!3o~aj?ZK^0A5p%9?|x(?9V1WiglVPn7#yLQ zZ6zAbE(1f<*pVUiS+<=7d|o6XqJV;#*OIo^!dxR*g==%3|I57~>(^Fc27h9z(#nMWOAZCv0b~*>6 zxLLWHkju@+)VH#2$<6{9&c`fD=*H}JE{kI@z@xpr*Qf1Q$M1gvA{i9~Te>&}Gx*h8qUSz5^o+6ZmcFjcx~Vf^0q8xFSIpr*O@0Ctz4 zo>{mad~G2;;%ajPAz+0YgL;0FA_QYrqYz)Yzp2eA0~L)?gw1Xm>~Ds_BRdIPTG2>| zM5kgg(+w$X5S|b|IPn^Z;&yVQ$zF-rahXwNPwdEc6bZ>ex#Au6OX0$bFe_plE)_UX z#i5O(&jS?KXT&BfWJEPwsxb~jTJVG+^-S$^IiW#NUt5JvP!!yPLy6l&)cgStRVAGV zh7%6L4hCr%Os_@QJTsIi`63E<`MmI>InhUXGI7>87SI(L0#hW1C^(gq*)Mmjz|Cw>MV9jjIa1UsSS-TGo#wKS4zteSG#M#uLlPZEo>`Gd+O zfde8^3~7Z`E1i{To`2ajyrfOs1z|f}Hs&wq#HGlemolS8h)dwcjB}$WLcFO@i43 zUY4*9IzkoCp4;Tx?L^-T)C!ZWKnGXlw_>oW`n}=1(u(ledvlNmdV~R9+k~GDwN^^d zPna+LL5*+(YYtc66V-o2H-=tMW>YilEYNx|%^J^3{QM9cA>SP&G&nea-PLe=MyZ?f-iodkI4E` zxeqEYMi*Cynol7`aaG;=^Pp;F6JIpJ?}DV?EpFTDl3(ZEVY^p%>ESi<_;Jo9gB^k0 z|EE9wiFrzjL>qnSMrJ5=9y`hK@Edcs@;;f;15wyMP=MO02)8?)(v6NqC|-VWHkb;b zAzut)+b+E<$k-~-E6iFZsZ?|Q$tm_!V(rJAD$=XN?73JVx+QB{tfsd`@voJ?-Q(5> zvi63slgeEfd7DLpD0lXznNOtfKb%P48A(eYG4j0f#kSmWKc9-vzSC3kxO$H; zH*W8c^YL_yJ0Ege_n1{6z1@6OEpZf!u@=067k5&lUr=)L-8X zYvV|@Io(SxP}RL;|9mwrTwkg}(mhax`tc%pQe{uN*rrP{*3c8$9vBE_Rr1&}cS$v) zfSh=rVQOFT@QlQLn7HlR`;07E!-B6g=0p zf$~7>B9}ClaW>(C^Vn}Q+aeBXy$+1YGgd??Xp;4I7K>w_isZ2)*(bq!w@mv~MMgCbiO+>*O1KhR?2}t`&|NOmiJ<-RWlDVu|pR= z#y)0L=WcmjA=gADY}tSo9i<;_@>+vc-Nj`gE>+_VHIzRaI_G+C{Hua#7lB+okFmf(*JncvREEhLHx@vNOpri zMEn014fyLkq5g^$`x2dw@byB$LY}~I1#U}WeQ*|!KScDD2IW4j=OLnS;bVo<(Dw_b)gA`rL1}( zR&`N2hYHbnxa=~=#yQ;ai|4t|=u{J)1+8fWADb<~3GK5L;K}jFH*W=xk-2~FxI2d0sn;_L)xZtEcQoWby$YfTZhJ8MaqrxFbd(VqC4HD&f!f&n4d zPjnnMH>bT5fqE19bYD~}Sx{aW%88osJY@6`1mtcfR-((Dlb%>;o1ENnFS2-75y zE&U*;8{eyhVS%e?gjI^*^ithB?~Y9H(b=CAr4KPu0h+F5wao9#Sn(_977Ytg#R%7K zjOy9RQ_nu%{M4kEWS4ANdmVn7V2L*r@SdNh@M^;K1G9bn7aw_mu|uBCUaXot!(qt` zn@^}^a3%G$+Fnif5~py&&VzzvUJ~ifNdLkcN7`Q?&c4aVd3F1gt(AGpn_A-^B+dbJ zb9PAw6f2H9%4$;Gjfx>2&*E;BQcV8maSHd%DC91pG;>f=NDWH3RJ=KR@NCZAxaR0z zlw94I)o;T$+-FahVu93?lI)MhIn_W*Et2yAU}KKZjuN5K0z`fI;w$lWAh$#vj#OW`@j4mK0QYn zAFeItgbcy1|EuVvslcXPQnZhL1l$ytyfO<$Yy#i|N?Hz`AR(2Hz(5%A;1vl)rcZ$V zLC{!W7!b6@T)Za5D<9$R5#LSGWmAYQoG zm)-zyWXKJdV(z)o_H^7vI3?fC#&MKP#>kO{IULjjm-LOfB%Gf+WRt{&GiROH{1PvU zQU9h4(%h>aI$iLw8j?K+4gi`fU|rVrj=SQnd8GUA>=JC!f}KfmM0ios$Kuj``t=wk z8LfogW2lSJ#{9bya8WmQDzKW#T(WDrrW2cVJd%#;m$hoi*t~E@4trRE8H)(rz(yVT z5v~Qb9fhN&QBwnB5WyRr>PYzQ>??*wuxWm)&9IT}&iOg;X21~A6FTuoT(sUnJm^!* zf*IS(;9=z3Up(7ytBO$P5%h<~CqIaPvX4~k_auiCE6gDYid*t^QEDw7xf8$vzhIhh zJ6M-E>*k+Zhpr9=lUtu&Kv=7QU^9<@vdUg5_?yr%vLt16?Zg2gCux0sMp3z-JIIaB z&XVXKGyF_LVx{%x2+?^08Y{L5B|IxqVn)vCmTXGZ2A5ymDO)#;>jkaecX}lp(I~>; zot+rCA!+~2yeSzp3lAkCoOvRs#cJG+(wc!9g|jMsOsvc)nYcHq6g{StkgC^ca!H%} zY=&r)@#RpVaj7ksZ>zzUV)|7ux4`ML1%!QTW&vwK39)EmeYSsn0i6Ax>`yyEQv^4B zJ!Zt+4d=7yQTai?XMmmFYb3FX|n+@ zJWZX>usa(n>~HOm$#(g0a9zb?ARAA*tjQ^**+<@dRJ1cp#%}qOs5eekK>R9^(ej#- z-j}XPnR$xL;hl8wQFR!Yht&W$1;baA52?Z;bt=C+IE+-7%8Y)aOS#qQyi@B&J)Qu2 zK!m?rVODq1h)H>h(rrUvn8InbWIBtNf>-c=H0`p|4hpDH&Os-+ggl7dOfDd57NxK6 zYC77*y5D7V&F}Ck7qaP<2i(c1H{=~nT|td135W5W!*-B~2=0^!ufC0-R^33yl2ycu zh6AC9J1jbftJU)K(*dr}CvmMM3w!Ld&}K}Glh%7?*+!ijcAEPu`qCghjjGS0=@rJ| z*rWsztMzZ#GbvMX8)5g}NnBU0og%t;^i(hv`|q=chu*=e(4pbS0!3Dln}q`y`0W7{ z$HPJy@)k2Hls&|Hd7VsRA&W$|a>t9}DhtHyB9 zcOndRiK9jVwN_ViKwahGNM^Wf5q(Bl5JfOz^Q8MG>AYpM7Omw*2rr|rY|g8d8=|)y zkHuQ7sD-~8B$4X-AzB_-28RYcbO0EE43FXFRKx|0d4>UHda~;slTno;ke8tp%empX z<%zhALmP*8&l0l*Yc)21h8uBnhcP#!=_izeOp=D2WCjZ<*+A6Ygvx;$Ho#Kl0=uH6skE^BE! z_Jd&ASWF)_$d=!0-Nh!Ig?S6DKw?pn){8B(=qW>E$?#HXzkmO#XuRW6Qy~Jn=g*`ekb)u7zh~Fl+h5R)2D`ve=MOYB%&#nV z!`6kK2%}q|t=5^Kw-yx5>p|Xps!piaw(T@%?sBn%(;N8v7&T83*x1gEEsOMpq?I`$1ht{s?X8g+wfzjL;wri++mWP0K+%QbK)>zK9$Hhg`syCfxB+zmFiOpQ9l)dC?j6H_+zJ(oAx^ z68nh(k5>6DE9OK7Yy|bJO_S4_8->EJFv?VFxgN5)!Bk8)xdDZYL`5@&IwWKggT^Jp z`cNFF%?&(uH-r;brrY`p|GJWA^5e(AfSa#>40%!sB`!-LXA9pfTtFdLgPC?)zZH$b z#)3r3G_^K3h`{jfOB2QtvY82`plW(fE?lZ!^iW#zic7mqdps0`9Y3OXm(fp98>L(iUP`igam za=?n@>;{|O&;5t>Mksd#S{PYHUSt$emg)2NQ8APCu*zh(kKc#0vT+C+g$>{ z)2m5G*GdtTABN9Rsvn@(`DzJEp4sfenLx4?m-*D z)x`k#E8*OqsIWb7ic_@vGr6LrTh>MUTAU+_(=$;K)-Qaan+prKK>mKkW?=SclY$4CiONf4Nnt zZVKVLB$Ti1D&)R{_EXiQ`yig5$^^xt^_y&3TN(l#fm+Bel`K;|hEPBYOv-RNm<;Kz zlb4m8eyO(5C!KJ?hI=WXh79b)=Yft%s&!}2rE<>)f0Pcqk1=I;4}NswtConz%LxBU zHs>01%z_-lFIDl0g7f>@J0IVuNeiVkv(=IVY?jptKD+L%6DqVOc3?pWxrGtrZVk_= zFMA7taiGBgNg8n_t%wD%CTHf;l}pIz>C(G%6fxup8M}{1k)>8$)kuy6ZU;xNIH^|` z!O*nd?hAuyrmWHZ*rcw;fFPZ9gNogTmAhjYlBf+N;4%fmrrwY?V5Wtn*&hk)HLQ34 zXw?dNTr9S7Bx1aJQymeD`Zj&Z>P{)}D2R=&ITAJ_5=Ogl!c<7PDryzqm32%W82Hkit znT}(Ew0@;iB&!d-8V;`sf{Np9Psiki#1FJYE*zXmWbEXk9DHf_d*T&JGox`Z+oEb6 zLwY*y0+%2PagWJ~`rt`VAZU!qC`!wD*=j>WZeT!fVAh2pi`@?)Y*t7)EjF3@s<)zdgXT{Ptm5^xiJ7tl*uz3`F)?kOh&w z7GyzWORiZ!Gs}PEzc)h1HjRlfKpX1OSMmC(`YNTxQrG)1wVqY052(IV%|R=3iuR6C6py#at<=?`Nv zgsiaCl{1H&xnAAwS1RGA%zV}zZqSCUl|=A=&fT5H+@?jhitJ$nd)QPxy!xl;VpwW&7X_2e+t#c?(mrZdD)nkb z(;ged?N?Y^O$Fb5%!R9eD|#?5oLx-#EQ&(Zbast(Z;fJOQB8!-_+`pcSk^n-cEweC zc`FW_x||s;AoHVyyy(}+FsJ@UmWl1Vn9mFzef;!#yY&UUqTOSkXH-KO);da zGZibTXTIM>qLu0(5ZrhmBawUdr&hWIJf1~HdPb+xdGWP*@jX{lFRwn&OgkyYbUP^- zb3WG$&d?9M+#acuM3-p*{0e zco}OcJgIRjes)-oYx4YQ%Gm1r`_%(m+dwbLw~FxEE`w}k9ys+eo!g> zcjbRakMQ^ZohH|#uKH!rh3U#k#^3PgonR+;6hB&}w(;l7=yDuiKhhdMZ@*2^9o=Lh z3Gg_!3=V-g$Kc(;QCppVL9J@WXL0?e$N&d^T7PaAlWKQ^Uex0HfQ~v(0@kz<7K!Fk z)HfT!RYTi>Ls0Zhq&Sr4;ezR%4f`1OTssA>n8)QsG@QV>AzTX02T8Cd#q3f6=5RhG zT|Y@f-6o7};%UV=BiwctXo_uz23^8d!+T9%BQP7E$De?Wc5Vf>vmMhmAel^wIG&3! z29q!taB2A>#g&BC-k*}|$~cy8_1bcc!lSYu&Sab<0|Y(BE4{-z&cF*4_Cst4Lhb~v zJeAzCqUlsTMQ0NORk34fAWA9tbUAEcNz7ho*j*;R=1th9`Es1706_2-|73f1=dTt< zc~?psb(R;Ff1VaRk5gOM<6nG}^VnJxlYXpxW@DwJA%skAGNXxUD|1G2vK4GKAArz^ zr+SwdukEMU?(d4vaPr8HvHa+8tzhUzZo; z>hkk4jkrE1o-PZfB%{JWZcN92ge}~pXF4oH+aX}ZSi33r0jcPH6L-!WQH(eswaGI9 zj627+?Dy3Lu`+n^LkIlWmZn>Dwr_#NT=F72;Tp>@;pX*?Q7{ZF9z4a?gDun2G&@_( zv^kbjmu-D4v6uWHPdDpnW3irAm+mQ{q4+^kZr0Pf>S;Epmsy-v@G_nD8F$+&Xh9Qi z?C(NQRCKS}O*mLoE(j0Cb ztd9Kbpl!I%EQnJ<6&b5dhn0g%szrI>2b!XSx>ER85xDKE#B2CluISVuhenLond zxxkqu>_Z?C);=f%1bACC>geVwQL6a~;)bUdD*_LwXOdTU4{~w5P{T zyOpPAF0ixD`9{!V9nPH$|8%8=JJZ?o85z=n!ee;E`C2&1z|b*q8zVS0<^-+ zN4B%f`r}#5fb!(;4U2C7juzdW5gCT?HeyH^Mkb+{g3}qt%wmZJnjTJ6l;+4Bv8bA` zaFi@#5{ET~xk6E4xHz&3Ls*EtYunXRRPqCx6n2DMgF@`H^{ho>v`dr&RCLjiJ_T{$ zM$4d%lA6$g)gI~-O@%wDD=f6Nc1pX=L>SB05n|#zi>P`+ zG(bGx1YX@^T!hMDMx<()gi=l|Ddd*=sapvhW$@%|QK_jLDp}efX5sy6Jxxby8r$=Y zb5TkAoYDST1I`-dAM~H-%k(KV_H;NngCCwIarfy2?aU@!N*E4CvoDQ$x%-D3|EYwP zN~2!?Lxul1|88#8AT6xbDw~yhty*vVp;8U2mHHoo${)VLpBaY6hpxaO91U~w%}aL& z_dEFm=f%d|{8Mm4dtHcHOpOG1kB_qhGuze4?Vgkfs;rGn`IbsYUpH{xtjd^t!G zOc=0j+u3z+9(Pbx4TlT%4ugPRV0gF^UFbkeI7t$W^Ld79G@%VMgV7+5A%{f%1xYgQ z4#?@UH|~>$Vnhm01I6#|3Xq0@+ zxgwJ8D7_(YuIy|f{4dZ;qjNU?9MQOVg^b`<7UBA6QYLz`MN)Fn;Q(R6;hSRkp*Tf%iN2%d%@}P{)ZoSPxgX?)8PHd@%IO>_g=%??w-PjCr?Vj z4+kIK9)J80K%SG`qYpm?$NRzV(NDo&4vt=zg1sN#pX{BIP5ALiaPaQ^;lUn!J~(=H z`0@3@(VO5U6g@ir5F8%7JNN)Ke>kRAMQsOrr%)f3ez$k>>MeZPeR*(r@ZqOYuz&F3 z2x<=Yq2Ar#{qD(!gI6C9cTa-%A5Y#NpYA~?UPH}C2S@uS(9j;b*pq%4uIi)XVDEeQ zJve>Kz!{MHBMjptc)15X*~Nz$)eGZzb+~)*t`xl9eYg7tdvii#fg&fAQ}pJCw|n#n zLj}WsuRa_cA0Z`P9Upx-fnQ57u#*o+11kE%!Ra0?%H5NLQzXOw$uTs7bc903R1XwA z+T)6l#`a`D7X1C=>7Lc2*L%B%P~9n(H}liL@90n`1?hKUg$0k`d@o--T1mf5tt^67 z!JPJY!B?_s`R5uylh!N(~0`An1@k}1~D(u)zlJPuZ|JW($AB~U+GV+gCwVo?enDcK*n-Rz%;X5MV& zi?xPW>+8-nZeD9wQ#sc$VlW%5dw#;Wssu z@6(cFlOGLXx!8tqQ#;0KZkW%!z@l7t@H~)FY$dCY(G`k;XeKYvW=qG?w0e!mIPGXC zqKr?+)6TFh8^ZvYhOt3}Lj0)~{zIzJtwNGFkR~<|VSPZW$gY<|EsB=sksj(V1&?J7 zMI-2@tO6>9_X|cCQ3HaVr+$X*#yL~?*Rn4L9XO}>Zc=3Zxf%s4_u8-EQfTiT?qdh4 zx>shQ7a0CN)utJ2EL9-%7Lam6q??M0Sx_s(r~=ZY249S-rNU?C*qv4kFWY4T=^IFj zS<&>xiPT1*M_)+&rDEd`N;eFTuf3RCE2&jVOO%M0DS`C@Ag~5bIEM8!3u=hNlGy~g zr?MGUM(eO1=bXMqz!{%Cs1;M@!_sm6d*dh(@wh&%s0i~jl;-%t^Q%ZT?z(pZ>nL|F zjuej(<3Aj~Qqo3mjCdnNeBB=szERhqVgftViyhNPLK!-e*?D1PP~hfP?~NPe8D6*h zbl4NKjhfS}0k4Sd<{5S4mZQGx-~)0TU!xrNGDs-kK^%2BBK%yEU{szZ$YLzJtVsL| z1^vF`nBPlptinQ3!o4B84J)VLUr2Bm;8JnY7wqBuXyZA-#qT<*c4!wSVM zc@DkAkdF`+cH-A;^N0NL6tX80xpFH;+Pl*ao)~i30k6rr<>%}sJQZ4zpWX0v%fy{t zaJ~HYV@TgaaAO19YF=#PI}6&o{K07Hu$-951^)uEG?tkMW|lEPmT^V8ZC{Mm#X>5p zu)y|W!#sTNzCVR`{DQWB*)-)$Z0qDFs6-G;g%h=n?kLv_VW%d`;DgqwhX0j;S5w8Y zbXFYFz!!+LXijD-2B#VA(+>H%;A@Tpt{QJSeW+$FJAQld+eVLY(J3#?pYMEw20Pkt z7N@jSOBoAH8$c};Kic^WUo(wr7dOH6*bwKK7B_dY?4=h8zS_M1;Hyhb z)$+Fp_Ui3=-B+$IN2B7ze#4-r)>A>nJRcn0riP+#sx?xMjJe~3GyWQf-w%=aj|LeV_Gol`Z@ zNP~r>^passhtBnT5gT?Q86rBI)g{+N`*SCDB1W;bJ-Z zc)IucRtrr3^02_Z%>whD?Vir3Zd6tM5(^Y1)mF$!IGx12kn~uH;MjpwBIyNVq`z?- z<5&>z{wyNz2zfLsG)!Sc@g&hsXJvno#4DK2&L}5XBD_+`m5rB-ioq#XS)oZMbm5o6 zg%veX1ngQW3YLnqb)w~gu;*k8H?Q!09DN=DSMQ13)hvkcY3YbxOEtxj`U*y*K09Dp zTy1W|wGf6==g4&hmy)-MF89V{k%Ut*5bpLd@+{s<`Wdf|CmcPqSh$Ngd@7WtIqTAl z=$3V(T-#bpcNJsra4`A=J=QXGQTH9j)O#g@_oW-T(|CIR$bGjDk9l&JgkLfq-`z#y zGdCzj%5^l>(9i3b~bIf@`O(mSxnzmfyiG@!_SU-8ZqWN}sB2xgPadp)Z!P;nbI(=GD@%(40%OQ>IDM^(@JqIh=C`-}D5I*hFz_KhA|465-i7V#a7 z#6d|SZP9zCWU-z;CAW+UL;tj=9MREUQX&q-=a#X+wEV1&FY0FwNaB}nK*}%Kj-No*%c3$pZ1KQ-DEh19|upU&j3p+&%&gFtGcTEp) zKHS!|)qq@U6pGwWW@F6Cv1X;bJvk;`UY9fILb7i;7f z6AZOn(B+=l@17X!zJIWel?8s1n=wTIxjSE7M9?kro{hA`56$FpqY7VG2A~{X%ROg` z%vRl?e9qh=YTG_prE!e-+_J_Z$t}lsgPn!P^BOIY(Wt`;P9yw-$d%-@+?!5`}i?aQ%#5A#;FezTBqjq z^<9u&HHAXn$`C^-*ju2Ns#jXk#L0j5d z9&2iOc(v8bEemVY=PnM<+A!>-a+gQW(l88B9hGVB+L*sC=vv5J8tG-R#3W}ZTcwo& zOdWBmIWyP)z0BOtbSQ9GPq;ole1JP+@96cx?oqo<`(BZ_&rz#oYzSxn^LDqgS8}qe z<05B$U-CFXZfTQ&R!m!oT3lEV>vGZT}PA&DZ%#5N<*-+e|TcV!upWpyuO z2H=&+Pv*}pvc{0YmO{Z0wTL2L0~RY3R2W5Kk>!^EY!Sh=@}sju-_pIYxKw{uAP)9H zLMv28ty+pXU_F_aLn!2(A_e>AHqP{Z#x^PV@9@64H~Q4BRTb@vzAo>oDj46! z2D>f%k)K+MWib}lV~jy$aw|XIP4~Wfm>My8vW4`-_4GJy$-5cj)GPC5{wdGJ`WHQi*{$5h23H(S^6z!}u4Q4ik z=*4^`3ojlTGfV3RB*qKrAe2Z&Yxg$k}|EoTjJ*_i_C>jmpfV7mPtp%54$dEaFlR z=l(g9O&>zJPnSHVzzRQ@am9aBCUH{6X)>88s>LMS7?ar)vb3^o>U^D9t>eHmRy z7V1Jy4N0<4AIRn~qYs0*HTVo1PxEU{Jhk4=%F+y0=N$*G3T}$>q$GS=&b`3e%jZWu z$nu#CsbeK54+!+0%sw<_KuVLKS>g}EpufLfMSs=xpS23zu zOXB4E!oQeE0E-9wcUos@U>f}3k%Bg8Jqi>ILfCqwE>wYO5Uf&nVElt(i9c{}>5GkZ zuvA0ABScTYe+T@7Xjx(@$Y#Y25pwIgarIr5GkRjUL(env(%@*00iYYeNQW%)*nv5a zB8IJ)f*O$OF8M>zEoy_MWuc{cH7*_iwM7xi%!uRo5_@J^P5q*+sa^BMXbF|= zxVa*rX#T1Jx4M-|*lZyzP-Uku>=nYWRPAq6&Q`-}u|QIM3u!9aZeocFmZ0p_Qs~QG zb+DT-I{`OAiGrE2=726?MnqgHP%exO1zihw3gv&yI=zB4h-%|XGcr_V1_7TWnphL@ z!jZlP>XnKjZbqyU)&VVVF#@hKuzKv1LTN}Svku7{D6k|nQLYW#Pv#pg15}w| z{G1e87izE3+D2Q6+4KpH-@lgn9Ub6K^tEJ+#8bAUER}UseQSLg6n5&a&Z`@(l701S zV`x7hj~|L>E{>MZj(G*QvU89*@z7*vSH0)djZdkpGs+v+&5h~?Jiko3KL`z8Fi;mX z=c#CtwjElREM^#XtzLL&-n;HqKI`#9}bDmA{Qp4A5)k*LrV@S_#BG6yx{rkd$= zmlsn{dlb{ZE^Ni38tc1(wa6CO`#~7sEFfTuf|}I1v9#wSR@|r)jio!04@PmLPSls~ zL{1p>MZ={hQ-7=X?9ZA3QE^L^!-NEH>8R0$_JKp!Pl@I?*FV^R4tJ=B@YsT8D<=xt z3REd7rsEQw7Ft_D{_b$?f9jlbNN7C{I#%#v#*ofv1oYv8WXU=QJq+OzMkqq~)}c!n zg?HMHa@zS6Ap{T>w4v4D&Y{bhEKUOrc0|cf6$gO@1rrf>u62BDGf4P4A6zI%FrtM| z$E1fb<6;ZprA)!)?F+Ds>DrJ0$iRXUxgBn<%SlBw&(O#G%pBYrbi`D$sJQ%AjPt_R zw2np;T%*n#Iu-nGYL7U5QT2*n2z)o=?3uU&i;SDE)yBGJmD|^o=#YLm>b|3+-ndEZ(M#}-u%gD ze3g#VU$BDoXY8y6w~@W~FytD0#N)Y*=&|tj5n=kp7bhk^lzfMgUk6hP+-gEsYUK(k z5cvwtLtZfB*&919y%6+}#Y(8&ryUj4aLj`q&!*>NVN4A74pu8{aZQ*Vpg~hZKTH?L zZ(wZtMW^nzC?Ypv*1YCQH|Q@xk1MpA#C&dd5}{sBMEGS~1ilBjaC6-se8F6oMj)Lm z>=_4}=0?yfb5GoSKHRz_Qd5vR>pc@PC(wf*fMM-+2n>?s7vrnNkr*-_y!IRYkEu8M zoMQX$aNX-EF>@F(-nT>J+Wv-y_z4~;DRhssuMv*F@D)Hb&s@E?Ak_z!Bq zJm5b(;6FUzKRn<+Jm5e4&hZ}<7K4a^r4*4Ip*j(7T3`pGFP-j`-R>n9%Vi+#d`!yB zcuP2py1Z=RIX>Z^1*^4iqlR`cQ1W9UBDf$Ic>2@n_Z(M8sMJ&&zIdZSVAfYDmfU>% z@5Qlf{X%q(IPQ3LK560iiF$ z*={O;eUuH2wsl~hSI6&vvU?wF8PtV(lk4O&M=|o1r@%f~-czqtjkGIrYBGH%TzUr$ z?g{k09Q~seBolO)7;t^C-;8P;i#NNPO>5dL&s-~Cy@;3~D|YAyie68T>AvaF4-W{f zP;RB7Tv+crTAHL2g*TutqX8sG)XvLG0XDEkCvHYb8Z{KTv@&K$qs(bLhXJ9Bd)qPK zMz~J`YXtIpt;y_IPPzznZh=CE37Sz@+Mg-FZEdU}zsOI<&CrqmK=#Ii z{O9*6|KSC*xbSCb$w6koG)Cdmf}c57M503$)MC-NJp+^GacTO1Cmk zFt?zgQoRwI0cb1`RUe)M!ZI$y7$DV6X-DU_$7a$g{eG&vLdWt|Aj2gtfeDw_ zmM)#qo)OyIv`KKN1dOLid7p2?^3AiEM9XwKFboo;5yBngaN^l3Bh@8|4LR` zHv{Bk0eu@eoVGX@?DB$^X{!yh5-#W(p|rj&TBZ+wh1@)(?^DSP6J1&uB(v&=i!?z< zgz(nWfj7RmxB2Lp8TDp?KO%MG8FKyDCS67JN=O82n+Vjl4T;sZ3fa&qwkT2COxrZx z6YLCzL5W+kuwh&aJ(Iw9b!ksKOvc$|8+8*TPBk~`X_qU61DIYRBETjkGz~*tS?`K~ zLZiw#vazBB7!X)6_?y0oTd*YD0+Ko4Qw}X>W-yRgUs2fwb=rH1yvP0u(63R+2}@$km><+cwg(4@CGk z4;y+{*q{b}3+}2BymsY_B1k&dBDAluV zl8!WBE1L1ZF4%E_4`(5GHF>l?c?89j~<7Gds=Ce;OK65fg?*$BBy z(E>>D6Yje!gq^_W3^U}krJ>Vuo%=+q5nrMXbiPQd}>V;D^mp+(63&5o2Ym6gTPnb}0@kMYW2oDbl~l z18J$%@bkT#bmz|Lzfi~lSS>$9Jj?P)Y=pA0n304wTr`4&Ze&m!5jW(Hd*A694(ziD zb2K)fs+@Xy$fHU!xa@oxTmqAzh08HAPq8o_?TiG5$!yfKporz8LC;c3ZskGCHW6FX z4w4x7AVmiwQjTbAQPAk$9}IN;u3?~WaZZML=VZ8)U!Vg39p3={*%-xw*w0)pwJ5V1 zwT*Lc105YN2^_ryY_w68Ia_||OqgjV;%r*3WyeEAuOC+3e#4;#$>lxykYJ)Z)81v1_=~j90z50uy0*Gsg|weXiqcl zH__CaSFaXsZmEiiy>)B#YI_}(mGbb~)C+?Vzq`Jv2nmE6= zfD(3*a}B^*_r59I34$(8`u8btVIe2)4SFO+a35*Gw}I8Ie^VIT`klhy(h{4Gfh*ie za$#`iBH%6oetT!Qw`(*0pdZ6)!}%b%_Y8Y`J{LUpCa|{)!rL10OH9q&!l1U{oq^h_ z57aLmn-{yn+$gsDL^MUG0Ni`f#AIga#(?bf+B%q`M1D3D`fwooHL%i#tX01esA=7X z2as5f&uDU@j~&^huFOIR)`fvHTIRevE~EriWr0G2Z+&} zh9_7KZ~1m>QvK2<|c7?>%cL57AlbubV->Yb=< zbHQ~@C7d{GUf73?SDBkWmaHJ91{xZkhs@idWM0Ff85xvFaxM_3jU!_R@LL4b_J);b zA$sLPp)Jv?dDVQq8AhW*j?7d=XCl4MSr)$dl;3{NT?p5FGTt5J>LNI+3z2OBR72nR z!*4WxzT)w0Bc(AMOo>l}<0!XDUNr8DXq6;7CBsV7(g*F34bc%i4a{^gYOP*D8&Fr_ z{RVpjy@R`DFzm1c%C1s~jr%I9wbigted>ByZ|+f?*QtdSjr>MBSX*(gI%w-^>z=oR zq0bR4;|rT-thtNBy1E7fwHEwbr;Z#=_)!u-3WI6Z@n5_cWrSC|=F!wWoo0jLUk8J~ zaWGW__={GR$nRptc}~Zy0o-{H9Udm5hc~th$e*{=^*CpKmOd&CAaOkx!=ZWb42L(o zz+_ybvjKKuO6Gd=>;{nL(sUrhXuxYRfaRpofY)5$pijL=eiFBqsuBy5We;r4?l?v$ z5Pm>l!>Wt0oSq-`b;uxj z=^6UEn00~2jbx5C-g;JS_|$U-)TEg?4{_2#2h4j;apvrYj{VNbyN_&TZgDZ>!~Z~F z%DcCiP_`I(=#~~NWX{rH>v=$d;qTetpQgq16b*a z7UrN;`XJzLiU5}Z0GC3j^ukeQAq=uw{Wdt0ivnFbu#{WfO0!b!G+K04z}43u#?(|L zNF!3#tK0obrLrkApLK_{)~c0KEi9GS>wyoJvf*za41+W_C3UA}m3l!Z~`v3S<04hU(Prs{43~(do}8nR4Usf^9ljn+j^PDWEpL z1>z%g`ei2(%(9RjUQWhCJhlg;&*M+%iRzG#b!nvFVJn0ZExU{Hu$P#?ZPFV?lqFx7 z-9AAiPRB917g_K~beVQh7Zyy$z}cfg36i+O-jjwVi|x&V7rtKDJcgooRV}<84j|hmkzr}U5=Bf94pEegsCZpK$sunP#v8&J2<_^W*Rip zMa(>p`MV95>Cc-??*~TnJR8l@2br0krbTfvoAWA~1MR8sQw)qxT53=itmAX?gk)4m z8(vc%7G9uDkz~Sc63NX!jJTP_?WMAh`pg2+XhyTkGk%*Y=oY=%IzwPq5I@us8l4hXi;KFGul(6ogFRpEC}iOhuK4-E-RROw@a>lO~jXE`o@KPx}K z{evIh?fr>N+psP6RVNM!Shdl)Zr(>|L`rM#hF*sxG6l;<{zR0?AXGqpSjTMA!l)K{WL z4K($2r67eUKWD>pDZH~#7BW55vqC^DF=e;vF^gSUq=>u@oL2Rs0o0}{$sJnN9ojM) zbRQWkHF`cNlpY|L90vBD;1tYm-wRRdx~=B|+fY+T>W8%nT~6qX0>OJBch*;yA6M|; zi0oixb<(J@k&4pHQ6DH|+0`J4#F>r$_ynQ=F9XL5QXLoPg5cRsr#^z8D}tZL77@<% zZ%ghQqY9wodVP^?B&5n&RLuvd&L4i(&^2rvjy$NTUh92$zSzm(0MOMmIdpNy<2{Q8 zDAvwgT8;asLiNt5P`w2eP~4tHg{(B~8+kKA=$&wbv0Hl}HC+EVr2LRrf{HcByq zr_j%&y5%2Pc}pcx-Xq>LFew9?_5ntjiI7iJmjNqiO;A)SoqE_OTFFcv^QZytj0{g_ zSPe}oNz_;}WB5<8lE-S|+y5>+C z0cg$d!dQVx5fyn(>nGGm4+ zH^0eth)c2h4VW=;UuK7bNbL*l8|iu?%W%-n*aCw+Q>!kvTL9_&=j~EF&vLk=Q+#v@cn_H^n%5 z)A9vI{Dz%7j(bte@fDX7V%#K#n4?k3pa<+sp{;9axxDPt1BmK>I{t@T!1ss$5!MDy@r%aWe;tivPrPSkOLlFFIW{|Bt>L;)yKBP9BI_s?IOM>C0HIR zmeVjMf>y>CDGDBX+G@Yvg@tpJYSL)#bti^{X8HE)tfHZG2_qr5qq_$`y1k?r%c7T% zd;^m3oI1;B_w=0sr)t`3s6T{rg09^%pEs8P4`Uy2nUmf{5+~(nVJ5nNaKc7&gi_#N z7DNGQR(kMbN&Lvjnisp_N%0WPgKM~KK% zvQnKGPLQGMU)HOt49ry^1ICKVfoXWhEub!=U<8Uv_W_HG^G4U>bi-eZlSx-3@)q3< zhr_Mn+A_D@w_Zsi_BpMjr)cN=^epL_(?kNWJDYSjq?a+{Zsas$u6-fDAiZv-r`Jl@ zV1#r3YN60M#v~ijg$r&hG2LTleFUq<4R`weN!=L1$CINX!NUHpd>H=nOZpVwKiS)R zdHR}e%Rd^G!Fle~RrGaC<#0O&tM>KF!}dGirQ5F$-n82&-U}-YPbF?JwHs^!-wZ6Y z18UWj`unTAa9b%p?lsbf-%lLJiKVnjuq5j$cnn&qhsUQM;o%a5*5{+$4+r1xwNG|` zXz#v12r3!8U*3$uz>Est99vD9NrFW_eZTkWVE^D1Bg4Huc;)8X`w?CeZO8*0$ll@W zQ_b%HH~S^(p;?!~&}Hx>dA-u)2A)#Nz{{r$5g;(C_1EajgxmkIgq= zvQw&5YU77UcBRwfS24U)*&gjIg2RP<5y`p|cy>WovojfZbLn(fIj$$LG%>tN2oeiMzeca-|C?P-0#e;c6~ZE9g1*VXTf!b1 zC+Cl=+Q0>y6~cF`FZ$?!b>`1cAMm(6-1`x;7Xs@bF<)T2r!pgzD&kTQFR-7+Gf5bs zX*i3=pQ4dNN9$pAL{VFn(dY(SwINTv!A2+>cnXVINv{vns)fg9Ps2K@=A3raeME37 zDN|C~w=QKLmefR!YyQkp^O&p5J1RFfCaR#~vji-Qm zKvH^;*KnP05Nl)1Z-Xyw z?P1auDQ1{3;`rLa`o2YW2ig+f)KNljq@k-QIURRf1yW~!IDX}%v9Dp9;@!EmD)+Xh zD_>iwhxfhc;d1pq;xH|r-mZ-~`k!i}zUkt>*J_&&`k&t){ySm6`&2)bTJS%ePqVY& zeI;3>9Ui3JVl6M<{%y3(=EHRQoz?>QuyztyY0=VZ;6w z!ndaNX{!|Q2jqoiScf2?81m?~8^e_v4Q2Q+E(0~oilKk8=oI{pb)a@~_r1tZI{=nK zyW8)ymA!AZDN@G$K1y*Ln1v2-lvyi~12Z-`Fj2Sy zSSKNKpod<(B0?Jsbvu|-Jh?q*iChe&KrRKjg;hemq7no?AbP2Ggw?0fDKURE;yRJe z)&dz@8=re_PsFKcRH*tQ_nng_9$CI&Q71w^6466e=9wv?GaE)7YIX*cc{DqrffJZd46?@ctdf*s&Pk`P@` zS^w(8i7q_lfl#T#aimp&xP1qC(4L6}7 z5;l#5v;IZ_w_so7*%Eo`ZsDd#sJRK-BBAOggcXqz>XdM2#U%mZZo5OrZb5ge*sVTP z)(>SXq1g;2Rb^5ol_ZH5Zl{tY`NC!@NfI#JN+n4WhK*E`q+Ga}N|Lk->!~D3y|9)_ z()6pQ(_J(<<9-Igz zehw;=bkil@+47Z8Z27|3w1789`A~$m<3epJ#Hkfb?TtrKIt?$6@?n4Cq=?&@&$1eN zvbd1Y!ku@;Q!zW`oJ8by>_k$z61q-&uyGmlV5c#u%Q$sShk}Cgy4Sl}^C0vMqX;pJ zGE8$L!!$E8Oz|RT!x+cr5N0QjfjH|Iup3YaCGRPM$^%1DRLx|SXOiOf#0`1W6slVp z(%LRgxj0Lkg+)4?+w@u?=}+5A=) zyUP3qM`K=*#nfVO}T6f!k{%$trk|AqAerk$OxY3!-fkCt461t6 zmf>oN%5RQ7ZgAM-M~_N>2GX7*ANUP?Zx)gNYh~(v$p5QbVWZ;6|Erb8)`R^2LH_?B z|9_DGKgje6ZgyZ9VU zft`7dvcSpg(-+uT43&X1C|7GBy$d|bgCGD_K&ii|`3IJxK!BPg`|0$^uSE#Fq|a6* zc)G&lF{iqmKi6gdWXtX^)_D;j(U)227_w^1P&D|)=J3{m&pHZTdlWc;9f&y6BZ+3v z9I+Fu2fzqW`lJ(I>I5vQ)8G{YFBn+@C0!VZ+^QxYt)Gy=%iNS#f`7z>K?saFl3^vxTMf@Hm&fC8-y@ zn=8=9cfs*2mhn+h#)nD~jRD;;qpwIJma!PcfnYvHW~WFz6qgTq5j4CXkV^-Knc>)9 zz~VqrPuyLx{>$l3Z|Ip>R|BZ*U_GSKF(RENEZ%pPiT$t#(m4-%|}S zbFAvqpPEvhsXuKCL5uMT<;I(`ejLCMh3&J68`743bp}DQ!7VYf@;v{Jx$(G)r7+4f zS^Hw8Xk$mjh?TB}1&dk$%i=@Q7OHi&FipQxQ4mFE-8Dj*6`$ z@;+cInllo#$a>E(9yo^{*HNuH`07W>;xkg_)6hA<5umouKU9eiGr~#;zKnYB-Op(JGog(V@@dfu8?&pLQ ziTq|m9!%B~oKXar_!_FBaEN8~w5zYI7-Ye>h8<7v`{RSxtT+sa8xSOwRywKu=j_i4 zs|@Gv-O+fGYWm>l18vugV4uUQ4$m1M9_tlHr|cxxZPoI<59vE!m~GVTCjnh?cCWvA zcO(?>u;2Sl^hZZeUZhW)qpET!^)xD32PjQVH9#?RbJx?^KXccUlf3mSucy;{9uKf- z$ry!-0hJ57_*gL^qpfEXS>-fS*|zgOKQF22{i_vz(0 zj>yi(*Q)6RoPBX;UDy0wH>(ZLD50(rlmN$N0X9_@CCK4~h90Bci!GgCccZBiqy*=l zCeI-0jwHPvYFPCQHL-?jkSVc-TD9kSD@{L6&_k^@?|G>7%G=33m3a$g^Ljmcy*W$g zX8qMd(p`n5bjfn==>>)h4|-SQxQ8-Keokt57&MtBn{#;0AwvWsipp$Q0B^ozI_M85 zaKa(lOT?mfE1o@~!t1P51A;rT&1b#LihLVw3WcU7*agQe$Jhs0TnA%L@PSUD+&T8u zjIeJsz6~RamKS@V2kXIB@Eu1;77CL;!7&(}2PEzzcF;d*XTzy{*!RX)qx+i01y>z* zLGy>y^UeHGn;jP723f3jlg=iwEnC=Bt5BFXFJ&X>sv0DZS?-}C_6!^Yz zE~LZvbS+nn@5!H~$@27d3h_}kj zyWyt%h`*JbHmn2r-^-QZ;m=+Be^}x5?k)b)R;}Xtf52}K_#Y4cA9MUa9=tyuygwei zKOVe4{%yQJ^aptZcalrPEd-??)}8!l#RK86qNNL~E|y+#1?K$ZC(n0RrUVT9)r^?? zjj&$NF;#<9W$i>kg09GpDpZdS*M6;zf`BVH_h1K-eb8($q-O^Tsxj)X3PYnFWr>hA zudr-cS@5kACMKyIw9ywKaKd?i9>x6XNX7yzmEJFir&_~y@rSSytdb~+Km2N1Ai z(|Dutx4Ll3HotA^xDV7AKN@u(`s(fT&`db8@Wcg-+j#k1_sB!8BMslRu-)TJy*uLjbxsYKcD!jO~? z2lGIerltHpHS`~4S?aYVwX98jh7z=v>-FU|fK&*rHN2Lj>Z*WaA+2Th*^}L>BN_Ie z-lJMtYZyJ_Q08oVl5Ku;w>^}w8vZW!ehXbRtV9>>rZPUkZ_Si-foaVsMCA9eB$Wiw zZi!CZT-7nYRHFa|Y}t zR{E%f8A=go$zAJ?4LEa1Tp@>x+BnrxPXE%YAp4BH>yC>9I*EY4`q~BRrpLzti<1xC4Qn=X};wiIaXtRWD1Z-1kg#X_p zses6UTel%|$mcuc7{{UnW~$%E0m9@|x6zKIMT2PJF%7>#!_w3PNaYc4r=;SBeFSPP zO~H67>6^;NZ!3WI3zF;e#Kz4G6B}wkSl9%ng^i!;DcV_3h)A=RkViySo;&de-k@)|n?v9Hb zA^X7Q{o7QQ@gD@51IMnvV$_EXeo5$W1pCl*zM(5c-Tt;+f>oftrJ3?HGF07z4At}i zL!tLc3K)tM@p8x#c?Zs*&k?&BNVE;nyDjY92J`(D8z)O6Mj;^^g$yt$#FEMalOheS z2TaP$MRov{f(fsci>{Rc>%>At3)zWQm5bJ7s`2jyJ&BQ2md8%2ZZC(OM9xaJ(nht8 z*hzJbgF^{*PS{E%Y;r;)mC)dXO(TJ^lMp%y#n>X>7U!#{Drj;-EtRm%3Dr~r?0iZI zjTCGNL6p3@%7uZIOk5>JAqQhhM8`9dw>BCuZXle{;i`!cVnKcsMWza5 zO5uSN{c8XVz|nHJ>Hz9!ot`+0OB#}JHrs;3B(DSX5{)T67>Kn5TZ^x6UKf}-fG#s?4Ovuj&S+Y^1fZ8`%>f-P;5PiHky?rr}jw*91kn-KU zLxgq-teZ7@+Pz|fuFmkPbDb!!*#wN-0LL{4-PzFk1(q1@YK3nsa< zz(rAF;kyQcIt%=>V+l{S%vy8o-$-uim;WIn)*bZA-8+#n&GY{XYmWR6KEXc^^1t7m z{7)|&j}I8KG4OXa2zE!nIFGJ_H~*i#ckgQBSo%iKztX3e*ei|%LeY$b5MX^H|pYd|AVA|z!bjGe^qXFql6`}B+?jBnY>^K1+~eede(>guZcrEq4H1Lwbt z?yy}W4PuQIgg$?;mD+Em_FJj_R%*XbsP@ZO=F#ywzPucd?DXlZ2WKwn_wWKiP#srf z2~P$GNB`&G>0x*8`Qy5!SEL{yn9R;VZ>p3VM)~+jeILx%>G^bxG2KRBZ-Q|=B*vx75I@8GXjQ(aTi zRaKBsLsn#Kz!PGR?B~vIT#J+S)0t#UEG2gkKpB#w5zp5cE6iNtWNgW5rkzDUmgkTKenf{T~wTTzbn+b0Ll zUvz&40_2LhAF6J1+BKo7)LI}%s#c=9Ys`oul#-;G^>wI8mEX-Yv;H73C(rJPx!e^e z<)No5!GFpnC)-Xon`#5n*VnmA?=TG&lyn!mg5!~TCpJHvpz#2XAvALtol}TB4n+fZ z7C4&FF%p)8Yn{p(rtCV{ACUhLMi^4pSy(4vzEhADgbqm|Byt_ccvWDNPOQR=?)R1> z1*(912?#^O9wT+X4Ptcj6fRQ8w4ybf-f_Qz4OE4` zg?#96JY2(UJcFa3mH|pMtrDy($RXFjq*t39n9yOJpN>G-xrE6_8FMzRDH~d5+hXmE zwPYm=Y1>Hxiig}wO=+je+c60}NpNQbEH;gYcWBu$npaQk%>m4{U{V60oGsy~^N$}t zKX|!Q$y1CLQ!7KD>Mw znUY8Xto-Z(F9X04r^dqQT9Nql&c?%X&KXPs0!$d*p5jzkJIv4!n_L~CQCUit5#Gdg zS^pt{)T7=v9mG96nPsnmt*At?i9l3tU^lVqQGf6z>EWx(g9jtpBKSKC!dR&)i+usQ z_SVK|Ou8zXW=v5Pl3#QTTx5b8o)qsXy#NLfUcCm-D>ldQ*@m#@~ky6L5{i*Vmo(c-@R54cN;e#Nox+RS7 z_a7L8(-P8Gu=ip1A5y8qqvt0ty0}Y0cERNPlzhC$sea)JK2U8G)(;Ckz@ob=Ex&bjOY3D61yd zgN=BkgfrLA7^h~GoF&s~oWAAb1}Cec`Y_wa% zVW!RPhGl9Xl*v*TM4DTQ6-?`fj1-t?U7VD`S5lp7%*DyGgZ-n!qx~*lwN9Sx?c*VL z{B(a0FQ42GdadIYRe%Q`lsz-8d zawWgMICyfhH>aAmTk6Tt)03#Ukbb?STucX&Lpe88A!fZE4|;1=Yq#LU@g>UH)o{wl zG}_L)0Wy;Y{Iju9V<}r+p7a&Q*m$VkyBg_j({nDhER?b0NndAZGx{!GH@S5cT)Gz9 zeyT^JL-~8Kl-+>K-|A{?Uon`%a5-1pr(h2kiK8QsqVoJ3;7vDJ>2I8Ke4p&~SXIl? zREB|;oJG?z*an6`y9YHdi-AXjzYw*`SzxH;M2y1O4t z3ajSr;}TPMNiF5xNUs<0wNZk$Let4`fcJ#ibt1g>pfVMX12qQvDLNKc3F4LFZPe`N z17AmWInO&kU$JN7LC{`n;Z9j_+-TimuMDJU_E1t2_@J;R=;Aw*@ZYI(T~1O1YFvBEh4heZklb5lU@*OGXvvP8YIONJ2FvNn3={?6II8tfPuo zBhHNj!)V3weng_PAvv2>6iCXB)Os_4)z@p1(5X3Urco1>%YQ_Tq8hsL<@BB=&>BIZ z9B$nMZe7aH74qkG$(+XpGcP;GVIGNjXB#;+lKKAe)03Ca4^GVaFY9L5>d=Ck*S3hH zpcG597SPgQ3ZDDGSm8Qal?%64BVmAlihrs`?lt9rlrvlz*LHjc(up*MWOBZOtFtOz zlbsWz6kE#~+j%mRCJREx$RkwSLa&0z#uMmOX5ZrVhbuFh6hgpP8KH5$y#GFz8d0xT z{;?)RP6ST&%CqVV_Ww%b>ux+5+>-gnJo}GU6t!IYk47U}*?)X__8*FHd@f+yHIC=& zG2qy{nq7?3o#00_hX7Ib$22|-UO>{-B)IkGbi{glK@}GUmel6?@pXV4ayg?BR;8e1_vC5!`Q9(xy=O<|G7F$2 z!y@A)m6dflVv$tHsp36Uyda2&gR*nS$f)9Wm7>m8$!&zBlzX7Ga`8+n<;>o)gnD9W zwBlJcR{=^FXzJ;@^#sdm#6ai~GlnkG5P-2cgp+}{BGEj*=6Y*+XGpzV1zjJ?*tDAM z*|R3W{s}*_LGkLa5J0urXMHsm#5DkopirHddzV^tTn*} zfJ=p?EnQ!SlW2lJF+nX1T(HD6O@ScKE^snt6R{Rm(z|)W`0coy=WpnfY&BC^&B@}`ywu#;-<`0%cz@iAtPbT?l*7|=8G2q%o6+Ju zbt|%ZnpcsDy5;hTd}eR%R&0VT8Abw36h}i%d!I`hgg)j8f)96R4U9JWhU{1G-L@ zgSB83V?c2XfHO-j8QuXo*d!gl9-yb2d~n*3#?%41rzx#M9V_`EevP+ey!O`E5pAk` z(4a~5VMFbRGB|(Hw?2bV8%VOxzpYq~p&v7)`D?7CqUOj?>E+Bwem#YG2#0 zpszF&>SiMlo0Vf6u-MUbC^RI%v@ftCyu_cPZAN@G8(*TuI088H<%hVgIkR52Tv_Xn zszfMN$*5%zgDj_(jGWyy<++6w0y7$;nM9Jc9rH63q)cace4S{&y8~0&%v)-)mJl zUG~iqFO=3S$@ieOv!PL3y$n@VbLyU%If(heN^}y}5$mr&g%q8xDkooOz$YC8yTpAg z)Q?q0Pxzt8?H*JlUN`Oc#L}EsD>+NXyH)n#%1Xs;2VKyUE*>`dADSGI@*wAt%X)FE z%AS|xD;xZFFH0se54UdrRn^Z++_17-v78dbI*8ZE2e|!rjZbR0@X1(g_YN(``OXyC z%w0i`?OMRgvS}r~+mDoJ7jYgBVDAyuu7GltJp6T%P7Ma`QbmnTd67*KFGIKp+|coe z(1X&;q=(wy;LgR>=^f^|28%;S85OvtpN=mj^A$#48_YbIsn!&(3(!0#IZyOny3M6o z{WxrrEvGI=xkj0JudbO51%1hTbgj-=?96IEHCKA|D)*`1{|3{u*O+`eFM#y^*UEeU zYqnd>w)_4UwZql>-vyPrrGd#A$GUI);(`q&G{mI^Q^iT{shU@%~tVlwLB9Zpf-mgeqs4c8S zN-0p`?p3ShGU{K^3Rw82QiL8tx_dJ#^Gm1f9Gy5uuj1c2uPmE<@es@D!mgXtNT+Yv zAm0jNgot>fjmZ#QOrSy0KE^j3Uyp>#3u7k=bA0lcrIg>oHni~0>g=w6C9%Nu?FoH3zvy>C{Wr6VcW#UED-PL50+0d}*o%Lkhxp5tBc2 z@GCAkj85DjB<7t~uf>xI9^i&XPWbh7r6N%1FuPs6;%ZVjI>Cx6q+EyVHUInYfumk0 zzYqR)|A7l{B$2Cbt;%LpwRFRZuAFuITd#IJ?MgS-8o6?U zckKqSm&PWAfe-~3423D&KNPkv^~{d1(g$v(dJ2pP6XLz44|nfbG7=*(VoRU~z{tm5 z=+@sDYO5+{PWeoV5Cb5|KsQt-aqoq{bspG=xwf}TSrPt^4QZp+EeW{5Vm;WO8Qx&dG{FewRfwX7V zgYLKnE#YUiu|x+Ouf&_7nNiR}-IyzM_}R^5ARdDKwJXyZ-R1QBRRWt6AiI!YZIM*gZUuvpt)F)-J8Uo0xLtluaahG>v~db|{XehpvOL4vGo2b7H3E$^ zHb8DgcfOv~YM>OUyj24)?5ER(X0*%*7AjsOkmmQS-Et?l-CCw=cKMv*mJLzhhrl$e zk9>Vxc=0$Aso8 zckTo`!JP;FJ9Gljb!p=v-23eFV14~n74tRjRMt4uu9&}Sb=Sj$cMWG-S48*sjwS9} z=^jtcV*QiJ(%Qp}5z?qy6#7n!Gnpe0Be;nJ&lIIqKH|R=^^1rqN31qRXbe!a0Yh|( zqcm*t@2k-*ad1EPzCA*7C`c^ay!HKPgyvGvt@Q6^6r`AzOG!BtB=gUsB#WY#I;P#@ zS<&P|$Mg+L%X2z&J}=Sw`;?c5ESEQq$0gcdto+T7+05~}MBf%Gzt}nJoUggPScv2D zeLwEurQQf0K{6~GvcVx5lNt@q+BE4WX)-#q0VHz7+~RvSaY^Ktuj90UT|!?`!v8IL z<*1|7M*j*bz)MVFz#MbeW$*R+{&9XT-9@kPE>Z2Dao8T zh^F*9Nhv0#IA5kUdfMIKm66IN3Up;C?oca8Mx8Qfq(S~{lZm1-O3pLbW%w>Uzz`>F zeM#0zCho_W{2k0*$zUe(e#PeRgw8w|89F;-`t^#M5mk$qRF;G0vU?(X${TtE_hT(^ zH-mlXqj{oYt)6NaE+L54JRLSSlwNbPYOV+##>*@hURW?^XGYL^qgu>NvV<#|DXP@d z@f)@RJSME#hY0GdwY8hj@Olo7sc8WR=L`ImUJs^;3^#@9V|w=P1r?5TZ9KnmtS0xw zSyPhvtsgqt@=f&ki#vzhTg&^OLo$3cZmpuK;Zap!t z_vAZhro)OtZ~5$c-`QIoY5$rdZQePx5Fy{fNwrKn##v>Y%6u5Bv)Owpdl-RM2_Xpy zCVl$03)_0}v&Yr;e2#~R7<a#8U6Sc_5fX1J?Q?Y?Em)co^c#}jHusc+(Rj; zh>CETyL*@h6L=ZF>C$&3pN9|hn%Dvv^y(~;-i}1dLPw8rWYHN3C8)5?kQKOL216Jg zPP%z6pI^mfwl0Tf03P5B!WtwoniAoLy1Y8OFeNEHZY{M4C&P*+nLIU#RocLiam!Q4 zSz+OcaYiykYTP_DJ=(NyxQ$jTM#JlxnkA`PBEi`yH*t1aH!d;{)Zbd-Yp9I$$bik6 z8zHw@YZF!N)|5cV9XH8LnIj4ONtS0IuPxu)L)pO$Dc`6Xe8ntUb@g6c_MVi7y6XDh zfYem_!n&4sb7Caqv|*xXf(T)T*FEuUh9tmz1PDdzyg- ziy6q?xIA+%Jzd#-E^{^u=R0{kJ4dZoIMM!krVA;0>&UZ1Xn>UV|AC6vxGGFhMniatzGO_d^MPy1vA7khHX_(>cOlL+}}{{ zzVqy&b?u?3J!~|a%}$eQhkl?zaoDcRLas`I^<)Y~s?c?&ka`2-Qjr=+v(sqvKz@gV zHIiosXKNbcZG>F;XgskqwJ=j(JT`FBCMN|C9|p}xZe~evNb|%ucI|ZZb~gN+ReFxA zGiB=1F#v*gw+r-;#3}HYvx}sn2toWJLP5QFzW39!r^iQ64rnnXpYe+F`#@)T4gze# zONR*YTwxx=xZIY+L#hpl$-{?*Swe+{H_9QJ)N@1VnQFsc+isV(1KIcheQF)wA!Yp^g}Q)7uuC9e((AtVP+FbFdi1j|mdaT=c| zjs~1=*n5dss`O$ru({sH|e@6^mTt2!3Op!yK-kteS+0 zHeNgE=$EyDEXRyPuofY6qI5Ty{!Usjv-3%es8t$4Kvu&j*=gN!B3X-NQU7FVt$o#; z;nc8z@k&P-Ib_!q3tYL#a6ieOx$ddl@JmF(0may0wmXB7A13N1ZOZR&jhTKp6{y9LEwI#(s$|f{qhN{`=joYCk*OL!s*qBe7(sUU>xAX z4f1(%_QB2pLp>b~5$}$#$Tq9&1>cJ}F>nJw<88XI;#tK^@hl$kefDxp7wH)g)|0)T z4q$#RN$DVao{X+86~YutqqepQ;@~?S7;?Ws*fOQS)ZMtZw>3? z!LLxdyMJ^DGkkFT=tL8idt=#kKQX=R+Fi**bW=qAzaIZ<`gZ!de)7TNe}&D>%}o5S z*4EZa{$Iua`gHNXRw2Gt7nIcnWpzRMGD3XW_Yf4ntsq}4_-A5&Q7kVw03LDacsQV^ zhv}HDIIa_tg++{Sq-U7pDFSPwN!{?R3d%b#*wV8Xu$KDIW3=`k_H5W&KGo zZLoA-rx0WG+xc*OI<&19L>5$y+aGGdchbU-^IQyiy<}t;{&tOGPG_z9q*9#*oF?Zo zikWyM7*U!hX%hE-OJ6sm;6FhW>;w(>J3dNw`;!{~l9J8sI~lRvvdXYt1Nr?S&-~B? z+s)V^?v|}P30yo5y6E3r=^)BA&i;CUzY?9T2VuL)CKR$GY_(TEW2=gEhPI;83_!H` zOF~yrWToe0`T7bM>8lBPT#i#XOcAKu2-Sw1kiH~ztHu|ovU(ge-(aWmUG|J0faQ|b za975?-_c5pR0H}km#P%C#f_Q{*d$JW8d;KlGwmu1E|7Zoof71Lm`-h~RK=H*#K0DD zGpYs%RvujDg4CrU`QGR)oRlybrwN?1j+LBzGDWGV$2CfueFQu}ndAHdhA8TqfPj*u zuait`iboA*`o10utN}4z9xm}(Wk5m82_(@y>&HPD)(pD1%Td1vm%;ww9);+q*spO& z1!))KR7}h=8$q;&^izq$s;-|sVuDUB*x=7r4QXuG5a!na{oCNr-21rK8^}(?X6Nba zoZK24Gc<_9by7BC#I}SR>|n&?_Xm z4b`Xh#u{d+^e0s(TWDnq^Rh)&wkR)K)5_M&%hs~8weqrUTG=-9vbC*j?YwMTR<}ZZ|Tg^oCD2iq@}~}@i1kgR-aGM_&>F*UN(RUptVNh+c*p=K;z#60auCdoAD;~ zZa7(NH=NAf4JM78EJGtFi_(Z3_VWZE`1zJ2Mla?_avbC-$aOYsmSgdk$Yn^!2FKfQ zNRvvYqTSHSPVGbm**nsjLw|y)qVt&&$QIZYis~Dd090lX$gv@;2M2E^3A&^SQ*wFI zv8l+$U}PC0;XxDDEh#47uxW8o#%t@u;*22;I$h7odhR!p6`e1pu;_fsmw!y6pdSTP zA&)YhLlWI({0F`%SP^XJoU+r&`<}AC8jMrcJ!Ge5KUB}B%=-q+xRv(}c<*N3H(<5xyl=o+xAeC>o@6tksfQ8S+$WPGQaPfW98Hy@ znUkZXa{9SmddfEb4b!iNDSY1*(XksO-rU!h0`;g*hv_^H`IOx z4qIUUqFS|2tPDLK7trIepC0q%6aP9N7p}AJW!@=s?Ax>(zAc-7V(4;FLAg$bfn}G) z$G#ei961@@D$X2(5q}}?Khx%R?PhcJ{`2p7|7ig4fS+4h zU%&U*e4xqX?|@L+3w}W8tfLXj9VbAPtGAfdTg;dA79$^G=sDrzzr|!8Vz8#7r&4~UwFkHGA0u1j{&&PgJPqdlH>V=i^TjH@DHn(>lWeLU8+WRkI@M)G1y7W{0W^j3Ri6QDw z;cf$S{P@}PsfKE>T%$-)0{pyA{V*_gx=;wD^^;&Tr_#fPD;@ON%n^muH{Gt)%Ashb z<-E3;-y$z{0{RlR?fyT1`tr#mdgCOO4x*QcU)FiHxku-xA^ zU->_xw&%BP&quabmBm{KxU_3KZM$BN*ip33tYmr~tm%j_(v@032pj+91x%^#<~xg1 zdz5=OljnTw%{G_GYQp(EnC!y;aYavX!ijEqrY;ho6%kblm8A9e=hjR1NZn@878mW= zkn0Tk7*T|}g_>aT%qhHZ@lHS?M{;{aD99+`UZs=qG(o}F!R(Pfy!8(_wA=c4GL7)m|8F^FgM79J)k-g3U~`6V~wgMi{_%92_U*>n$EAXqJY9Kg6^AIEAb0 z1n+Mg^Y2@Bx+FJKIZzoUolZ>~VI18d!X01m1sytFAxu#2s5p1nwzIc($|ZC%_0O^Z z9m_BdA^d zgZAjQSi2FoMhi^k`QZUA7SAVv;Pm9}O>y!QeK%qJn*T1FU~g-aSt_#(B-7MK zvlR_Y1}CjcGb73DTpxCu@j-<@qaZez21z`9EB9O$9RR)EVP{iq{b77ABD2Bmr~CZi z1%2LC8(&v`A|(foB_RXh;r{3DD-IwYjRhmf?+71AJKk^mPk(xLeDG^QKe;sYlon-u zeV2OqiwMGohb~+ZrBR$2N18j79pIrY&4|}8Ykc@#59{5?ACtga$?dh|{&wqrRFvFG z6g!u-(EFS$e*E;wW6og(Ip8F3gSx~r^R1eKC##zWSU4W3aJN3!uCV zjPkcOMGjaPgG)4guS%4{<@Y0uK?Z1a0xAmGio|1ieKU8042NtM9rq)T}WFXAWagEhYL%% z!Ke5%xx^=-GeL%VcAJ!h3XPUEr^gVsy(Jf4+9*_-W4H#HlLf9f>L}gS8 zYd?@tAk>z(P5$|rJ-M8WQ}$s|dPsUlSBEv7#xh{E$pC5k*X%uv4<-iBBw4~2_V9m6 zwSdP^{YDji2-N}^$Rp*#ddTSUA79yV%UWZ6*U-LQz^v^+^kP?KURTU?8I;~i6A>lt zL}{>1>Io6>uq#9!Eokp*-9;+37PY{NB2Rx<&rTehQH04{n+UmS*Ky?&4@&e;_SFiC zjbBq~U@ke2TJW(yNiCg8jk!^cSP#hI@XM~PF;P-F?P~Kfpd#)*&;d%Sh7$f7eIE-I#{cd^A<7HW zFZTRHqT2~h$Fte^QW|IRz@fRydCDcPCf9M=!)YOUb_+Z%EHHlU<~K%{SBU3h2gq?E zOX(?k>lEybuScRNk8BTxK3sZ|6#qyjGZo+;C5CG>V#6x+#ahflPT0;4%_i$;f+wTIVhrjj(D7M}5oy(S zWe<+gTU{R8U^u7Xa-0e;P6A=rG#n->0}w4q=Ldo6L7c^27O{OdOyE9fF#^cBTIkX=1p| zLu5w67*bHK+Qie@RlhImpRi86;v5`R5la^{i1{!x@!?ce$Ie7Z^`f`Z&VoPn%};&f zlT^^lJAtL2SH}f2Nk(`vG#>)O2YJj)U5OP@C_bp(Z)pm&qt`VOKKWOtW)o}xEL$

DJzbcQ!9ac!qWmiv&0d7CmjRRKYQ^Y1myg$sR&2Ly1_*|O+18O!z~Iqtu)aR9 zPe&8LN}#pK(7?Nm79)Qt)h9jiLHFlAcv-E4#Z2(GX$@3z4XbDMQ>rL8jLHT6enUvktAex*ZJ2W}6! z-O3yCU3tTvtFp*bSQKCAvz$P$0q(x)Z;e;AMYD#l9HlBw<8M5P^Xe|nh&4-%f9@g} zs=s1g8?pM|gud;Sy$XR`20e$`uSU@VGOea_agA8?m`MJUZv-Ot{#mKI;1$Crt&&SQ2$CE%n(EDMU>nbo_0m8*BB zeJhR>*{TzqG*+qJ#wVaE-`;-cvU>A4~!a zN53mk0@y8B}EM8j^Y~uro0U8`6r_H@KV=IKQFTbl(9>MJh`B zW>O)EuogI%_BM-EKkc3TsF4NwBZVr!a7mVyCwPCXK}%som0*)DumNcuvh8=z$4hp> zt6B2tlosokH8uZZ8dYJ_e31+%NlKJe|HK;AnDnVKsDpFuu75!qRmZNqoHO5nt6?pb z7RMITxea_VO3bJ-Q6=g5VrVgQ3XWg%X7ZFn=5q?yVZwvA)xW?H@0p*S?P?@UILP$} zu|wOFXqDUz+gD~dz&o!{sOcNMd51I9Asz^%KtR7%s|(z@YwpuLlDD{0GrL#e%*A~> zOZ!jtp-rkCol7XMe%fHgBB~3s~JLRB$^5uV)4id3LBq0oAZ6djl%}NeA zg^rENGr>YknUhu@ZzRfHdWt8nHb5&_5Zwv?9nYQPm$r$TKZ9wV_Q4En-oxl+O)}nl z_RY@oq;F;wcRGDZ{RAd5H|css=z#B8*V1*nlOPhc=5=(gX^CG;FwdaE9Fxu67g-L< zXs8)JsAY?{tFLOs7B5~JGVNeYMMm!Av;Hy9IJT5$8N1xD3{tUFUHQcF;VDiiZF9B3 zA7psZZ4573WO$vN(RDuD;KJJ&T$ml4ZAax%ICxYJhP}H8>H_~SB@9!mVj7kT%LAw~ z1~G(iJB?E~p81?6a2|b!EKH;t`ACnmu(SJb_-icco;wux=5 z$@f2{*|xG~#XCl0c;YNJGFS343za`-4d-MvRsJ{j zGI@DJhY`uC7n_2@{^dHloXl}_DRO4X^lh=8-OO9$f7H)Z=+lPdvrp`23caDAXQuYD z{-qj&YCqGmZ>ojL(uuo^>O&(cuc6SiLvql0tg@&O9#S2sB6T<=Z3U zRcv5-F-{3Sbvh#(ZBzpMhTD-3>&BZ#FKpCGCG;OVji+hwbsE+h!bQxn>*oU7okm!L ze=$;Hjmix#p;V)WCEFGFS>-n?318iKlbos|h@Sigk$h`h@>~@STSi&sb_kib`l09_ z^^VVvcf>CoZZ}Kg%Zbk(>7D|WrYx*&?Hl%{Um5nMWyjC{`@KhqnMZ}>dl*$yQ!`qV zR$?-Nap5V~Z_%qvm#SjTbf%^!(>*sj3w6N+t!G`~u9*t-g{q~ik(H{52hqOe?;pXa zKKLGS-GMDU9tXpCbbf`{;F>+;Z8jZlhPR6Gx7u$0ZMNvsfiSwh2@Tk^B=mSrfSlc> z7Rt8_Us(Lt+kyX{6aN*1zBXL^??y9P#eec0%UxHnf|;*96Qd3(XUO(<_0 zl6z4+ZWr>;2S$DJVsHOP_;YXnpbLBP>HZ!Pwy($!dnZy;N=lkff$IJEsr7}`c{a89 zz`vW3i;3vT6t)$O6#<3+Z-I7y6!~ArUH-864{!n4YPk5{?XAs~{Qr^Ue~yC*2ZK=X zgCsmcIg#<-Ik?Ixnsvn!5O2S-LL+CQT$LKWZ}c)!3VomG5ug<1d}>CertcFzDV0hs zi#?fk!llxdzecqADs{@fkNg-_syNLA|M;xN{{8!(m;b}#zl810(8Yh*g5OvB|I5RF z5iG+80Fwv(G7tNuz5;()-Sb!X{M9}GgWU6P`_P3FQ(4zI&eN z%B8zO8ts%Ag~^Z;x?lfQS1|3=Gu`g;>HUybP3_D)IM{HPv`>VQlPIM-DA zx?f?i;NU!-)}a%p6p#W$q!I&-mYmQa+WDhm2W-FrK!5D~wXbb_QJKC2xov3C(sWk( zI&Ifl_+l7UOC{*6z~dF+$1%$#k>;)BEvRB>0JoETnIYv6n6rWhUvL!rnI z6vzQ`4P(gGtTjuNLpj2&JqS8-pg8=NIX`mY`7?aoEa}fg2lNGBWZNZchQz}%H(nN9 z60cUmjiaWp)@KwSVK7w@>43Ykt||Ea>T*(-H~$~@;A*~i(#12o`+xR;bwLN>bXcNQ zs~;oOJdkaiasmujn)2XVH77R8jhzzBg)XwuIIYMM8lti^yrhXm+ChQ{n>@J=jCpC; zD}CK>)Y>i1BNC$8RwNTnscoJh^d_aS$wWtzgw5?CI<-^2o4o|#YIAe6+(@Ipm+Hqo zjN)h3aW`{E!jj3dCFu$!D6Cm)$%3Qt1ea9$ycU*kMmB{mRUU6iW$q;GYq8FoZ8gzM zw5^VrAU3+r(5!8$m9VisTW&(rO^BQXXD7l2+^hxLZMnpiIS%ZpS|1HpP~~erC@?eHMh9`3FzrKlY*zaO_zhV868+N|f=P2$I(~Yhs?&X*kv6 zgxNX61j$z5C^%y`(+%-OaQwT$;{+pD;U~?nr4?sQSzyXIwm?Gziw7V_O{&+hU`@pb&L-fuC(Y3 zK277PV9q&iyT&;zj^PRm6m+QGWxI6FZ=Am=&+XTm+B}4~DGq8&c%z=*h3h`EZFJx4 zSu{?gr@h0|Vb1%ean1{o#Vjf}dsA-qJnmmerFG(5L946?4>=3ICY5sLP!gt|AoFxF zxt9$O&1VcR!2gQCe@^S$=@d%*=LXf#&LENh{N^%$r<23{w%a+(FKo1OxL;UA^G!L% zxnh4tJT^1h@;KcQ&gs077lrIS;e5_T;XMDQaK6Y@p%kAR(mQOnb9JZ`MF5yy6DYC^>a(so+p~$4W1-$N>HTf8isJjjXb=L-%h1h zJTAU?{H|mE@2_UUwfJ1<(tr)LMTA+LuWN#o8;xg}8}DzhPz;8N3E_pGS0wm! zeo+^90{pS)W#F921onwqPO+i4+g6I;14fo+4fdV)N|0vm1Zn0{kY;WLsrOnCf}HZN zycf7z(hwufEqT7g&48=y_yl0)NUm@^_i|uPu{&m-Xm=Jrr~AY$OtG5PW|TjzE$_wR zoN8@#7QR`W%Oex$UTm$LyM;boi!K+<9GzO{J&sZL77<1bJZ+Q!58D;~S0KWRK`tu8 ztFvgH5N{k&oMfF*oMatRLPCcQ8x5GU{<-nDvT&29ffK=}Y?rM2SWN*$9 z*)`3yG&?R9+L@cTI*!yXhBZfQKi8M+0-1donVRKr^nUz`6zVGSo3wT7b`OpZyIlm+ z)Jem^=!$$1>(hi-La7dCWm13q7!y2s{QThY-t)&n z%M@EG-R{W`Eway-`3^%;pQyOJ8n@6!PW!_CKg zw;{K`%7lZn96(h@^xtIcFIhYTrtSh^%h+|=#nbAVi@MH1SdD>jq5Oe3j@}}i-^~YD zR^ij;^^@E9D)7(4-%Ez?_lLH~39ytCkSQnHRBm)Ccdg)y8=+Wa;khZW|2)`@#i$`1%q%8z4G%84&h$`6C%$F^6{^(7m* z-U|OAL#-QYleY)Sw_OL%pjf7)z$C~ekohQ9CorDNQ;gmuoZQEwGYhJzOn`n<#`B9s zfYqLg^(pm2-%Jf08x;@NYP@2hbV;;c_GwQPZn?TyS}II7?Q~b)+f)FM$T(r}YOI_D$?J?rHJ)^`9UNcI1|PCr*X3 zQCy+Wph8L00TPK)VMvB>&P8|*16(TAR~x{XS4(}2H6)A)>LLS&88v7C7=m~~Vh9El zM^*)trK;VSvI2JQFU4p6;>fX>xoV@I;e!1Ib&EI{%*S-tR2<{_dhqap5>W(`!I1ug z5e=in^&2%v}a#*C?~iK±fydtc|6Z-$_?8k8#B|Z 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

Ja>XHnBRE7xn| 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 diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-3.6.3.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-3.6.3.gem deleted file mode 100644 index 64f1454cba7d0825be96b069675581ec33107638..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 94208 zcmeFXQ;;S=)9=}~`Lr=@+qP}nwmsd`Hl}Ucwrx$@w)O1$?QX<5@!jmzIlC8|H(3=K zRgoEW@r%m*+nc)?n;E+qGg$h7{I4>m{}>w^8_0k8|JZ-`EF7#HAk3_+>`ZK|9IWgd zAWY1xZ0zhH#7zII68fL-b$4|$cKJ_Ao>u1OcK>tWzpekD;{R7||D(A7cKrXVTcT(f zkQ=^2T`=%#?SBqi94P*4n&koavL*V4N@F7EZ1p*$;%L~BOJMYH!L&0nG1AK9)cKu4d_+6IHK$jhB>udks^lnow%B!3aP#%IFdccDDsGxCgS^(k3Fd-gmCrYDw2rd>L8E<)AF0k z3k`)eh!JVXzBZI1lcCUcj@2kgwuBRcm#sC>qM`zUzs4gaM)%+LwAln=kramRxf%rT zy?!u%u#S{OQ$seoB1oBvQn!9yrCtTTN5@EqpW~%pncbj*t6yQ6|^-VY@vj@akIH__y!Z*PI-Jb`=2ZI(e*hp z8*`waxCH!dK<(vs7UxvhMu3`%eO^E7a-NNS%Mag&Dfrhmc^*9%^ldtc)W!7sSGK|L zQpv7Le~VjM3-j!7a8xjpl#~rv-#D_Fl*5kFq`nNTua;TE*uo%MJ)A9iVc;hS{Ib5i#2Fhcl_ z@)H@Li3_8nqDB?0KNbxknBhl~E;dW*L2^2Ybv{Qq$u~ z^95wNhX;toQW1K{yYmkJb$sN=Ug&mHv?X1++lpppDWgI6$|Yihd59UuZN({e!YD-y ziP)4Z@(TCSLdwu(Ifz0=$Qm_^6d)F_(Kz5{2Sc{4HA^^**kb_KMvl873LSC3Qo@?alPw0p0@=TbrIu8mg*=y9= z>?M?i0^7#$xrYtADvQpJH0261Z|vZy^j6Du`gFD!m+%(;Tw zHN;x8KEr1*_Fp~j-!*>aS66rhTarJ`e=H!63jv_XQww;*q=aPuhGH1s` zC)F=^YD|omQ)fk5mz_u&t&THg8Y5j~7PQsXfgxpPT;+uY0@2saglXkWv<#dd!xzpF z?9$2Y>ekqml~Ynn1y<$+4SJ$-uOXX|SlNlxwc#@Pu@9c3ddzw5OgwrFdvEdobDfC*<*Y3;sSbZQUPr3DzGtvJJX8fP*{|^EGU*kUuI|nl>%YWxT zE9d{u|NkA&5Ar|wf7SCH@Q*8riYM@r+Q`R;&YX;AcVl5Rr`?|N9*1(aA!qi9hcG;i zD$6u-IYG_N{os2$q8-^O?^s~cKS`Ge1SY8XsCbE=-#018KAKDk1Wu@+Qi&*lgI6B< zd^t~XH1I9;XS>(+^JVDs73h=&>PdluH1f1Q;wZ8pGNe7 zNPg?`P=^~#gDfIX!(0OTeeSm3X?Zz=Svj=uV-5pL~9_`DNNfnn~`&f`0j#;Ac*vIdyiUR;RK&Mx7l(7((gjop`0Fi8IDPG zaL}i3#rpmfu6GZIG&hU#RpymCaKJYep=2zVH=%sYEmF8zgoAF?AGWnh{Oe4O)ZC;Mh$L z2W2zqzMLVu^%z+0AuzbPamEA#35LOy=I(AH0Sr;q4Gbz=?qsAJhF%b^n476t7ZBS# z@nb`DGPu!#Q;T^;M<{8+F0B!+SaHW_)hc^%B*z3ZjT2RbhToHr@EBG>}cg*8|z$fu2Z9ShTa2P4h8jZkKT)hi9 z6tNT+o3vT9xVZfL3B|S1EL`1XIO=FN=cP$3)f}ZRCNAl4g*U9M`mhE+Z}JQby@=}g z-{1PK#}J4#HI_}|;;-X;x|@l1H{&%g5iy%v!5GMv! zr>|2QP|Z5|a^Gbs?@_!WoDixwGC7=BtXXoQwE=kQNvy;pnSX6^eQc+W+3O>k??MA- zRr0x8Qays_LJXJOwuY@&1~U{DmYkDg`px5vc2EquC zv=zb=(r$AJ2adf4YyMa|y9iBqxPuEi;M|R2wh?8dpcY`ROtzQ^@=nSd-B~CFx`;oa ziG;bhL>iMAia{cjGpnoA$OX;h%|jE^5mT@zJnPPD4%l+bAs2(K}l%?p~@cCzp&JlOISSE z{S(d(S%`6Zs?QwbI*QmmeNVpM6@93s$O=lj+zyFia>g0kaz&6jP^*Yq@LNnd&XHlx zSfDy_*xME&0)Y)jImZ}|st5~+iU{WyIwDDJ1LF616aMj0+rgUKRxU!&V0{pw~_niE8c~f;=yZ-*~ zGBjsMv>|YQ)BoMa(Gz;-x_5Kax2fmzqT>zpqGvOrq!->6KZx)e-cBiGbDLYth|v?N z)u8|I1i8z%OH$BXcg`c;fMnY86WT&70VukK3y!upNBH5qw>Z6qqbd>CKleSzIL){`NpuoMh)I|Gqv^T1Lo2@NZ!UeoXo^cB zGjl^7R&aZ61G;|R14?Oq^xQBqd& zhj(5ThVZp! zYSJV0XYzg#MbRA#*?RbsXJYLCC;I4?mY4#TB!b=UuXUx(U@$oppRv{Rme&OE+J+J8 z-#VW5KP8?6AB(b=Iuqxfo;pjB$Q0jqilgJW8}v@`54s5+ZsJCSK2>^K(azS}Cl=ky z62=|0(W6`Hfe14J7C}r(fIx){V2sTj9*kV6b%*~pxf-Vy_~_>w-!*?Zul zg9$)2c7#u3`q>4Z0zdnH921~~UIr#2h{`!3DBAONCU8@xV3>pY@wH;XKB4|VU&$H$ z4F$Ml#z|*q$xD5w{7Q-W7p9?LiK9d=HWPNDlb;6pkI5plbfWhJwayZfQ88ich-sFT zJH9?220EQY6H%FT(%Xp|OoSd61dN1z-x+(uE{1?XD%z@synoXeBQS*ZRJ zCl;P=gaogIJtAZ)J#IIU6K*tMHmGC}WA2}tM=PfRS!COoe7dNi`5(KGOD`5#CmdN1 zgnAZ^PUI$!{eLkyNlAyVRbLPMwToPMZ{-@&duR8_CXKF;a#?-AIxMEh z3iaK|#+SeoKwSm;m+aEVk%aK}5UGd(*uHSXKcaG#*GJWm+rpCs=IG@D$Ebte;Hpk~ zVkFg=LMi~t7F#?dr5O&>eLw!NfP)~PxAkQA$7g9aZb+6@RBUM7;I65bW5fanOAxPiJ^t-gRN}fp>6^rt{evxWA`xSwDkl1uMKG|>LJW_Sz_h?p)8l>jC293o5)wnSca+)ux#a`xC@UZ@*b0Ye5*B!oHe|Lb8t}kdObBb!VD9qGlq>7}-*Wm? z8)C^9DdNL>STJHci<)LMq0E`)bc(3(yF~0j#B~@iLGfZW%pc9i0I(ZxFfm;z?X>pD zmX&zRHCw7FpMxAIFjwMb4ufwiC8`RdDTB$Qf@g$`<6=EbeE7W=qf-U6^t&@T-`}k?>m; z#Rz==4h*HerC+*C-)}%5>s#Mq`SP3sko-l^^G2}qb_cla>vsFX`E%RW0n{D8T)A^k z@6zHUiu2?j~l z`%Gk=-Fz(7wTy({Z&h_^JaNs%JGw|25Eq3+`YJUfDc6IE%*#>^=_azo;|HUmu!q_t#Kc-ADhIBjCF{=ZET5>s$)}p zL0`0p$Jlj|ArvyCn_&_B64RCRh`pd;$DmRxB~5)=rPl!N;Gk%DcjS^YciYD$w)^!t z2c@LLn>J_@cE9Xf`h5!Kf#b<4o1X zKCp__UG!eC?reI;RZ}C51DZ7~S}3G{yXPGxQFp0n{+XN1?o^BdyMJTO^pF2zsfXFj z4(;!Z5j*B5IB|ln(gz?XGT|z{%P5WavJ_(t!)Lym^R7e`e2DgFYtiKS#fya;H~}K0w+* zc-A_PQ*to?<3AWbAe)>W2LTs{6u2TMt8hM+9bo#K+#QsI1V9@d--F+F;!-2lvQSn> z)jVIe41%MhYo{ZWARe}JVSIDIC6>{K6grAw(8pq|##A~RpoU>Y%f6ojh%nGU{et|< zI8LK}_fxa1hx2y++UA*S-@C!fL-tu+uY)-Y#gdiiBa=etR^?pEYl3VbZFuC4@~g-o z2h*?){8CrO%x7 zu6GN+-joX{O3iFfoCe+b>^NjdS%G>hy`a{u8hTD#fl-p6=7_8tKB^B3VOAA#u9~^_ z&M4UApgn2l{I?Zu0=i7lO>QTxzB0!x_I?V)+S3zJ-cx>13#?MW7q@&NhadOLa5 zu+Bku)j|@t?jsY86)669y7=gFY-dH3y3vZh3tMwq^3PV$Vpmoj#|UaSIuMf47CRT? z^H>+>x>PX6)kd4g)%7fd%~Vpt?Q2zbaWMR2fw^L3A<&zu0L%pD(Mui^%gQm~&<7BI zIzXEBMol{Cctn>~oa(PRVlf#Mf<_T(J z8<21P-@CJAJaUo%Ziw6R%y8o|oP5+20;UNAi9e=3uHm}?*zBbBWSou`H}v#?wrE^~ z!Zj1+_L>fZe9|aaA?tP&9li0RNJQd<2tQxCs0zFib`+i5Lxsxa8VUFQ>;;s}mP2z# zVqEAETvW&UTK}~LShg(I>^(6Fe8s546#H;m75KVzKQJAf>Qbbw1A!s-FuC+Uy=FfN z3G34mb;25771BaeU98vxTI;}}G)^n;l9tFDvOzUbOtuV1uuTvcYDj(O&Bxf^A&p9N ztL7|BCol_`2|T*HwPBXM$i--wQ?6@;?0ZC(VdxwmW}_!85S`Ub3ta5p8N=dVu54sR zqs8T~e*2E`<+|62I-WQK9?T$Cjk|9Pf@6xC>`EB6L2&$p7ZNSZfm~S{a34Y*Likp@ zH*k*IMN2bpe>B1UBA<(|zuN>}YdmNykd8IOHyWX>)mrh21~$M~-Ltxmji~Z+TKlFn zcD}m@WAUn^YIiHS#pKSKmM}va-ftTF81~OXN<6l5w$a4O{{C85xhWNTN{G*vG7a3B z>zq*?r=olt^r~;*B zixGFD?-0mkEW>*6ho^E$E_RN76winHe)#tq-vT`y1f6bxgj-#oXaBx;Z})!YI^ZjJ z`nq8jZldBLb%dIz39m^A=KJ?EEX2wdVC=_DS*j_TGz>3Aj^q&&gR#5*{o}0*vF!5Y z9T=E>%;^LDD<0DPGYj-8^L_n@r&Xh)i;}A}63?TTUl9)Dz;@;eFDjQ0m!c>F=`XLB z{aX*t{UJ0Dt9jis1C!7^d8lulTAXNJXNP9?3nk|PLtHBDg9ouBNE|_$GQNaI2CgJ` za38`CS)3gp*zn0abAW8D+<5Y}UZ$%;UiP>`lY3El$&7cLSGWq|3uS2GR#a)Bz;e|B z9hgxMncCSaeuwqM?F`-_5zimM{nh$#x!2a83=(Ml4dvAF#>zt;I|N#f7Q=r;I|S!w ziKI)C#G7{LWNbFHSkln{2YuaGB?~q|Ri?Gpx;pbW_!;?K!Wyr{aPSJg{8K{BM9MFL z(h9a;9@-@eSV%H6B`@J5b|7`(uMLxmq%$?^@MyD;G$51gPK3w{5m5%q@Ma{i0zSiR zD!vle9m$7>6dd)91-}cFH19NCN%J`$XlEL}{`6ty4dI0{q~8bh(0d98eWJj7j5K&& zV&M*LKPYrIr+<7~))_$k`;=tljBhn?i<$Cz)1qNdI;$ie#glBg-(_cm5(7LZ@**?V zJNAlQCv#jYAtsJ}zcnzOY$_e4Q0Z{AA^dqQNpaP(msy@9OEqM%^zo(7W)NX3j6>k8 z0K=`{Klo9L!yxhxrFi(-gKxI_+;Y~eSX^8%^?!PuAf=u(E0<&e#TkyoD68`M;uJAL zr&kTDDA7m;02NS}yGDZ_pd(^vV&fS7M9h-FeXA_IJ}oE2i_ z$5=cm-I6E=%CNoTN_0{SUyO^1?jpbc7&JZ)P@r`ujW-5sd&s&P)}rkcGl_*3?u{xB z|Hcbbg61BFCk9q!C>ujtV=@w}LWtdGmY0IDoli@Cc5;27;$z^P*AU$L$K%NC$eRN% z0>{9-;*<7TX`IJt?`nDpl{1$8ET;-(J4&`^`ySUPyViZ}>r1rJW6*1UijeGR0$(1u zakZW7R$c87p;x$6!ni8jpZ2`tJmPtI?YTZ%=6SiUVA-P#s!CAE51tC1e)PT)kIy$> z2JnWu?+s6T9@8$Q_Khr#n=^n~%Si<`l-2_!f0|6lXfF%vs=>5OfS-G_Isf9mfOjw7 z(Ert&5B|D^`%=+bqb)H&xs4L|Jr&$1vq}v==^HEXk!-V{1w%3K&|O7U@Q)6UIgFn^ z*Y%5cF`{XytrAjlpG$rgV~Dbx_JR=7(VQ%vt6p-!$@z?v8nY8&eU*MsP_!>dlV+Kx zFYV$!Xs6}+LdS1gXbI~{6`5`e$I`$Xw5*z^1hVBf6#JL`&?$_Tmw*TPW$U)ehKQ?dr9jc}rX zF}4LhhhYUIMkv!jGXCtGSCD4BP3Mx@f4*ztSMN}5rF#_@ikk=ukiIcs6hAyDCggl^o<&Viw8X~nu09dwuyPkM94DEr^YU$(-jPo z+w;F$Eam;XsCFF_PeE92s)(T9cx`uIzW)(4F@Ta6jeypNPt50}@T6#gNpp*~JVjCHtZ8Z@jBTcPTf-Ysk7M91hn6%#8!e`?O4mZjnB0`T4^tAY$G}!u=kM@I}c{} zN}qz0-)s&3!mD+Zs8xMiV&T*16fX#Hxx<%K(xme@*NMa{rgUb7dD#;^s>MRD+E1}0 zGpmKZ;I;>wIFZ`tjJxiuPBq5_V~+_f*(I!9nynssJ1l7ANXL@mxJcXfsZQ9^<&dyU z`_?fE$*x7K?~vb~Gvx#LB$$#Za?%QPj&793yff)#jIaCfX5(~cGE1+y9-&X$X{U7U zmKrnhDO1R5prpp+8tYwfS$?yJ(Twl#(tN#7^WYeT`&tyd_2FEK|l zywcTsQpj06!{=Zbgp*j9xQa3Ggbg)Bd@#X$jf=L~`{(RUhc$MfaxE##g% z+3-KGubj13!|rD#{w8Uy<|V^ej}1uc>q>07T5?{4 zf@`~){B(_OTzK=OE8&6Ft5PW?PnGLSj4p92An>|LF^lO3DIv`Y!a@*8tl-ixO@d+I z&50Km8J zX|ZgPRw_%u0?jE5t)#-7&bx}Zn5ZC>>}T*gC~DUA9hpSyLfDL+$s3qv!1=xz@nMay ziT!|ZG~qdd=*q)4mJLGmpFxz-38o(uWJ_aiDcTSr9@^5T@Gh5SD;k{+37zqlMJuwC zTYYJjbGx1x*HAPSL~$5R4K?||FrARrF?wHpRmY=*PEKfFo?0fPSbc;nCKRk0UEmb) zK9$7=ml8WBChIOLrt4VgA(jso;~c3r7d}*{P{N!<(Oczp&Fj=`^=o1m$nyNVUCKzd zH2jUPrxtSMcfQTIt9O&+bSnX{4b{J-LJ70b`C-M%_*}2l*hzKFK%4bd;fo7-kka1G zhDJR4f5PYI&^;%l((lq_j0Hs1ClxXZ_KlQ-W>beJ%WZ?f_I70SRmA2VQS4B5 zeG-aqSLv9l+6vp`89ol^CPca()e@{#6D&b~*XD56YT^XQnVk*u^g;z+;~D;wk51zM zm-&*kn*Jt%&rqKAG|Tv=lm_<^W)0?M?PSpyTH1_*9N)6cs1B+p7->oa+W2*K78*e7}Z5Bj0LX z_4OSGzU%J-(+YMgYp=*gtuW1Su;x-aTdVh+haE3nGLQJ!FK{&haeY^YMOHTDeAum& zOu=W_TV&eAamlXJRJe%jT;BI#%&=7NEIdvh7gY@6g!&H*IviTms;9w~Vr&~U+zWtg zkqu8Fs(_}t%IX6wG$f12{&kG1#gMEflKJ1%5nB~cv+eS0Z8C3Bx5)ygOpW4=Mvc|i z$Dn4LDTnu==TfrVe|gq!1&2_Ac|NIF@Z__DVtm_Oo$3RFPJ3UMezL%w+kKmVwZ80L z*{epi5qS(FJ9@mvee9S};hVa?_Z=IN5b1FY{<^?f|Dowk^W6lI0!w zQgGIHvguir?%}Da^qOPxRAtJtO;s^AjgP@;+i`u<->6{zeuvoQ?qzm=;igJH=E_1BC7+Kk!`v*JM}~PergfA4*ZvZFGi+fgdhC4y zaxjD4wbyaJ3nhaKLGuCvx+`n;Lt9j4%9PhPKCze+DCnRuy$_Xcd5qR@L&y~N!STs% z$l7OwWX3WYE1oGnCAy%mmd1zU9FsaYPPnSN8xXN6+h4mlLw)UsJSouTJ?WpI!s1S3 zz-O8Q^cJ#Red3fFX7lRB-u`|lY5>YAwP;G65|OduEy)Rc;ZD_&l#Y@mtp|@#gU&XY zQ6Xag5@3mCs>8{Ue+WASs%TKMyv|)Uam)qo4cdZ#op-BbVGNzCfJrkM4ynpiPCaeY z+Xn}s$%%~8O}EzbJN%c-gmn@wwYD(B15bUEnDmSbxHh9)wa(qfB0-)0d>4jxnqCIG ztMM|lul;lrDA4^m^Yi*j1)Q*)fIAL{82`&b1h3mzm5hXl z1b{787&E%Jl7L94>Cs=>8I0qpMR3i5xx8CzzV5dq$m*S|;Jt2tQgHL3K)Rx`F*B*3 z(y=D?`r^5a)#bn+6UzH6qrdd0cRXFCGaZK3A8`zDA^jR(8zZE^7#6(~)2`=%B(T5| zW4vgeO;k4C(_hM{EQn#QfkOLH4tHceB{;Lr{*O>hAa`mB@6WC8$8#`1SPj+x|C(|uYIRdTi5hpTx!X#t#fwa)!R&YxI(CX_n& zeY@;fa~XEN6W{al2!#L4ztd{6yWYwPywMFpDQ&4&3QPc)Bn`E)5%E|qga5KItrb7@ zHDfZYjZ~nL8Ok>3NItP_CHrYqi)}CSn=m9O!C0TLBS6zzI-9G#?2&|kY zuOAY=t1umE4sGg1cFBuUcp7`ZYhKFS*wM_NL?tT1{E=F2}qiSxD=j z4?27PZm6NaPq!VLV@j0zG&se5;VAt*9ow4yozE{L3;Nft*tXcr|GwL)&2IHJb=M=B zjzqM|O%5iNBWLL`DNOoj7+nUxS})F0)u=IiG+*5QP88*S4xEeFwuor;)4%1DUDzTdcK%@bsN-a_x4< z`;9#IMn%VV(zRNm#5F*MEt<$mJS904_w+*hdSJf#wxIP-e0VrC z0EY`u;8k5Hb5FhIGTR!|Q1hQTNlwR}E>v11Z4mA;%k4Sk&9yj6Tc?&vPry@3R50%z%7A z8$Obx{BUC~J8L({ri9}H8&VHsAst|b3Gw2!&@gkvv(mi=b!DZrorxWD>SwokX3|ea zY8_0+)BQJWso_%dLl&F9?F^58fe}6Spt)Y3fML9lq*AZJcR7e2uU;U#fPua$CtBuA znjy1n%rxy4z1jH;gBLIv>8Z}?2U%55)i54Z3k`TU`~6w_16;V~_53eIP1#$XlaFyR z3C81^rS_FSl5M^G<+U7O~yntUQ0843}-J=-T?Z$E)%Z2%p+bs0Rtc=02Om3eShA+3_%f}{mC06 zF8c93ISQ-tXX_o7y&?lm^ zoLdZeBFLSSlT)$ya-pMK#XqR0HCb!$?r_wi?&J|jc9A$Byi4oU;9XA@q z-+>|KSaj^ycbz?ybca!Y&Zj2EGYsi9dRo!Bvr?%@KJDiQ;{D8(8ZPR@TLBR@^}e(5 zTDHO1v6CNKUObq0q>(Y8Vu8vAVj13*x}$rSeiG_zc?Eyi;4jh}r1m0N`*|ReL}JRX z){k1`JF9L9R@7(i2%c6i;o8jj4-8XZ*EcUDgPeOLZfsJ%DlqbCl5fwWpIBaq3u=(J z7+*8YNbK@mw}&A#CFi@b^cvCHZ3nar;oLD>oHGsi8$8KIQ!)&YMkd3(kOOyBe@f56 z5M-M4#0K($2hIox37iP7o8B3`(}6gyc-^x3DOskc_QM0-;mV-!FsVB#=y9VO#c+bL zMkwb9jQkcD-PS3lXt*xVqgBmOEXoEhFfYKH3q5;`k1~mE1j}J-F1*~F8p|?%Sif(U z-al)}YW$}?sHHx)Ew9MHRq&Lqq5kvq+6GkGY0*w-63oVnp!;0XCPj(`CMX|k{q*Ef zjMT~75^4iQ+sD zjkcMrL1=>S2gg0_aXMfG!Va~?#K6%7QKv033!;sNX98Ez;~~MjP*It0f8yyxK$gi) zK~4}l;{38_VHJDV73V{616~kPCb%x~=Rj_^i;37pYC}t>eHY;Ly`Mzj%?{&q;VV=k zlkt>GDW2%exNQM&c*O{NW!@mo-u%{PCG*}IP}2RPqsB&ewAE2w>rc$X#P3a{m3{`p z>r~hhpZK-e9>bO=tM2vg^a^=Xp>es_&oT@4obAP!Z(X2diMDoM0QhV!+x)K}6(Vr= zLEDuR4%Q3%KZlJw6Nr$=;q^hkE6AZZ#|Wb*Nz-@QA;vSs z@qpEc)Tm|S=PS7Dv8kuL@n(EoNR)%+Y?D}8UFVtOe)hg7EF{`lsE z?h@G8=qjO`ocfWgnfo;3Or{kYOlW>8HJh;T31{okoyx-p25&zchBKsWYV%k#jwqWdRXA5g{)V9(>-fd1>x z>rW`}?o%I7M!vTkUf&0Cd6mzM_#})J z=)12Y=%an-+yw{*j@Ne=)^uVTsBc0e@4cX z2)-2yr|NJaOg6rEMf2a0zWY2+b$|MHSH2BXaspO!h%BUjo)y5g3S^PM5%^zx9?wQh zz=?BMp`!6tZ%K*5em$*=X(SD>Z5=0aOy4Qf`>RsJBBTlH6QH?={TgJp`8r{#EnEY6 zcEhK@UL4W*R?AV>SG|9d!a7ho%+BovrSM65Qn1XZRsN9JWSr*|tG;K&qmCc5okH%y zGb9|0n&*trSTXbqv=T1zg^&${J>)~n+Q1R-E-Vs)E5!&(cJyQx#4zuB-a2eEx4C5i zms?xP_(;ECwuYYEQIE21;wWfo7^y=+CiEWUD2R@b z<`lFkXCoBR0=qNTZ!qCsqY81CRf2-Kjaf51_MiplA$e=8$&{}rFBpVTCZ!@O2cbN8 z09|->U0GW+Oyi)qnXe;{QcxU9SXwf!*{ZAbE{<*JU<_`aT3{8?0rxb2oR8=C{TR?_ zc`_@u!1-t|tB6t=VGT%QnY@(#ecqJqcqZ?7iq^Sqcg2i4v55DOUNh4kr@!Z7UpUs> zWQ(Imfl;20Hk${2wR_&3MC9o#nog*`if>%GA+5Lw&ddg>)D@y|C}^(hGR~T-S*#Y3 zd%@4Njb1=$jS9w2?1u93HfkTVQ3+65D{&EYBh;ZxW`+Fu{&HmrH7f&ja}5^rrq|Pm z#C?J&xrJyw$$2>v(cSvPX`6k}mZL4Gvw7`e9=?Hvmc8m$)u^8flndIPs*uI01xd(p zB9P6BXRqg)3?+^BSxhf(Adh{LW-FXF!gT9cgQ}#iffL38zk9U4%N3gcZ~c)z`XFZM zJ4;$);NGpY*kaL;`cdzj^aUIF&Une+q~B6SC}KQuTc-?iMzIPa8^61L>}^~<)&6Fk zI^Uak&=@?HaOpxQjZ?P9VDY1H}oQw z6e$Z7rt@0xi3{(m(j#qwNBnPrTfHmfKf+&mdkJrE3DO+blbC> zUyhZZ2kpq{ZXS`=wGUH(nvgoe9pvS%z`Ykf>lUj^242lGu?8gasc;c2(ng9Utj)39 zArp`_Y;tup1KEd84yrxfZrM83^iboYC4Q@}7bfk!sjhs<9ajq9ozvGr@{F9U$5?qg z^i-qSqVE>uK zi{#8u*}T35&Xm2R%(r!r#F%AV94h7&HptDIY%853q?OYBx6gnRiWc^)eo#s-;O}xEGVyjzIkp2|hjZmt*)E;FGIO zr$+B7{n0K|=YOHqosh8oeX`6RNPI}bCA&uO`+BfJ3?WIxSJPW1Ribwh%?|n{8re?r zAFVrjqxqPUti)dta-Q8Gbo5Y4sGqlHH~nVvfTrHlJoEbFu3@N#3N6VRKc5kMHOz-v zo~%^F2s4Z(SIl&%5I!5jqy)-7y!d3OZ$}}yE6qhP#z$bc=U5NW*A2MO37p$4_(^AP zZ|Us$mE=RXCiYfS>7QQZXYbBvhU)pYL7DAF_r=6&Pn6#_Wt6buB|phM`MM3A%j{(rbkrdzFYUH9FtBYHL8> zV*A*v_FVhk=v%gWpjDDp7Al%RsuNqezBMk~8RD2|T;8>67Ii)fzH{6qaPdu>qgsHQL_JMI@YEw=>sPhpCAz$m1krihc=Tl|r-w!;=D#hOR`GVD zO}m?>$N0a<;@Uir;^vtbKeK>)FNR{DcTRP`?$D!8oJg~^f(_=Dw!q4R7oqvO4DVp$ z<__LQen>(C3mkr#z$i0E5UHiu;~*lJu=PIemAk9tIpHEP%#PO#1;?!S{5i=jA7k)C8w=ciuL#k_!Iu4E z&+KZ?Db?n8@U81;(h|b&+eue_!6gDM%V;8zfshES?~)2mJEZFe1I#R*k@{T>l;wVy z?HV;|Yg!$Nq#R3mjkrQ01?Uyppte3eMs z3KDTT`%D{}_uu70Mqs8mzYSF6_P-n=BoLGx*FLtISa~NVF}(t6FB99TioX!%slUj7t3}?J{T~2GK)1ho|S={)?ld z*9TEPg=GWc7Ov$W0y^SqMXkFb!ee0JQT=;*4l@#E$0$PLrC0B0K8-j}eGy$1>)4n7 zq^zodvW+)K&wBq+-Ly|nQ<&8avAb_rdeGpW%KfYp1RkVmak5~XUu@93x_H9n^2Z(5 zxIsT!?e>{$?aONn#e>lPu?udeuhQZG_dy=*rRfDMUMNV}Kkb4q<4J`0%`L8G0&jx? zUsvFkI1^R}9BSayJH$PYX{V57)Ag7V4CL#!0z*vSiQ`Dv{{grd>6;_mris6G+awOG z!mx1#;^y26+lryuC4Na(`0lM6Hc{IqHN79#e#jcX49?=(_g7AN3nkZ1;O_j`831__ zp2%wy_-ZYlljAA}deX91HR>V)V3#XvQ+`5C2vnTtkkOR zuZ~}YQ#^OmPa^ea$pn4w+MZ{hwG7zjkGxz|T9^}34Dm4zWY_8&M+^(jL%MDWT&&ba zK;|LHxI+{Pncf8QO`9KGZ6+pXMkyG>|@HuGpcg^e2k<>g&w)oeO+45={pbawa@4|Vm;Hgz}sBp5Zejf?<3oh$VqUSDz%b>KEegd(~OwB1!Zpev9rcZEv1 zv>}psT*XM+`|dIDf1~*7d$bVz?y;;6Pw)XCd>?=JSi<-o4YiyV!*%%tDtm#Ezscy3 z;(p^VX9e_SGgwb`*a0k094J5ovA^n3eXj@j1Xbhm;d-4K_P)Y8GbI$4bbN`>)U*(l zWTcf@WHMyFMJ0^0meglHvq}8AbN3Mi>bc_~Mo7A5RaW0AT@Q&5^W`gY3D#_)+DLo# zD!3`Jmj1;uiiAg}oTt}(ZCLS|aN-V>tKk{x-If3v$I0w!0hk+raAMWeI-eaxBMuRR z3NO|GN;LjwCFHE9K+BSNfF$UXmNdt!r~IdJLV{HYhmp!oSDe#5ORDl%n5rZS8}-i_ z9MGn5wF<|9hDN@SIX^hKH%7wACUFww>>WoAbF@{581jbR&C{7F_vIG=h$C(;k?!ns zw{flL!&`B|wp~e#K9;Ygoy7>F+EipLNz7@LE!N~HII>Fse0kuvLpy5-&jWUAZS^Dk zxnA>~+hCe;)ZV_IUZCl6ZzRoz)^OI|^Si$YSsPKA7wOcP$Hjr;DD4F;0%ZAswKIqB zXi$nQoVLB)S4Y6_l?Bgd1=`QKWl2`NS#pt=;f2&;7AV}P{BV44$`);MA;JbLmaLN- z@YcuuO){|AOV60aHyJ}zWSKni9w|MOya>)B$<0;-0hQwJ1gLL+d*_EY&w=pv-)1N)8~M!8~0%`A4ls4(GaAAFe!A#;~FC} zAPnegq8!$YyDuOPbw|24en_YV#?>)`?_>)}bM$h~}6?xy7ErPOIxV=}Bh zRm?xD2XmcmraVrSn~smCr#B^5Y*1vd71V*~dtc;1T6e;fx;>M_H-gZ+M(tR^rwVoE z?2aCo70-D47?cfBfb)M{6o5wi52Zf;3U(k%>_6|_yYJY4+`WD8TmH}Am;I+aAH2^t z39$@8q;60=t|}(swWZL~J7Rn1+2)(Qql%Tt77~{p-h*W6m@ei$xuv^e5?=MfvuNWs z1>d-u_p*rW3F%`+=t|Na(2)!sq0*krwSbm}MlEmAb-V3Ms^ymq#G0;9l+sDJb(o?I zg#kE2b}Avyw`Benv#EjE8s-z3y6`j}W7bS$ zLc=MWMxc6LdDddu?Kxj2z5+)4ihb--l0dEdNK6Xmz)LD)qmk$xBrc=GP7_8Tj?I1`2A)9p-<%S^rs(bZ69 zn|@_FFO#Ax4W92D>6R=uy1;vCdoc*1)_Q;^9DC3P@+Pq!3QQqiN3!yHr7dqK-L}3+ z-UrITO}&)k)`!(o`rpnmhIRr?rfTX#On5ev)xw*ZL$ z`7XbuE?QSy2PG2=5ZYivf;RyH=BF1@x*V(^W^6yA+XRO4$lazQTk z|KJ=gznT57q4fUk;{V;d`{=uRYQ2> z+3#uV1WyJsKvB`E>!}b2n$`4VbeNi=@=IBia*J8zR8h)^rpw7F2sTVAr@oYBWkhM5 zMyvUc*WH#zC2{L`yKxYaQLRR0IC2q5mC3Qm?M{uEGq6I;7?&4YUUXGo`n${W>P?0d zP=7(%9$WxhKa2ui%9tcJ8K&7fJD0AjM`HW+69!dT*D&Qv4CkO;mh*WLMN@X;_uL_z z#bj9S=N}St6zZsVr;1DkO7tu5^&q+`tf^8Tx)c3}{?nb5=Efdw=Rtv2mq`&!!lJ+s z?-NHEtDq|E@ zB4?9k>Fg{rHgg_V_CpmDu*9QmS_FB7IdL&xm4x;#d6!t*SZCN?gs?+4GHxw!Dk!T# zc^$$gC1-gqPj{F4&Z)J)=AU|cA5K35JvD9@RII$$)@79eg}z)p=Uji%8vBEiR?x1Fv~&zy^mFht&mB zDq=h~Rt4f3u?_}^8$AjVMQH9A$YO2R zgv|mkKz{oqj`5FFfSriz6H6CX=j?@C9fm^byy)OBAJh(*SmX z9)%Z?a+{grH7Xpq<6OBqX~$`fcP4qvA<-}mg$%j7oYs%>ldB6*!5Q3TfG8w(llV+# z>rvKcBOPUAl^m;Jkq>jth9Vd03%<*feF#Y%0b}CG^fCJLkllQI6=^U<$Qq)?iUxtzB`+;{(C!P$7N0ptPDdJE4Ga}Z&z%~?vNB}QNJb3OFcd33(FAj~ z%+P?PG^TnM!>-yVqqi)bw2dK@Vm@D%43WDc?NWg1fGBS(_P*D7q>5t@GcqyqF^Jie&{|*hZ$ULnaITiI_Y$- zF3xc6macQMM7-oagy@SF~|&c0LJskk+6VWRi>9 z`hzm#)x+SBgM~yHr!JD39Jx@WvrRy{8}(A*QavA+h3I}9x4!#MO_}+=38&gjTVYDY z&*RXC7@a}#APT>FpY&u>5xR%yQ7jm>f6ujm+NuVRq-d_v;=*ptW-4ed=tJAZ#u7v- z!O}&eH5qiaYsi+t>oV}n7Sur}qdfGO3#1`epUOVz${%I(l4)}t!0-c%2X70^OQkmy&eNZ_!_H)khXvt^FS@0ltQC2pVXr<{ zG02d`Ci9|7=GmO%oKcc5xiY@q<_!~0i(59$ZR*7&mn;X_bN4J>c>M$8iSQakO%kk! z!G%tI=fv-z!htSasvLMHG5f^3t8A;}wbW84YAiQErB9twE_n_h9eg4tA2TWWe%;WY z;SB2ckBvcp-!hGXW!%V(l6I?1#3yAq6SHV-)GH+-ZlKx)8=r@hG2W*n!*&lCXyL(2 zPsl7-uuDHx0|SyvUA_5^OJGrhCP%vZ5ujb09%$x8fHTG~fG$UNZCt=TE%^cs-8Pvi zyWn)-*nB=wl*B@BoCo0(Ucxmnnsyy3+MJa^L3WwVpo4#CXk=w=>Upnn-XRs@Zya!$ zOopX#XZ5U%bGu!uTBa|U8ZpoY_%+9XJ_67ORe=E%B6(P8 z8`as_sMA^$4$!4j=wGD!YIUY%gdF6!Zs@9K1|Ec6Q@c(uLmPlS-1S9>!s&f43^76LOcc9*+s(-1kAYyb(jW+aWff-SZCsBkUa+xi zsJ*f~#@)T$QdJt&LUUjU%|AyArPP|;bT|c38wL8qAEf}v0xB9D5zmAM5n)W>JyH7P zRcmdALHyshx&%rly*~orQ`!GxmjSmxH0=d+1@wu;m{x+b-2>!-L)g z`3FD85w*Rp*Flw3`%iri)7gZ8ok|FJ#ZQuq9Tj#KO0_}}MVKR3t9(|Q)EG<*q`-(F z7w-7C8;MC3#@K0Dl;II88?@{zOy%AB; z7?O3kCtbeiVxTK82)e>JMV<0^$wmd$z2}0m`ohz`6exb}@62XLQ|C1XO53{nWcWyNm~;E+asC{nMXBdqq0} zs`n?%ceXJh2arY-I9s(bUCJ8bvAAP|DQRY8gq!K~y#n%{6rvQr5wm(?Y7WY^Yg1Ye zi4^tcRR+ zA*Hn$&-4Aq>-Sxb!NLh6$nho~Q4(8psL3PpfTEi>WIR9&o?#p%zh!y8$maB$a`Xnm15bZw*MMzu4p_2o4Pw|%F}@P;R0>615!epo4i$m&or>aYJAzYgfS1xR zE&LO`qh;z$-tVw6p)Sb)#@Xg>av4=iN7|QNl{*{y30qja9!IF`lSxO6e7-I;&NDL@ zq#3eu<9T)W1H=>U)eW5=M@3|gu_Be2HkGV`uS}Hw70^dZLFs(6(|nRz5dG|nqV%!z z*8AxDbCzatl&|;aQJAgw;RGno*Zae8zTPk5VjQh|7L26i04flue4p1ZS&&#Yho-^k z&Dw5+MQAr7qt$|&2MZxtf^8l47Ko2LReiCAM=iN&tE8=pSmu)QS=<@4o`nP8Vav<2 zGLtkcL^`>v$`ks@xf{sV+{j~o3CmeSwK+kQp{2gk6j`9JZckBaHhSwW#Cqk2I~H35 zB2`arAxYT)z#gl*@o*DCPc z=aQ*S0N2YRnLq;vgkBg)D&PP=LnEFB(NEKxQx+d+5g262L{A%pLDI6r@>mYA*E>$q z-U$t8y?0rs1+S>(g+t9GmYTlW$hzU&)XD?y>~JCP3y%w~?Hm_!%*zo+`$f(h`O!=< zIHp3pSToavtt|&vCV3{;LMN~#iF?v*sd*Y4blecr4bn%2x0l7f6x*u)m*Ttjz%~rv zYESLuV2!&Q>l`QdAd<$lrh$a_H8QPR>x!kIjS-_j0gSbozFWsnF--W#TSMd7V)WF@ zlcu?^OwSExf3bM^-DO+lE|Ud1rH+qh?o$n8%3l;W&!*L#nrs0#rO#V0^{NH{s-*{Q-gd&*$sI{R zW_hG)e*q1Vdt2r%Tr+^JxjZ=%1{ude6+wMl!*N+7ua_e@wt8Li@n#vl1?@IJcOyD_ z8kY!5rzmY4+%@b7J2EW-AZRd|QXv2ZuYZoR^d>nWRE~N|+^|O84$AO$je)H>^v-)J zJE9`lBCp0=sX?eQ6(sFESortI;?@Q87O(v{7vzw4B=l%NSA>6+!=s##L)KoP;~m9} zb>X~Mi0KRN@OzoqvwW}6^bzUQX@{;x-m9ytDg4<6n7mjCN_?f=IsMLd>1ITgz=ic+LDsli|i4lwC+ zj%nKHtZSh328zyfTcv%pj7Ui~(JXosIRL@0zAA5WzA=!MB{T(sb?G1}T6Es%WFXt@ zkp#lzQ}sio>FSgE)Nj1;vugRJCNUb1{AyF}n$|4^t!s(+v|54Afa+_$6DR|S*ELjq zSut;V+EAv}F0gU-^V#V0W}hp3;p}te&z^nRrZxNW-Dl3e9B%XMbAfhE>o=c$u27kM z*>>~n>xQZ?7tg*?#+dzG9RWohv+^`)vJNnkQI{0OZ`DLp(U)wcMe3i5SrIpLeyPo=ZW2Kh8;#aU-r z6mKc?i>l6zuW(UUqO#|d8bT++tS&&&F;137lt%r_7A(+oQZ~m|AS#tTn^6*q$OXGG z2yD%u?0EH_o2qV8c@8;k_r>Z*!bOQal~otI+p*$TS%JVvnWB^^WT>vg-$KP7pfxfw zofZEHV`{>7Qyg?T@f!{21n^ZHJdK0Z(Jecfd1e%@N`^TnQ!O%;!s{)WZVx-fdQ4m~ z?=`@qRB%`_I~+|{`bnS?uhhfJkZlw!y(r_VS3GeWLcDQM>olu`dQ)DU8b9S(hN}9S z73t$2{8-v5qbz1R))(ibIi@{zpkBYGeM3=ZpSqUW48icJHz6n;@^S!1hybe#+w%1y z2u}3#0qvR^v{d7T)g&2i#(HURD`j12c$>3&lA{x`25mnH=j)@D+by; zqDSI*t|EDJ(LzSm=Ow8ww{VTlfRe={BjWz5rV1uG@H-~WbT_TW$#-wt8ueO5FZ6=w zh(F_+&CrJ`E9O-Q);?2+*{nfBIU*IF{6icn4Q=W0e71<42r|q%aqR8co6ocq_Rt|u zQna9lo|JH+baDBQfdm$7D}d%MiTSA zzO>ZfZfhVysL>f!sxc@S;fxu+kfWc{c|>w;1fVf|1!YK$tqKG~x|~R(>u@|h50lv> z%Hn|rfgxGYI4)xkvsmleh^7MxQI|j^=iBcq?qumwaAwdLYB>ew_*W>v=<(k-d;b;o ze!kuNOK`G+>b*K@Q|=ivpKl4wcgRKOTe!?`|86S(uPbgKko542^Z`rc|3~-l-gDx= z-@Efo{{OAy|7Rrs_gMb#+44WSkZ`oZK4&ugGL3*01KwtaG+o---`+Xc{3&P(_ddw; zn!slsnTT7Wt9P1?hXJKIHp3>~xos6f+u8t5fl~}`T!M=e{NObe4LCuW6)1~ifrY2R zWjrj-t$-&a%$O4f{g5PmJf@SBJOzG^s*ap}qk<5(#1^ONRErPUgt#DO zK(bbFa4_Gg0__M+T5qDHOS#Ynq!zHP&9rZN8F7(8IXW(Eo8=6L^{g zl-(bffkFN4Z-48Hz340)SeX(~zRMC=3~D|C%QuvY04f3wD~k@e^$TpFlpyp9>g#;Z z#8S(WS_w$@fL4Bhg~?~CnxEHEMyVx}L9~uO8av_OoD~tdowCLrQ=1}-Y0;wNM1SX? z_}Y9Jp6WxfORn)mhH*dEA-ft-+191Vx>Y~bI+-*@aIewCEW(0OORg5RcTSGWr6yO} ziTK{y7nK_JUT!FEEZr01JI9lLZ-aQx?g^Jd+0ueAaSDIY4oxj01BO%v<>COzDpf4f zWtkJ}H=NX)J#}b~`P^z!OxJ8}C$~Wrb}7iZ$qj43*@=T&jX4;d7VJnDcDJQ1q-*<& z5|bX7^YNrM0o5`S=yt{1fXpL9ZLRCtJlDG@ph0sDLGLRPeltsHCt_5|D9It(IkDX2 zkc&?Jua!-U&L&Nbm7$YE3WzFI(nx%~u1Or>=8YJPqcD-~{u@G3E&nW^onp$5cblr| z6_^Ll!4xbXthcgZg87wJ#p*|ZjXtffB*P-p!LEKZ+P zbi@piqoapXE+jVPmDpRF7W4)Ozr6jcauwAmH(xsI?wqTW#b50IP)8xWsdS=3Q{M)r zX|2XwxrQFxfcL7St)hPKRu=jVz}I{^#DkZ}wmRuJ#|6w#T{a`jxaA<<0Q|b%gn;T-Rl^c=JN01bA|629!UM zv8Px(>U@y|nPH-GjTc*byj9yXi(kS7bQ=JqB4FB_yfp$0RbQkRQQ|PZ3K% zV4DEir7){JbWSC3Y0Hc)B=PDpS(H!H1Uvqu-M1@rD!6A}Rd=qd!E_cSc6Vm|7oBa( z=)by}{uSx}gS+=D`v1ER?|h^GzXSTuM10ZZXTR^5FW4zz)5KI-sd!q*!v#fnhVG4M zwlNON-GOh2W)H2l8Cs z5yEP4^;t2^E8z(c5{!)g0L8?=Z1us}F-gf^7*TrcnbX)-gDHIu+LkB%Ffy+}K3b%# zKaQ?I_N1E-Y~Qv)?5mKC7~xCw6&*FQWvMhJ^75p-3SZ|x z9-PH8azy=f88OEJL3q_e)1^@DJtmQ_T#g!7u;OU7u72ElzUxQ%Ae=@oj$ZC@^=n>P zkJq`nT%1;%uZ0Wbmrb!V787(65=nbm*SDZ?r+aezl#f;pSV!sb9uMOWwOCvI*honL z2-I?sHO*4IxRJ4$h~2=>2Bcud1ZnMnR-?PQC=wlzIV?=3MMjN2Vn=7zsX@&GKKHXW zZ)u*%m1~*Xr{!^Nv9ia(8vme4+xx`Y~Z;mXWm$lt-n{Z;a#9aI9VNS6k@cL7m83 ztIElR03V>Wj;KIKkdcBp7GL_6?@>~PKj(>M%B8UMr5ic&$+<9Ke!k+;%UN5`#>bDdqG8MiYA`9B5)AXk_gKlH+tqcIy~Iiz@u))4=@jl{d4*q&jhAqwY`9tyJ@Rm9 zWFy0-xn(;t3Z@5lLNXbd%!YAh=Cn~`mLP=mD>5ppJc-K1$Sh5!wLQtBz-q)up%e6h z!qzB>9r_J-buzrL;26Pt^wj6W0c4-+X{_3Nf>@iygM5ASba1HBz3B8%m}9SvsVZ3NC^F_QXmh(qqte+zZS_xrdwf@cT&ua1J3n@2}G2f@M4^PRuFt~kKy z;r#LS{^1dn-Fo4c!Nmy$tUR3UgXk=}n)<-r6#=m}?K_GQSO4X&9Ype+;dp3yhFvYSi0W+%cTI`M0E%V6`$ zsgU;H@;x~!<5ezxThU9~{i^c>7)4yjmWHEZUF`0;mgOp~dr-;jDiv+Il?9>nouHAp z4xS-eUJ_QSVIx(XiINlwMj(=AV_q7gqFUWAQB)a&nm9?Pjm#v<(XjHRHXms1Fkh=m zDuaL;mWFoI;jD_IEKG9LxZ5WqQXv^mLBA!2qB)#ap&&&=4aYcD)mPb-Kx?^bMG>Qi zrFSg0qSahz?g*tQs70b03>J4$o=qhTWT_}10P!T&Aq9Q#&wS&#rNAO$ zF9yzWXk>cRwjD+YU|Kosa-4;is*YY#so?fn%1?QYr-ja?%1?-VuBd|iVgMKT$HnN$ zEmP0;(SU|lUu8BQ=mW6lSicl@W&2%fp-T)=r-G)>ty`s+($fk0if4*G#}u~Z^zjnd zGM50cfs|B_GDV4e78e8wkwMF6E^*SlIH+QV7PvX|TgIIqRT{JSV>wo!oTMT$LMe`B z88XFzWC19Dl`JRI*RzLpzYk2t!R`-lj&=@%XZr`i-tPZ?v%6geL%=%m>8vnxoElC;nk)^w+n7iT z5zw{JQ6X%|Eh`xW3bK^9L7BMI&y)LuW_Iy{tVU+eK}L`0B*Hb4Tv zgekd_o3O!jB%I3`oLvgm5*j^%{aQ{CeISPZiB@{%IltgsJ=pD>x@{EuJRH#|O$;@R zPmK*kOdq>JIqma74$GfJPLU$~%h()1+1)bH23Mw<9V-|~=Sw(JyKV^yc_7oaf~xgE9E-VMU5+ro^guRa=1@_K564 zhpZx!89?i?$rzJse#wR-r3M+Cf`rRZwQ9p%-$sY+Yy(`+h>XQ?Brt$cC;*y!IGH0?v|t1OU8(&%K@O|INSVJk+c=&_W7kuB*_*-_(DIfw24e} z=KAu6Vi0B1qDHSXm}NPfTQGKB5^CydaDe)jGIUlsy!_YZyQE&mUA!=35>>fGRqn7% zRYpsVWW(yarB#G)WqD`q)nq=OV?K`qE@f4NQ#CvTWaT(&g|Wec4pbD^?>su!P(=#opO*C?Wf zx}gSLvIu@Q(~*K~JUmW03_aUmL&;m&hgdt&Mfnk|3BH zCOGReYDJ|M^8%U)rft%b!cSbLZIYYJvOc%Kyt>-aeF{H^EBf-(>wM-M5lqo=)-cQ1*gvB#LYSkmjV=1oDIoR4a?a$ zK545mu4ZbH7*;Z8Zf(Jmm;2hX2BWi1mAG;8ExlE$dk6KGYBCQ@Xd-wT^2@Qd27Z8}MVa+w;G#JcTjDx~k}@Rhu_f|J^`amNqr2ty$^ z+bipT@AcMKDB1LPm+fBfJQ`1d4k+9ClI*J3=M8RiizyPB&I4mkh+ zz=Wy15@GxcF?BFY#Cw_A82k4gxwKIX1PaN*B+bkyF=WQS=&sP2-8Ro|8M7!*d6v3D zj>+KD2n!k~HI)`3r|kf&?cWXR)!k}um(@^=k~QkUvz|QAou?bRb~*;pQRb0a+z!|8 z>z%Or5$ayAv0j@A0!%o4knpa{4Zaj)HJ`F&n^WE)$m_V~g|mho!s~pu7vF3lzuA8h z|F85pUpf8b68`_*gFE+J{{O*)d*AFoe~8^0@~EY}|v&E%9pqm&7rr5RAQA-$&e zcqJOhtQ&pSk@Q(g?#l}h_%%q!V~nwxCS{#aX*&A)2D{JN6-~_pOapy}VhO+mVFXH$ zu^A~*_`Xvq#X@-oG+C924M8EqfCuQk%Wu6){98}nB~LnkZ{wR!?|l5f4t)6|zFlFX zk?qZ+oxPpI!{FKO-p;GdmpcJjpY0qlw7<8X^!-1tcW$-)Tb=eh|M>6z$)7uaT+wxx z)_XVnc(;51x(9#nbnoiFot_I(-BfVY(@-SQrJglcUkl8-QmU7_HRQweMe0~8{!l|t z@g<4F$54_ycXT0XOd6-V;I!(<+>q%=%M6FA_%9YoOfz1BRR$bTAhBO;fr9$U8dz#{ z@_zG%%0R>ag4bd>SS#BgjdG*>dQ9Wi?srmyXsBnO>f1cl3ChQ|X`%77#F!1ce6L#o zw38KRaL!wYBj%Qz7+D)XF|xlD(OH_sQI1x46H*+vy?{!U0RSweSZ$TEC#4cv>uT!~ zGoUq`+LA%5d-4- zyz20GjVM_uulIii5H>_Rn;zS?^^}A5W)lJGsjoBMkkCwqVB~Z?G7{mM_2don8m{ep z&Da@~Qyjhm;CM8OGHvZ<ZzBy;6Mfv{}B8vvHs4=Rib>B)V zpuS2r!t-x=ozEWK;xR0#X7=Chb3;EXJ$#)3zdt|=GvUe5vYx%tePb*QMUYZdc8G<1 ziFdtgkmZvnS!C>ZJjyiLQX16|Q>cx{Wj}N>J#2TDqf;!0;vhY@I;Y

@CLj&Q&;> zj-&klXYbwn+cuJP;r&~m0;W&K(nO?n@nu#UkK;JbOm;I#j_vI1c^xkU0w4(sH=_ZP zlH>E)->T{hx`75s0LqMWR{EK;2y{Pv@2;w@%Y~}d-+2r=eKkS}qp7fVyN^@)zP#U_ z#Qx|)BTJ=Y-sTd&E1ccpU9gEUYS#@?RXqC+@;^<@Q=x|wxZ1w_9 zziI^^-9XD-sp`0Mm683H!wtBU+NX$Z`3nc3*bmqhumXRgFqVz?sGqB)?9{__0nAUr>zvWc&jw_WQQe=rGj%ZAf?gd zvq)9J>>^6BOe4QC=K8Y!oJdvF6lE6|Kjjhr#Tf`ghe~Jplu4m#Nlnt}{8(8X^7)Nn zXQlK;S4Xw9xq`1W+mcj!jN%+|$*lxJ)eM)(w6!j+<8`Z1&0@Z?x3skuV@;Q+PKo2& zn2^q^AaH(BjtgIYcNZDKUnn773}fsn7lkrgEYP;$>!Ya+AdMN0HV#zf;PXPwKN0Ip zUkJyVEsZ|>BANb7PpZ0|BdYH*%|{#WD-;bic_H<+3TjmAW8fenLz2)mzSLY2R0OXO zqZ6;D6X+tlO4r)?+X_}DZ_UBb6<5s~spg^{?Gt6pk6)E3e>1g^W;asfAICJ#Wx^em zav?E{*O8_a0ADB2qjZ!%1s-Rl#W*G4%0Yo(mPshX&l?qo&uA+_SD{!(2bYf_S?e+>+0mH5)fNr27|4uhi|-udfywVVeVm&l!< zF+5$KJ3<9b9Rpu)rPkb<)if7_Y1xcxBEx7}p6lv?PLav%yUDUJ!IfAzOnBRAp)#Fs zISXzR8CF!Qy5FEXfOhI-ze4%NFQt@Trtf~CqCUy}|LzB4c7D{V@#OA@`n|-*KU?o3 zL`7=W>m5jLx%O+aKASHnK`fA9rt%8){SVIbAHIM6;``U5Chvh78-ZCB?zETTZbKYf zW59T>kU=|0{NYvK1w%qLJ)<#X^@_KUp5xPF=j7P={8UoehVP7u-{lp($CRL%r~tgu zsw51-dvqYCc_*eDFCwR8g9HGlm-%sh_Y3smZKad3pW&@}xhVo6VqFC-La)vEAC*-- zFobc2C%1lCiAC~U`eP$KCw){p-t0NPwL* zm44FLv@t@da8VoB*P6gY6|;2tgi$bb2G6nCDP)l8dD+R*UgQOD~SR>S8H_B z(*`4s$FjC=wN$lLtM-6^TeePFfT~Rey0TF>d_+-@ENCobK`?ocW>y3t_YKy-;OA=V ziuYR!SM9UEahyXwjT*0c_+`UIlO>J))=*J%sUnh5(kJroA(EzaPStvDMattDXgUxo zevinZXskv}bq_?QA~?|fQ|LZPE2oUSpQ-_eSB&36J0F~1@kIX>6BQHMF`n|XOa+mE z1|R~=8T{{y22gbuV!N!yByTX|=g#TdZTih{Fs#C~WWQC#|LmM>t>1V@{Y<)_Y!kVX z-XC>Md%GoL{g4zv1CAXHhU@7O74XoLcinI|lO~r>AToSUg$8s&P zs9f;nW4r(5OQu2pJa;3nB*6!f5NQ0GvbLiS7SppFqrRqdmHfvlxzZB|I1$Pkx9s$e z=TH>cgf2hp_4)yb$UO8(mcV1DJKAwY(LT{6M(noJIAj>h61HO?;6o2jM`^VUT~4t% z6Hb@wRjrOc4s$H8xu(LP(lPiTp)*E26wko>ly)rT7P_SoW<{0f1XV93!NTCMnzECg zOI7oa-1OlOv&g&D#2NPL9dwHp>Wt)>a`)~Bj`LB*hvs72(KeG06p>In?oz8LX6~qS z6<}IM+-MExSNuCaJef>Rj`Ya0H0!m7zP0gH)wr~58r3Y2y~VzZ;>HiY9^5NUOMvO05d7LfL)3n2w!$0mf2g82N^47q~L}RZC``^M0UZ{{Dy8 zTL5Z(;DF4f%+TCR_%6MUz-gr``l6#Iv^yNiogFMfRX^4aSj zUTW|20K+enwx(ApYI>FRl;fcsL+@|-tfqTX@w&Qh;Rk0_wU#_QRE_$Gn&4bx3WZN3 zrNGvWEQ)$rn$ZTUDIeNOt0IEcO05E|(B3OHdo9u1BRILaC@qW1oK%F-tO=vx(jeg) z)WfxqPNVM0QBH!9?I{*<&JTV?7N^E>oIrJEWdK-0R0BxrZ&r8z3Z^ysc)ZE5(u3TNwdL5?LYtRx!( zUnXb(z&^ht2Zcf++k`o7$d*}!tK|*MtzT_f_H{(it}AOCSDc;XU8(bzqJLh8u_l@_ z_|hkGdSHwNDyTlw6&B7^V}dK*>0Vucau2qZfVMw4z*Z>f;yyvivQ3_EA9#cGBk8DP zznJ1Z&B@-E+r8}B^`DMgRZ#^sTMHMcFTBbLpRuv&UR`Ap7$+e{P<67gIrS#D3NBkc zJ9AloN3YDLPv)JTn0NbO#{QvlJ9=R@dRJnY-D^=-m+NAxtXlS%O;)jQwbh1&f@(jE zY&&zE(cNAPi#!>BYXd{yg-0&UCv}U@XG$%cK9hlIt7mFjv*iAn3aGn)HVDEUWq2fA z!iA6U(#Q0!0xFXZ^a!)lzcg;GT3;M0?_|O?@i#Dvk!on&PjjI4+0Ln9odsb{pPRgw z+l;#OMSwgjaG1y3ZJ*Pa{1ea3fNBh?%L;PEbj3Gi{H0xdwAH|Bl2$F&F6C>3f-*jG z5X2oy(e_<3*wPjO1}<=@ZzhJ06Fm~P0elCdCqREpu@;B;>qx=>fW{ChaC;=Eqk1}j zpo((Y(iPf|p;sYwASa&K7|2AG?%u9GjFB^*Jjf177&!HZ7YSt%>(=jA^S=yY? z6YFjUlrd$(J&aC73pq?~(e^$Lts4zhx=q$rbq+liBUN+rSG)GPjj8khjQuxW@!hYe zoGCuI31jdb{+~`BJv^z$e>*$7jsNy3`+vfzqD4ciZidLm;}?{m(p0t@f&*A7e1TKY zu!>&S&A7izXYXJm{P^_o z?fU=ytbbiCWZ%{Q{fk$xUwl3N;j4dt@%%NAr!T(ydivFO&z}Fsci+BxjgAkrXvj(n zLK-3ROGUi!Qx|BG4+jQ62(J5VGBtzq3(ab(Wv4-x%NI&-uJTJkQjsPgYRwuU4r_N^ zj)S<9x}d=xAkn1iDD+~rgJ?8d%l>3lYG_w$;QXaN&eh+RY&b!WE)a5u=y^;Yg!bFnW6d3!} z58qEJ21=NH3#&zFHgGYK&!7?khE70*3^dn6Bb8Y&Po=vI03jc1%J@(sDrDHyFhZV6 zesS@Noz76h5pcA}LY*p#?UPtfR99mM796`2!737ayB?fvr=DkJ=3S`ckUP2?y(rx5P;6 zD(7<%U{Opbo)J~O_^mJS)$Ym-BkoHP9;Y#C{rEeFnUqG!NkNh(D zgW!)Noq$4NHJb#kx8%lOe2N}^_;^H<0JZjyo#_!Oi?T8*el;{R@d@eiqiR*^@ju1J zwe^6hO#d{ifR>Tihm`v#lW{jl|J@kbw|D&4lk=wk-;-PV@ApLiak`IdE?-<|N!`H7U+_$lWgfB2-2YFkg@NlD~kgI5gWtiz=t#}2| zNdPAVt4;E6_#lihEVp(NN&s%BfLq!aR(y!o_hOfeU36@!V5EdnX-(?;Cy-5&03ADD zr77CpQ$6FVaG}G%D=P1dF7$J;xgV1wA3KD$`O-a%DF0BaO6}17(s;!q9*OU*obt{j z#{EFk?``{A>lR#Z%~M%UVV&^^hJg|dztCgN8_nn80nlbtxX9qw ztTGaZ%jdLwOeP1>6%wlC$f{E9A~hIQ-Z59Rs-_{Y9J#|qXGTF{B;fusjujAU{lbbO zI)v+M*$O|T=!QxgR=?4!?g-EaEeshCHNc5BZdHt~Lwvj(;MW+9fkBn4u^@X%MIRrm zmnjo|>&T}rItbgk1a%AAz*zt(lsH7M=(eIsphy0(StHhB9;iuVm0M zCUg}PtqoCeoT+p_h)W1x{7sZzU6^7or?OlHBDYg%!Xk{*uxe^8rd4yvVPb;H^wd;+ zU%{Nhh>*{=mbGeIE>(5RWn)_+wn5qOd9C=e)L7{f4sa4vxBN%69ZSBM10OcHPIfBhtz1D6xc1HgZpn@n?9fb_o z|CJkeNmgmkgg0!<5LI-7lASzrFqYfo-KT>rhIMU zE0Zk&G8VVY9{D{rSzI33R}@wq+qD)CL|`I=;dV5656T#~ zxf|w`S+&c`>Em(=KxtLmk6P{EQOfATVO1977(km*L=v>o7p7uDLxfkoBE09A;(ZzL zLM0XT^;SY!U$FJuvIlHPV&tpUdDvK;R;r4mQ^vc-s8yP}`v~!DfsDmC%+SjnOQRKq z0C&A5KU4M7w+w*PP;s=FF@DF@fE}wNQX4HUSkv&h?^-m0)a}kH6IBGit9q9LOY9{e zloUB-#fk_|(7bV)nhw8CU8>H#DM=t*FLWePu_Dj{etEO3#_wBUQY=qCpmFN$DwcU# zF3^P(3BSz|)~7p0O0H$z)}sJZ0CQgn)8%YgZl6dKgU!_KoE^!&IwO?9YbGRkFTu;3 zDlCqOb~M>C#uluhBO>|4ZC(6FU z6^?PaPfzN@zsLRLw{b`t202h8`ds6|t%SZ@Wp$(ZCS@-=QDgw z)taY3m|ZwRL?A2_c#$gBwq;d{Vrdq0HbRVJds^8L)4D`YdaJ*CtN&Zw|4MfYH+T=c zOaJ%$tfBw+@WHMA@9*gTSC|G!^}nW;81AmzX{)JQh58?+|J(hP-7xsg?e6tktbhLH zCYS%N^?!Qu;9-6JpFg^d|NJ{z|NMQs76?!E#TQiwdu5~)r8DEw;!FNSvpkZ%=5})r z!be`iF~)zsc=_tvAHHwdT9Q?mr%7B%iIqJgyt3ypq*mxDj|Xb`pc_Jq%8aD*Tk+j6 zme$H9!!PZ7mF{C}9R@P(SZ@oHe!H9gPu~C0RB?K8Uws%<@Nz?*%>SE zYCEe>VufMd)o`=uD38li)H{BHRz=2*0eAAN)y44iTPb5n7`^ul=r6vgoI9iD{KQY! z33idyEv%jule^s8ye4m`wd^Wz^V$U|>O8{QoFnmjIQs1Wv}KLqyj*V28@J{4-K*_6 z{kEJiQadXA*VYP$NvR*Gw#(bMDBu4YRV0__1Y z+m5h%rd+j7vfa&pHyS{{{C333?ayz?{{giPTh%;_3Jha(gB~Du(0`9m*i)nb9^Bsl ze3JB^Q1`)^@(oRt1I3Y{;yp%YQEbwyA74EG_StvS?_NCn`rGgSGJXEnXD^>UfBoVm z`FW6$*Cyy7c#6O7;;;WJ+~u229%=^j+(UIO_^NROPVAY8VJaUr(nEETqBNf$nk-(u z7;);Cnc?=^aK~?Eu$SHvq}E;|vmUaE^7|XQ4&a_*QOS2SB5i2#c7oHp5EmU<$~uZI zhKHcIv8t5kkah?oekjp1RlG%`-p3B5Z|^9+)etHWV%3R5Uv-m2?K%f_h`Hr48kA50 z+^m}iqhnVwMgyK4=nB%6;U0hcRFBDc*ZDdXuBlsbg}IeqgH;BD@_h|>OHD-pjbk)g zfCIG59PY>*7?@yFFH9sxbRLKZGstf;xmLC{B#Tx@eH2mPF;%{hM95$ICWg=8CAOue z`5>uyQHW*GtH$WnXx}R;M@^LB4MwbaYgB5Vytc{-DBA)S9jw=omp(q7Ova}a%N4e& zW>#%9cJ#7HdECCvj+DWMMEzC2bCwS^R>cx-_0YKJ9%(!G#mKw_A4xzx@@2hFANA|& zJp-GL#|Jf&U{}QjuC3U+7)j^F1-BMMv#%LNz+44+!L7uA;7r$K9!YneiNoA^P=$VE z(8qzZCP(DXk8ZInfziAhCL}d@iqV!PW~FFGs$D@JGQL*=I^K-a^r@vIFLeCT6!=vZ z`oWZhg1o~FI9qSJ|e@H82>JI-hA;axgsm2Kfe{*3I*Duzpm2K zS-S~2Q=sS?%4E*yei=Pe)EjNYpwhx}I#1K0y_znaMQRTEOi7v~u2 z5NaG1))|zD23PJMlzo0i&MtUxNzHQmSPK%_G#sZMQD7J=?r32EsSb7cof8N=|$*8~xF2_7OiuwQOZPfwG^9#h>ZN-%kw9x7SN_yn$h&h0lKH5+*l3cMI+tU(5n6 zr`mB?>O|aWM_dCzTWy}o;VLs)_BF|q zSjYgX_n3-OHaRd&Xa<=#tlP8U)`1F>d6j$LOIPcE4MW@W9)iSu5?w0NvgK z^}>xsJLSayNfhRpM|tK5yYl{xN4@--qL>GXccoQ)XM;t-Ujyx?*SAxHQ&wQ_8u@qS z#Y{iF{H{@EhjOji_ssiTM1|%9El{@Sz1`Gra{m|ceQx{!*d_lxeOQDbMT9}F3tF?v^3 z2DbM2!pH@nw_6#n%O*kBoUn8EAb?FC)a~ITp&7aB6*68JW|wap%=$Ov2%?I@IF^wv zDIRy8#wyA=b&R;~7uLbbIZM4!K{CRfx$D@DKd*L3kq4%Wooj@N7+jtR=C;gUT8@bR}%!gSJ zrRbRuxJY6%@5&c$M)ZYWMJBA&Vk-GO_6A=Eqq}C?^qBQhv=XRED13~$!YiM>@|xp4 z;k-{+9)w9<_WbmarRX3;3(I>bBD(zH46r~9X;_fH<)kFUn=IzafbToAS)6CP8cAZ>+7-g9*K z1NM68e^fngnLt%w7SRn=JFTgW=p!|ckeUg8Ekd8xGkX0=j{w7q%9eycs1~Tlne%DO zJ5Jv|bXQ`dFGPtL!IQQNXzZUYtu!KbeW@CX!6tFP4RWe3mc%!5#5xw@SF$PMN~K4W zyi6>yuhH4_G)$&^MN6M1m4k6DJYrfv^#i}!eNm=|XWa|Fy{V~ByA%miw84;b;HxX; zQ$;NmhJx2zco{}9?IL$G+OJ&f!wVEw=UiwjyqgIyEQIGO)+z1U5&8hTFiIq6o=OHv zZpu($4D0R2SrpikY0ti?)rz)|H^>dWeRKMD(n$Y`bZe>%%@mOB!dVtYc5xr5MydlG z2l0I)q4fARcf&loauzANJkFGJ!N0lrB`QymnD#XsFnA+CLdS{o70i$rwRauQEtzZ| z3?NV!G51FJ*Vk~qpk6dFHf9TsW=Cz-LxUQvveh7 zq!bR^IPti=_G0i{-fO0cjf_z!98Lv7Ll_DtPiqw$|EEt|{wt=+L7Q`zyPD_Jn9*r+%r#}8yMdvGoet%m^yz(b(~ zBj2Thc|urxNYPoOqigw)Sz0eVy-dUTR1|+mNsnsE@BCq<>W<&_8@XAq2op0}fM}~> z=s>QPJ>dDigFz!9t&zu~f#Qsw<3M997942c77*|w&;*xZmZ7uNkpaP-8**um@R@_> zAoLH+1>U%$qpc1<>(PaFyRy{W6bG_Urz*4x`hzMcUO{@$I0r~y0!F7fcgYbw44VWK z2(cg{Mt^orjz`exMBtL5f$6;HE~kuq3@wtVi(Q-y+FU+%mgyQEnn;t>;-du@bzGo*s_0&d{#4v3EzEmND)f6Qu&6IS!?LY7GgIfpZchjRS4g zV~7dH+=U>RgAMSbA(DX=zlZz{g&#xrs7P`zgD68u1Tx=7s23ibv07Qb<#s_*PN1PZ z6pBo7bGoT*!@33V4u=|FjE)^Oh<&yja+9^CKpGuqRNcJs%StTwi!a81d-a!t{}WyY z><+rok5F<4EX`#=jGmw3CPmDM*rc#q(Sfw^-R?`!FksbDHaUP5n&zndj3I283M7Vn z19#ue4>MvA@#urX?x7})aD6V2I0r<#$pP*|Ffb9HY-*B`U;a+Q%~+HXIP>%)7iy79@-|6CoL{iE;y&K^E~+@Sv-oZQm?p91}_{0O?f zpW{vg`^o(>4@U8 zAvG!A$!iU+Jq#zN5;%&ZleS2bs)?HiL!J{RD5mDuZ7Qdrig>&!gl)gjAz&nq@bb$y zVlI&Jqku&7S1L+ZJ9eIk*ioBelEeARut9I=o>RKVl}gdMuyL8-);?8Fr}75zP;Sl7 zD0oNrZRANtLMD#J@<;+*$cA^$u7_xQhR?jlG5b|N0L{kh9Iae8P$U7 z%99IufPUN2+67eSY$%i<6VlfIh8?9n_-=W_vffo(D{^*lu5b^L+fLv$Nlz zFY~zvz^xtmssx_%?1A$v%W3X9r)Ru7ozIa>AJUzoEit&nFfVI1?Vnb%I0a7hZLj-2~t$>C@{((L69fhedsk_m%WAs zCdZT~KfE_jQ)e`D^O5t#%)S2ez53YT`#&I&_ivDh|Ka>0!f)4qSQP)(J~q67=E!J; z8wYbmk4=KagRTAW0+M1KE>PX@XtH4C4DUF9em44b^z;9B=hzupG^GCWZQH1DsVE#+ zJBQ~$3U|?_M;o5c{_DSf%VF^rp*}3f(Bat4Pifz*cWFfpFMnziMn@&R-(}v&nkxc z;sP2z;nLsm8vO~!S(@NYj=h`26r&loUIGQlGW;sSGxI(Y^HW%*p)?K%EK0YlLsJ<) z8^fb#TF}LPc1hLjsx?&&TNkBTe(ZBxdd`TB?J#Sy0A<1>aVBLv<9cdqIAoZu?UNgA zC@PCBphPSV2=6k{^lEu!rs;f2m9aIGWl>m6fZ$z-%~@;Jzo)o+B$fQ0?hOQMt#+Cj z>?T~*Lyaq4iZU7MRqiZU!4W(gDSgt&#el&{t#!OO-Xkic?kf=k8%jpKj!C86l#odz zr2jh>P_jVA-A-h5R4V3-Z1vQDP$By)OiD-uZGb8-ULc9THzU|4Aw4<=Npm+@@IO)g zhn#oS7A;SVjua><4}>cc_c-fYt3@x4wT^khJ6-W+$iYw|ebgP8alrbVR5w*4{rRbS zPC4J4yw$HsD9Krs_3j6m>Z5b_gQ^LB;V(|#Dsz29mGwO2X{w4JnQ`ltHaL%sU5VUiNKv2q&0G5bGusGj zmj8H{iwCs4lHYUOS1!pD->qM1&TC^Lc62oqDbb z>VU*0Ljx;E&I=fLJ~1@4G$W`oMRB2?Y96WtyVVU>mS&Q61hxTMe_C62eEx`?loODA zL!{GDCgyo%q&+Un))q9pRw;w^)Fm%89IUd46K^J1rDg_8)l0UNb+_#pd)9n+eXty( zfYvIpWjHTBwf^Ll+NVd$#Av{8*{QOqJ^Ph-G&#TR9lP_$CyWjqELFWut8I#MJ<;|D zu|rj6PxU=Yd#?|{7M=ypBXMT%Bezi3gn1y809|FZMCxpdZT!p+>ipTs$ha*938PW5 zf7k8r%pt6cJSQU6QQi2B`|i~b;)>RI0X-GuM5oTKv@1GwN*pK`No1@lPcJ_W7^=(# zn~)X9%GnlP;9~)NgU3mM2GlE5qmx1kZnA|$u*48HKtZF>zXKl~vD87IPTW!&FLRe` zH!rS3)Sv`TpOG3W^m*)F3QHoo6%6L{&7L`j%d-ZMR3IT6d1s$=v(Uv18G~5)z6rEk7^Pq z05K$mnu9YE^C9qirc$Uvbd< zf(A#w9GUx^UhI>m-WKl3jE7UBP5|n&W6FxcOG9=ZKpy39P2r$%@2Q&yIvbDHIZyX)9jdbsZ*knRx7av}rtHyLL?ir36 zk}rKONyYdBS@i1w77IU!xayg3=a05=HCGur=|VvI8~5{yO*yCz45QmlBYgR0 zGMNA;KzrbO5oPfdE1{Eg!~rX=hV zui|935_d$^Xq1G&3;Zed-62PB-5sgS9R`|)>3s!bn}oaN z#pX2F_b$dRnrY4xjj+toa9Sq^rWNd=t%UYFmG)VO)I3c)<8ZcKur%m3t%?)wdBbwS zVv=P$r>kv7HiH{Ax&ubF0+A=~e~QX;pG!r4Y|>xPMQ_2|y&@`UgB3)i38pVIdSH^? zvXl2mZ|xWUolHHsc_^Qehi~2q5L|vCC^;@WvzZ7Lz0HpC+83~gRzM$>!}eaV-LF`Rhn{sTGf`KA7LkQGxRqj zcr|)!*0rT>y3DPKK&0a5wjwKsDwS%huFhtVgVlVXVUTdbn;0BFF*<_5$RxEH(s@#B zf!^W|V^^hG=FPTl**b5~*B4S!Z7po0h(j zd!Ma`c;{5#^(Y`lq>|BnaR>6T;n?Mt#=9Z<54|;WXU$XLEc0dv!0q(kDG+@pb@|`v z!(0CkpQ8LvxOL?&-_Ut*6rhtER=}<<=L}ujRQ|t(`)?MIAuAa+k)JKnj}OS7Dx9L4 z?^2@p@CNvb;!HV04-);&k*(Ds8KrW6zej{7EFidxad!pVx|I0vOB^bbQhrO`w}7cn zk%(A@E*HjFX1;@Rz|h3yL@5`&;oAp+-tPq$ha8 z-@VnYc<9>FmPVzZ>&8*$E&^Ta?`u)@6n#VSPOF+jtvTd*j(J{YgsT#d>Sd&+X5n6C zV4h>1w_XN4s+HmA?!0p$JkznrT`NXBYZIex?OW|QhIE!Vl>B_gTmC!yP7bc&s?84Z zKu!|y~z)#%PX4VsI5=YY5=3Wxhgj|)4;7x`T-O>+;Jt_on5KmZFGTc zXo1n2apnF0u+CqIK)q5O3}?QKbcr+6p|Bb_hxpzn>IK_dskz_3O9gY6aaZvyMF;qP z=m{&bWk7NKT<1bZ$FHIQR~F$>SURp*MH^$QCbZc>7!NRvNS6;Csi|?%f&eG}A&*Xg zH9eNyD2IZ>ke;->o{sz}tqbu~Jf@g)M2rRn(-1Z1b@0Xrp=z1svUFSoOP8TfO)o$n zX2H`#Rq(N~IQ2y>Yimwh0s2-~;L;kQgKd#zI+_B%p~px8N^ov2(S(ZgM(8_I9|$I< zDvmP_3J!4FbW{_Oo@vw1%(!i45r2iR4{0hL^9fc>*`pSP$gM3n#G4^x75?ud4`q^Lb4DF? znn~ulvPY>#S;s2J(bmc7>m*Q{;weQLVLS*e-!-+}m}U-dij2gn>7ur7q&x?ox_n}o z^H7X}i~bv7x8e76O<(!-{aA(Ul-^C%gx@*2EqS+vO`-ZD!HaGs#pd7EXqw$TDQs4} zWzCr`QizbAS~A+#}Z}@|^QY0b|TYN_a zi0G~4AC&IX^jxw)GldX?PtHzfjiBrxV!noO}5Eo(d>md0m3f*@SY+ zB#BmfD7>t>Jh*`>z-5MP<)O@cPmbr;0Bk zSqYFVPd#$x?c8rxMpLw7ss@v-%PR<}-$h|O;)K$q;_)6BRFh%HRZ+w%@7=k;tIXT< zHPNzu9CHzHu1Z@3oRsGdjA`)gj^Y|SCH8eXuOEsqmPG!V0~SbWsY#9D_PBE=+_qH( zg({HtB@v@tP@J4TB<5Ik7Nvcv^B~A^=r*1WcB5`OY+qE=Gss%=*$GW^s`J-@ktQ2% zI33aTfzh(+#1v{IkVb(lk2RW==nHZPEg{HeM$c^2V7apgw^vxyMp}G2c{xiV@rC1u zB;a>`1hxWK7KKh#eY}PCP}ObOuT@fh|DYKLi4ED@VHI3`S4JFb4pl&vL$mJ@

`M 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 diff --git a/vendor/bundle/ruby/2.3.0/cache/jekyll-watch-1.5.1.gem b/vendor/bundle/ruby/2.3.0/cache/jekyll-watch-1.5.1.gem deleted file mode 100644 index fc804ee6f3ca7d8dc1ad7d79813940c29b11d0c9..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6144 zcmeHKXH*kf5~eq43n3r~p^G4d7&=I#8j2uQ2q02IM@lFW5fqT#dkMXR^eP=8GLbOy#)~#gNTTV-NF-wKt-TXJa*x~%Ah~r>yC0WbNz0TrwtP6@Mpmf z>;ESIw{L$q_rvkO>lPG7hUa>f3qe3Q_Q1#qCk*g8st|rUsq^?Hn;U%dVJ6$^O5dV0l(FcaQ%k~PSsWxG(CUvuJ}wel=HOPW0@1O%;22aPLi;? zZM0y{FR}N=CMU%Y^RUx_11VyiA-=@?sw><3?Mze`ZMGY0JodVaGNS){)F1&T98~#E zyr&7HxX)Sxt=yksx`N+3J+5Ie6CW@C;LQqPJHY>d*eSV#2jZsloB3DXs++ z*v_>ty15T)=J^5Lh*Ph8K5EiD9^*HEfeA9scV?5PP~)VioljiHS~2*SiM z-)!@sAtrrhV@kf9NNq5L<}Q8meX{c4~1l$>6Trx%VItp#PDpmyfttgd}m*NtTv4Bir9X^5QVP zw&z6NW;G@LCBf=xf=Xuo8j@w#7+7eN;-r64-cdq^yus#Nu&6yRxc_oP-62vct{H^t_dj*Ci2^&V!m;d@=BVs%krHJ?Cs6YBfo z24VP{bp2{^lz-P>^Z#Slzp(#10{##2A1Wd&{v-ZF#e{$1|If&>Kk$FUz)_P$l6D2< zgLUI7XECYfZqXYEDU}H2D+KZ{AoKu^>9688(#PlayvPB^+v0~_;>~G*m=uaMgN;(W`muB(SIYsg3%Joz%b>E1k@mL@RkFbZp4Z=F+hvS=Nj-Ew^F zSdn`U)F{8>xl9@^qNSK4fFsY}V0#_(VLj+fMVVe%+dFqgGoJEf!a6%Awo;ZaWkgwF z#20s8+j&5;+Cv3NN3pf^wk+dB&lHVa9o|7;Y%b?{l``V^Km6-2*U+~|o_EdStv}LRN-Z(m}lozktd{= zq=%roP=OjnsywQwY~Ez>a719-;t_D-U77&+gf;_CJT8H()N-OrO&% zTpoTXJvcpcvas*J%osb1dPy$dgo1J9Raenor0sC9Ryt3Z63s=)%aoFUUvM$2vFjri zpWR_#_a4xE;M8_Mzw3pU`M*optu)WC+b-5RW3=^J6AyF zp)V_xgFG|g4@q>4M-W9)V{E-O^G9D4oqh(&;hO+e1;#F>9*R4l*9A)-i_OUNIL?y5 z2XsN`J_JJp<6(s1cx9oT^|y_|L&6QvGa1i0){Klz&ziad)}R~#Vt zroBcHN|o2K71YI<#D=op9xN#gFhau^Pdutd-VqEV`;DyC1> zkJRr1j~JBs1&~JV24iFn_%&Or4;xDGhl5)0BI1k&2^y80sqbb7O3)FVDvZF5M;1I1 z#gjLz%>oYC3$RPH*Z0bH?CTj}n=A6+xf4Sc@lj)W$>CKIMF<8(G}cnxWHk>iB-_Kx zhfKn?eDo}!X@sXho$q$&4Yg<`H@W5wsf-(5%os*UmEyl@+pK8YuE>xolXkYciMrFv z0WKDGm~_2(y>ui4rk#ig_hq8?HPd%=^;vYhF;%=VVLU}Hq|@wpLCSYV&8;u5ZuLyb`C zh;1q%*0@<|3jtZpSyti>WNFNAcs)rEe|f8a{oRwrNIlZN7~tO}uE~o$V|mGtX}2=&V$x-T>$7^j@D|HWnl9 zsUvi4x)i2Yotl|Y!~QgXlYGw<72 zC4FoShSOiMQWwegAw8J!s?weAyn(0gNSNwkv8gX(!LH3pPf40UX&ZH28f)82$3gI7 zYMses^f3Ki&0BlMY`Zd|q$fn)qZUwGQW3Z*b_H`NAP)*DHqx3du`Bj_@O=LnW#lse z)49~>7k9A3oUY)U)6ZKE$Q#Z}tqAKJ?i!5hzi(D3 zZJGdXLtmZoSyR-FdCs@{$()TF2m$d1^eER59UpEcK5{zA?Qy-?>nfA<74*HfUS1O7 zf&G~k@Hl@)q5Yfcu&_Z|*rVJXQ9@7593B3eF7Wr!_&?15-(^4cen;s`<-?T7O@c8}zu*S`CepJmRK&@9`g*XPUD)u`0>^1JI{1vO zdI?Y~6C+hcVlwqKJ>Ei;mrk$8^c|BQ$DrQ=rwensF{1b%V^{s}|Np%MT9 diff --git a/vendor/bundle/ruby/2.3.0/cache/kramdown-1.17.0.gem b/vendor/bundle/ruby/2.3.0/cache/kramdown-1.17.0.gem deleted file mode 100644 index c5ca2344e24794c08139779e92b9f7c233475b7c..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 260608 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�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 diff --git a/vendor/bundle/ruby/2.3.0/cache/liquid-4.0.1.gem b/vendor/bundle/ruby/2.3.0/cache/liquid-4.0.1.gem deleted file mode 100644 index 2186389704f1fad84b9c30bbfd06e51fe40667f6..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 72704 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 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 deleted file mode 100644 index 3508492c768aa345f8e35a4875c8110d9c1f07ad..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27648 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 F{s+pUi#PxP 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 deleted file mode 100644 index e5333e006bae100c0b2bb4a1eda22d89487e348d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 16896 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 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 deleted file mode 100644 index 1d8cdf8f3f8b425d2ebb5d656259880af65d9cdd..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 BJ-`3} diff --git a/vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.3.gem b/vendor/bundle/ruby/2.3.0/cache/public_suffix-3.0.3.gem deleted file mode 100644 index f83ab3eaba3dd2836085bea466d4753203e5d34e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96768 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 h;P(mY%fe{72>Rc80{B{{=m|^WXpg diff --git a/vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.3.gem b/vendor/bundle/ruby/2.3.0/cache/rb-fsevent-0.10.3.gem deleted file mode 100644 index e88708245ef168c343df9b060fc0659fea7713b5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 50688 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�m+T=23c_Xo$BO>7>Q?K9t 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 R;y(!d2Z8?}@V^Lw{|o0sKA8Xj diff --git a/vendor/bundle/ruby/2.3.0/cache/rouge-2.2.1.gem b/vendor/bundle/ruby/2.3.0/cache/rouge-2.2.1.gem deleted file mode 100644 index 667cdb64dd1054cd8759913a8e5ef6387cbbb4a4..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 281088 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

!9tTi&w?)t|y5BV~RaS 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

YAvU1 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 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 deleted file mode 100644 index 04b330408ef8b9b5f849bbf15dc97003e130ef1b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 11776 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 pz4BI9f;puwm2Z8?}@c$nK{u_MIZbtwB diff --git a/vendor/bundle/ruby/2.3.0/cache/sass-3.6.0.gem b/vendor/bundle/ruby/2.3.0/cache/sass-3.6.0.gem deleted file mode 100644 index 856d6f5dcd1256b50d38a7a3432d0aa9349a9750..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 320000 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

8u1qP1xH$M0$Gx`V~@7#m;cB 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¬tCT)_E3`o=2KXp{S(LKUHp|NRaB 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

?Ze!ldovTL5PV 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%0DbRBmGJoCpF1Q&JG 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ν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 KHv<1B2>b_o74X>r diff --git a/vendor/bundle/ruby/2.3.0/cache/sass-listen-4.0.0.gem b/vendor/bundle/ruby/2.3.0/cache/sass-listen-4.0.0.gem deleted file mode 100644 index 94646539b8f75d78e003bc7c6a6352ff4340ac4a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 27136 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 C4^;U8 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/ffi_c.bundle b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/ffi_c.bundle deleted file mode 100755 index e9433c468a53a6326142bfca1a84ee42297e9710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185524 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

$OhSv44p{ zfj;PKjnuI}hhj1@4-r43ek%iqtaLVYGm^g@o^<`ZhJIuuzlT)|nRZtZGo%aeK`z$; z-zUKY3^AaW6`PXlfKTdxJmp=Bun3r~1K#fnc#;!ix)bm^6XOIYM&5UXR^m3O9pgbx zz`u~Wh`J~qHTJoJH4MY==AoA z5KJ#CG}8M8sv3LsczWMKK(M?6EKPc!CnlP8kMNN6ZWTYH7D?<`pRr1t^j-;1I=$l^ zv0ow`>76GcF}zeq>iz-9kfW+I#Yvz4Kzi?EdoW^8b;N#& zexxC+BOU48Q(&j}DIM@~SHR&;KuWFyUZ4XqhaW*$q&F-9vu~jlO*?m3JiWgZ=5~7j zRIk%}v*aDqOLc(s?m)#&Oz&C*M0)3frAhBfVxn2s3lB+erT7_juonA8wg;2ma(L1; z>OK0A^xj80(yM^cI_lMHfr(_@>IyiW0a?v0O0EN5t^+c?&!5c@qi)s#FLnj|qRx)7 z#tC?qiSasw(lIX90jIbEzQlmi-Jj+JJR%+X)%Wf=^SQLNzCC)NlW(MunS>w_%LFkSwZ0;Ih-PXM(JCsS!>w>O%9Kw z*yL?pK|hki7n6=0{`pyUdh5X)Iefk=;McWwdMUXMI7J6!4p$*8(tElD%ns6urlq*j zJ71XF>HQ73F}<@T@0i}fkO`gf{n9Khap|bZ2#6Z>FN_XMdXFO}npFoLTyv-5{(*QJ zwN-`?S@*C3n*`6K++HR)LO+t=FzHC}Z}RN~U!?=CbOk($0S{upc}~EEIv^9g0%1|5 zX6b;lT>)QNX2*Dh6YzKw<1{D6G#&6TSHM3o;1I^xL*^pt*K8#EI+YhlWbtb)j5zzR zw4!Nuz`tFk_5_(6JB#bVjamGW2*E5)1#2|g)6iBDtJLcV2$r{irOD!_iHT;N1|D`6 zZxK(UiY5B2O3G!jco5~5I+f|jJxj}NorO@k4UNO~0f+5%oCrEe00uT~rF+t|moNpNTZ5d$vf`k0i`goqleY)0-^>!OkAb-v zwEmTtXciCaxCX5+0}COVv=Drg-!*8x0Ys;6WiOQ2`>l3K472)R9sAMl*k#bVO2>YN z#4ebnI`)w|1#G>=;%C&pW(t}$j>^Mi_~#cxiowkAKhclWkb_A_hJPNgtJXFha37nL z3HSm7dKr+C>ws^OuG`Wd5f)XeT>@s`Oe>mJjEL;EbeAx<+foa-v1)BV86b0!-l1TP z+@8$_k}#ygcfwhQbHLKnuoc8avt|nqQO_0PXVeghJ?m_j*hf-qN$jp*r^C_lx~z1O&^A z;<2wGCYts9QpzLA59!#C)Ul6Ch`lEnu}?~feUpUz+&aOD{RcYsdsv@bx^16zl#aaz ztK(Aj_E`t%*sJ5Qf0HX|-v~bt^f$2VnitJpg4n5CAA}!Ay`6N15#S!?qa=TX7J#MV z7T^o(76b&>5?g>Ttaf6eS^bra)maf}&_W!pg~)UXf!I%X$DaK%Lt^1-oD=)uI`&r~ zmJ_?E(vdp$53oFLRs@FV*ncKGsBC22&e{EreVPLvSc1j37_cvl!DTGWZ=+%@74K?c z`Lb;pop=|Rq*}n!hx*#i*SK4V`>~5Y2QZiR_#^|ywDzg1D#n3RS6v>gAL1J0h$BSs z#HZNZhmJi6z(dE}I>QH1vi^P<6N<0OFfmwwo#HIO{^d-v#>s}%Ts{$~Ukk*c7I-cI zliV=Yp7!V@+mGjcg%PD*R*FEcV2k;4c%;;>jge-<)|`X*FU~cb>+*S^BM^KV`0Cxw ziV5Jp?J$WQj({bJuttD^eW#%ilA!71_IhewB$e#KDf}e#-^ziHE^0P!>J=hMNZ|Y8 z`+e(D+L5#eIE<55^Y960eBYv3$@eW5J#F=6n-$jqvRoq}T(X4Eh|98#3DdF^;`5>j z@?4%M4~3aWAz*(b`H^<~_X=}~5k_(wdnM`CYG4plFDS=GfKkHRQ7yZ3c>5ju)tIVa zksVowi;tl#k;8GE?MUC6FOwMj%lvS^Ij)zskC?KFKM8tX>i;-Dat1D&_*$>^K(DO6 zhm|=kES&hj;7(uL{SqFha`-Gnj=et}i(bjAbY}#&A{+UK_qh9f;lBccD4beR6zpuH zg^+D>}w4yT~t}!VQXIFug%H?NUt8_yBM)&1Y0c9EC~zCUpB zT~EGDgB5c4eu@1sYfhZ+IP&e1cY+Jr`tV)9z{K3HfS(UV1ZQ7eXT!1 z<9E_@@?`qrt-wGALXAfyqI%^UQfMFD4a4%I@(t@9xK5YeI}A@r;Uy^>7wmu8diivw z>KU9t>CKm6UUDv=stj=<2l0KQJT?ZnaE4yy;-c@As@V#NiAF z^aZ~-h__kf_(t!bZI%zubrnppuDS)aXy+nHTPM0FUO=jlL}Y)#eF9UsUGSkZZaRrl zxUYh4jS#;$KZVl$I|Yqq{e;}m(P78(C{VSgOMICM3U8fo*Qc!}6@dF-7R!5*R-T-x z0o^`1bD3bd^SWH7RtMU7eHsl?@4OBYk+P0;MezFBb_A=P2zVb|BH;Pe3@3)+-y6ef z#L&BuZOhry#h7P<6oY9WkZ^bvQV*RL4(!n1qNgG;-=dc^vW5?; zD61H%R}2m`j13$w;rRr<*;#-iY7KY=p@avrdVMV);`y;RgWEpv(;TIi8Cma}*;R8J@ z(Jc-BBO3}%hy;DJyK$l#%s<$ZAO0wR?285AkJ{e$U3U#?K5F%5Bw`cf-BM8YA-^e! z$IqnZerJ6~P+{6wb%*J=nMAO~n7m z2{3$jKHrf02=oh~#*4vky9_ikP>(KbBD=4BZP$V*l^ z+#ig}*X6=*;)5s!7*km3XnULl)sRce?$k%9w$Oqjp-z189Mie>LOd=PS=5mqelxd! zdHTibVrAWV0d!HzGg!HJoF8OlwO)d6#O5|%IZ=g{=SP-jns}g6IH);$7)88|ewjg= z;MY3(dX58du64krk2XE_TaIdYC7#^cWxe_pJ*GX(5xER?c3^8A1s)vm(duwdFj|kX z$5#d6#g=^KJsd;}SlCk#uG&)&Ub!V0iLMk0f;$271#euq!;!Y=VuF$NRe~vkJ_~lD zH9v$13pk+3ezzR-=!jGC-iv&BnA7L`QA{xoD6A_^rC{E_hYvmN!MjkkZDT= zKSk~x->oT&LE)!2r{WB4s1RXiI$=*Ll(1(=SnoIo->yR*2fQ_RfE`}DEl#v_t^BAdixOc}mU$e~QwdnK)C_6k_m zx02@UO9=1ccPk^=O9>BpSKtc>=ipcn@N)_G&JlPf;fAQdrxW&73OtVR-fDr5CLG34 zoc%Z9zuY45V8WC8*u7`}6H8Lo*Z4LQ;Liyc;<+8b9}*sMqriV5yd4@C_!kKO?HPfe zB>d4ff&V~w(q@70Cj7jX`BuWGeJ%Lw34i?$fm;ACitX*dXTaTmGUmc0E*J@<2XXi- z9NHZ&w!(!U<%I*NeT6%_0KGG~EWxTh<3Bm$wl3-{m#X?hSNBVXHbz~IGl ztZNdxD&6`u5G{Sm*J@%zTUW7&gyR=!aIGPXi(L3RO(d9tF<;B-9m;oYv8DqL#V{Fc z#{gm20y)K^hyA!h8>$$7NXU+s&VF=-kb->(;wbEn;TU~?B=8y~3+F&wYv#9*Ni#ax zcXTUR^UjiK&*S6V!iBrZjBPoA;chTQ6oH-QdBc>^*5`cO#}-brH2nPJhx!cJnDYz> zcLeST+?r8eez?>67Rd$+|A6%QUBO#c<0~mfjr0vrBPSsh%xRR#ke0n^iLG9jA=*_W zWLZB$`kkhS=!{Ymd9U8RMfiBnkQoAcfB=NY)krq%$;rOfG#w2bDZaKt#DURtJ@ipH z@J?(|iUq@9GLXK+dsS;RP@njf!2bVfe;7xEhA3Vk9b87d%bF94*IA(eOcpkJT{MeC%+*@>Gx{b7i`&D$&Bn zaC>&E#mxYub`zTFCRF$l2oVXqh$b8kyvS5Q+}JduQJ|WV+oN?%{58ydxCi-e>}+o% zYOR=~p(U>euMH@Z!{FuX!1Z|IOXvRsA||yJJ*4{Djs&m;>L~02|G9`W`NOUw)l?Ha{6!rQieFtp`4AGwc*SCkJk zE;d@j!*IhkmZ9N;i8s|=YF{DD1jKY8@SViX@CZiF&_WzLqzCSd1fH3OaYA$_u-Ikb zLsPnu;BCFaXM&OG-9fto-A+EzFZ~dnQFoF9kG1p-@?Fn7iUhio16#4x;k&NNL?GS0 zFiGjAjt}oZ^=n3rXioJ-SwkRHv)GZqX4A)j9P`*+OBm<`VN$x;Vv~UeDR!tt`&e?| zMbuy{0wxE#F}RS@K&qr-KNA~?>~2}zjlPK)6$w0$rVwQ~@Blz)!X4pUybo1~=n-wp zb2y2;%>y+cgp97hI|ze7?*t=hcVL{#SwW<@FF56uaN9zbW1A#hVC)i5jbV%6bqrs8 z2X}l7^?Wka-aPy+!tY}Iz5wn!{DuHN48LRWqo1kfw;c8?{Q9tN$RF2oGw>UYpN;!I z+jn%1-JdLO-+{6;V;Z&!tcw-yM85*wv zXLzjl1TnoH`&2Oe8U)w^hA3j)MH2LO(wAf$a)xfC+0Otw>?()gOp# z7(lm<0tT$m+N4X36mJZ_(X!nW4s8sU;aU5Xy%b!uRJ%z+Dk9m`6=01*GS^KDwELpd z(XBa(YZH{#x?n`>iEx|Dvm*h66;*Zv`oa$DHMB9LKxXDG@`)|TqqW+`>pwIxVdegRRj-tp{6Vu>*RIS|->fNUh>9|C8aU(QxZ!34lXrd_)EnUuWCu%}8Nq zu&fxuPedb?6#}dIN6et8q#_wQD$HM75d31NNyot;CcRoAb+s)3RkBAQwpLkx@U?sk z?Hw`5NM5uDB#zEM#a*PRUM^Wb8DV{ExYUeho2$DfA=xcAb{T0-hKgDrf9Y154S(S_ zKd_O&M$uXu`PhvUxTSM^q;Ny{`Ie_V;o=R!vcCtneVh{X>~UD(S-kOFc>Q-nM23Y^ zV;nD9*CK9{r7U7bE`^CK5-DZct3gv^T4HD}Qh8#0##jPt4uN$d`?}axHiI$_fX#Z< z)p{hpnoWFXq$mSjwlwZYaVvFc0efSt!T$-}MKI#M?i^b94-Lz&_fgPbcsIJhSJ9Sy z2Um8yjEK2k#vgBX9s$v56YuCdJ^xOauRy&)WgSSzvXKr{q7ZARb;odIke+`gs#u}k zxeqD*-uYLN-B&`p^`M!Vu97p`!cNFxxploIx*koFa-e9jY9RA(ghKXM=R*$6bYgdk zhX8y#(-OV*vepowxuFc9B)FQ;noexg`wDZGqZrX6Q7;c?(Y=*)Oit|ji|8Nl}#*bf+4D)>w@xdr2`dV*WTo-xnNZ?E3X7J>4;e=aS? zf583+b5yA(d6A-&JQ>_|u-d?hE@}N0(snS%il#ivQIhUO^o{_#oy}c=cA(KUh&s=U zNQm64cd>uSl_ixN2E)KEQn=2vsda2qkrX6O>+XoL_#tnsKx-G)y}H^MJ^M9EWY(QF zVZ1555pWxD+@Ql3?ShhXbslKEX2jcyZlc-x4HxE2H`4Mr^{~@TtV<5Gy1I$>Bn)w3=95_W)MC)>f;M{WB6I`w;ktTRE@$!Uxrme*T4QN-94);)pg5M0q6 zu%Bc3_*z~=tad-waz&IWK7RlTNkYrfdxowy^|)5|*vx9#K0Xp?$8aqdiZU-8XfG)1 z&PSpPJTF$Ybg^mr9o=(dik(lKlDG)FKlfoUcq=|8P%j&HuzBL&4!+W5+OF_wSuDcV> zQ^mGIz0pUi+XpF*j~k7Tp}sZ8I6TA$x#gtT>}bcTjpuZi=bRMBH=p7X&fV5dm(d-~`K zY!Rf?Tx3dTs_4LN7WSRZ)W2o2-*>H8<72cxvx2v*-i&mOBo9)x*aF#NkJ4hJ8Reuyf=%$UDJU!L?=gU08|gGF6`&qq zH5`49go;dt1+U0XoKOg{eR9pQWpzhxCcf^9%wZl2vU`Hqc1%Be+ancgwTtk&A0o`-+Q?zlitAT~h_NHt3F zi2>Y(I13Y6hAY4=F}Ajxco1}&;pZ?=nBD>9lzAXLq=Qz9vp_{b?#0~*nyPo7Oe}Gh zcnvV28vY&O1|;k>ozt6Xui5GiOy*T&*sDxLH1bTDE53Y?YfZxqTWL#iF(fG zOuKI7O20HlBd)GlGQ-a>2|x>DOQjZ(7FJ{&EU?(jxF>0-!pm;5;{8Xq4|R|`Altnp z)AIg6G79}m+KmB%c3*hFON5;%mh;fIflaS~TLpI=KlW z8Q!9?7^qQqfsSc{2?LzrgU}|76eGst^ohF2bud7wx}pO*$ma7EsD=-yhR;C`ACZ?@ z8M3o7Vf>HXn1aY~oQ+Pwv(!+0L1=}l^n!3vMlk$ret2JD`02cGcYb7Qexw0sCFbFz z=~?)E%nW~Fg`4w!SJ!{M)K^zPjLU09pLETkD&#e=8e!B1mXM%!38gR`~Q)n4C{m`mQ7Z`wg+*K2y(Y-ahl~tI`=BpEB${rm_Qc0BN-6r1l;H{JBW#LhFp5|FOH0Kr3{PAL%OX_LfOSuXBzQX{IYyuGLMJ>evF6u9Q z2O@9uc$fvFb6_qQT?F&O(Tic0kFJM#-{@xT?Saw4#CO$Wqc;H)V=viZxCFz~M+d|5 z4Bvv$C@s7!RlrBA3izd~{K#c^d9MKny5`|v%(~Gmn*4B20l*%B*2pg?%`=o{Itv3I zz#K&d;#+eQOuI04qA>J+C-R~h1eC`hfH~OE&~}7Y9`H{X{F90Jpm<<;)RLgS^j#_T z+b8RAZ`Y;+M0wzJe(#Z$9iU5jz(#o-1U$+EJS3d8mXqNBlX-|*-hc-1YHTY?Z@=>w zTvx|P7q7*3{tI)qaNr}~8fjL{DYNsUr~3N+F78COr1 z$fh6ZX|dAKb@*D(ARjWrK)1#6g#)koT937Hu{D6u8SIf|2;Gu*vuldg!srSJOuD_~ z+utp3^~5j|!CEU8G<<8$B#Wr`I^l$+1G}R^XsW^()|$u(s$0dN_6c*_)hrb6MvJiJ z(?>{T4`ojzHzgdfaM&cxcf(W7yKt)EspNnqC@aMm)uLMLq%fG@){_j~z@r)QA^f7J z?}To@3BP;six`_Qe^=pW&qwrHx@(sj>FPnD^tm^=EmRw2udTNNcJ}YdJ7gCsQp2PvojNDq*3NUn>qKv%3UY&kTCSD z%!vs5&7QXwk!5IzTXEh3H1;I%{cwE{=NatgO$$8Zi}q>ntUTNRe9>M@cUPiK$m|Wi zH8<01)cY?9QHXVMGbKW7JKaHfpP-Dp7FfVtt=T*DNIKSy!~>^dDStN$z;On?hX?wY zI)H`mp@BZA&=Q4kNdOwEpV{`tFi2KHyJI}yk1!~P&}I|`ilEE79Rnm(l+Dv=;XgP2 za3WBKO|r_l8$%`E!HuYw=is*<5SXv^G1EBaj13re1=}{Osu}LZpq69 zdfhTUpKaM)^k1x3b|XKnh{x7V&wQV5;!^v5tBTm{&C0;o!tx?%n3Zot&x3@cY|ct2 zU)Iw9?!w}J>9@~XnYDySk}c~y-zV!yEKz)q5p4@nKmrfS3c|=5Kq}xK1H0A(WUr6< z;@tDlcci1%=lRC2?tu~70b^MwjEXHV7Hxu2+ySGo8HTJO`o_wBj&JOPMJPd3f;&;| zL|e$hPvVwILAZ_OUJ#CEisv@2?AVK<2VVV*at{IPl@cJ_mH}5+8=paD^#tB<;5uq5 zuq}_%gu*#hlXW~flQHyWP@7Q%n1~hvEnWCYV{hXG&&8R0YEf3rh)|}r5%xuE;n~Ek zn}1X$h7o%=P3fp8+W^T*=DP?8D#?VA@qVVDY`tU}l%398>KDo7h?Ivonba6R8Huoy87Lx$o3Trz zOLM(&ibPqfxP-^T$F%F{$&3xtuJu78cnD!PnE2XeLyU-qGo`}%GNtl>W@q2{w%V-ARkU;#h)dzQ@73&T5N-=b3gj}rWUb3uJi`Y{Kdht-K0 znK;|M@C)A|c+?&yrrj_Xj1I!QaCA{Y6cc9at#7DX@t`eK0!)mx7CzlSW*ycw`^Q`- zW`~$R74rr$ZxnNbn74?zQOuuf#pP0Pa(LZL3n762Z@;~<`6N5 ziaAWobTJPVbGVp?iJ2khkz$S%^M_*k#XLsL(PADaW~P`Yh|+d1s>%qxLue(TR|$0x>Lzp- zp(hAEPUrzbeZ;!o;&`m;B|^IheNJd6p+hmOioHZ=G@)k*O(XOOp&~+C2$d1~6`_@cHWG>u z`Y9pKNMr4UeoyF1LN62Iee$ZW2=NQyRlY%hc+b3QG@)||O(9f3sE821ic(chXfmPY zgia>ZL5Sx~tL`LpB%y~0r4xFN&>%u@6Z#g@)2hD_`ht)b6SSB`=mYXgys|Cefp|OLJtvIN$5U8>j?dV&?Z6~2>pT3b%eSJwG#S(&}D?aB2-W4P)t~3 zm4r?tbRnT^Lh}gmvj(vsp(TXQAQU1rkx+!t354z-Goe2d`Z=L53Ee>G z2Uui`ttB*xP&1*qgm`MWs*F$#p%sLd5W1ewLPEC_nnP#{p*%v{3Gw7{)!T%|6Z(wM zafJBlSZpMrBM2QzXgr}*LbC|*By&{>p|1#CO6XHU7H|W1 z2=SC<>|;W_j1hZ>&_qJ75^7-%brbq2p(hC4N$3GWe;{-(p#0k9r8U*%{=$l7bq%Zh zbxSU;C~H#H2D?mS8!Af6{iRL*((>|#ipIw5G4%s|tZ1lis`#(Hl$Mnt>;ONxOB$OR zO3Rvb^lDD1rlzQ_y0)pJA<)oJ*P!Y{O(k$nR!b`kKupL%X-Hz%{wS)3G*WvItOgmr zw4tGNRY_fCoOL25!B0Fg$CEo&2Pra1M2RRZhl6toGyrGPdg>%Qv4HH<8YBY)bkYmh zPOyVEew-wOkdPkDg8AvhuTcrU43`9N39%0dykEi{c^r>!!3H8t+E1HcryY=;c7tSa zfKJ*0+i7>u#*dSB5E4?QStKM%qY``>E(zWeVt1t1f%i+hBah?JE!aS$NjpY@j1epW z*=aXO1_$V*9k88t2W|W~X$K)8RhmUYqT+ES$b^sy-V$PWeCojarQMOo@#q$8Ad(W+ z)YUGP2nCRoJE)LAI^6ZXGx= z;TktE_%fHTrxQB$4#?cAMjiVEMySOHJ zci{&VZ=6wLPQ~#90=QTuhHw!mQ)NwEDSI)>VZ#nSjy2UmeCRr&!GvVl;S+b|lDaBNKSr$N}=&=)}rkW61&I-fHxFjKP4!E?L!7(I`j_ zNq7zF7&M$9LOeJFsKopC3?IaXuEk&a08p^?~y0)>NGqA>*>aq%T>I5~bw7P~u z*7+qOT`D2Jt`n92uE!;KQ@5tNsR?cNRLBG7WZ>8F*H$#GsB5@H9Xoy2to*4u ziBreayQY42yya&=OQ9?9*M^oYLE)fCN*k7jmQ~a?HTpBhl=~~|8vJ9*#~NQYO&5bd zvtlLFiO5S)m+DYwYyI`54W-K}P|#ylaYAW21Z7WG9gMJ>ig;L;YfGD|msg;UFDtDt zXE*NFpR8?0l&8iMO8mi07D{3J; zQGT~av@ukgvbu%_WT%q?#J{SxbXj#-LG_Y`(uP%PzRry~l0!DKuD+sH)s!|il^_Pp zw$Vw$8w81%Z3+CqL*?#i^1%U+t?V6Q8Z~g)e<^=*pGxFycZ-s%v8G(74LTvt=*(HU! z^Uv0p0`OjtKX;A`m0M7tT{G)KP+e3*Os2m^X9N^L6$;)~Qgna)LtNHI>#P|7|}y%luN;%B#!#w$Db@)Ub+* zo|;gy)gcj8TUUG1vbypRYG+OkO4k$(b3X2GMOAfKm48L4>8_}_QEKJNE-z91Gfmd# z*H+d!6mekfD^$~@8?h)L0UOnXQ&kyTdaX2-3h2W|CFy1de_)NJ)r3vc%1LWR(H}M; zcSgRS{XsQ)&vJ)VVyVXI#kH5z)~%@ZLvvFfp+OgvHZ}zW(rz)c)tHk{%PK$zR=qS2 zyq9610Oi@J0t#J2xxo~c*4HCW>FM11#-*65m(`;)M6&76*1m4d<@Vsxdf(^89Zfmb zB-wUN*4WjAy$n01sZvyWz*1z!bP|IZ70miyb%wgrYjm|Dr+al80LDnVF~wDht}&2; zW1~j&Bz`PkE~~Gr!3e`&R##r3ifT%m(DN-*GtOTSD49Di58A6Bf5C!+KuG}VD|e2X zkw4o8XBHK!m6IoxU=*A`XTju>+=Besb2KF29ylMh`M)Vo^v#Mky;}XQOjo#j&EcvegBPvQ-6p6y$EH zG+K<_bL>z##`pMBPjGTvN9Q*bj2#jXsIs+{)l1Q9nBiI@#u9qWlju*za&e-Gk@de( zr{}=^jcb@!q+2PARF5jhDpO==(wt<-DAwOpSLbhpMyiqFqh`+RbB!09FkOINW1s^M zE)%?SIA+-BOz>xCW5|jL&m6>r)hazRk#T`cyc#Mns;@woRH7$0QrtRw*vU9#QP-SE zik^y3C!DO}6bA!BlpnR0nJ_uJTP92#i|YQ5UQAYU)+DnhXNF=}&X=s7v1*zqPb8m&`mbeb2*bU%~E)vY)ysoSEDy}@e~ED!xc#V z9Ba5}mzu??9`Cd!IWF+xrF#X zcW!>3T5x_*phO_{W!fpw{F%Yrc}k4pI7x%Wf(91*MZ!RX^MiBeEl~5dMV~g=z{Q#Z z0v6NkZ~%c&^J&nZO)@YodO&AuhX5#DA`LY^4$`ab&A`QRs`wTb@o-A$nz06@SG7g3 z9bzjnZT_}H_qHOB0i7t^Zl~QYn1{KLj&Qz)XB5wx6_{6&KSyKZP6N#?UXVbc+wnAz zm_J9zbLSSAFoe#{otHar_I!=89r0!&eI-{5^nwv4+jeuu%vkrNQ=yy>OtnX^tYb2v zKbO-@OaU+$uDb-91XUHb%Biegi2-L0{c)l%4Mu>tAeglT?Dd6ASMvueh=hLGUTN@? zi~ra$E1eG0H5OM0iG6(Yhw~TmXWQ6)m%s0`4Owo*6ZY_Gzw0j^4rf|if7rp7za)i| zCa%9Y-j+ZUaqdU{Qsg$Ralne>an8c^XNOKzI0NANi{p6_DE=46^H6*IFV5eVOw;22 zan{N8$Kx6NOLrvGZrjAU=)E}R)IWy7aL#w2oB72<_T)buKmO4+vEzoV$MYkVQv z6wfOQy`EA}vdQ9+NeZ_>7r-xn=kd`(12d|jYMf_lipc7j2{$fBr=$;8YT|H}+%{Y# zJp+5h2$gj82<7=D>{nrbJwl}%e7H*PIb5ZDl%bNh;z^33N2=sSN2;Wau>S`8{G*g- z^-(J6Uf3@krBa5DQpv~vP^Bz9S|wlVSL#{6NJD3)?eZrQCg*O8yPb)p@d1^1LjS^hB2O z?8;Ip|Cpqb-#8r^F&XhpMm&=d&t#Q?uU;hYz}1v}Q&sZW(^S&K)0F4!X)5KD=_>h| zY^6TSRw?_=RNlLDRLag7O8sqy@-CmLQU(VQE}&BGpQSvxvz7PB*(!NVP^rsv_ua$MaOu z;R{vr>kE}<)cJ__eC1hizDhpj0(^Jr0+n>v1uErl7b@>9i&XMOCCc+ciAoy27;!FE zp4%3yq_-BUW&G`DAHjZ#O|sFd-wNQl29=Aj}5kedlK7nSQHM*W9YS z_iRMEH!AP^+mxs2HsyWwHkES8&y~9A=gO0QyYfD@g*Lk*g9hw|Qkhf*)! zp^~g$D9_?wqR!u~)Z2Hflq>I1-ZOuVHt}oa{o>ckGxI)`)N!9mUU0uky6S%Ax$l0J zy#2Sz^S9qB^-tInx2WXnA5`kG2UW`PTb1|VKdO{>{-`|P!T#eKIKC6-zZC9SF@F2>e-OAJ4t&)y=UU_EW z)YjVPA>Rv1{rLrzH10*^`N@ka`HVlQq|5%K)S5pb4_<=2FRA3RmzBqQS$WI=zpr@7r#^Lfqs?pv%wzE zV}m^^c)VxGuQEM@cV~JI`gE*kaQz7$p;{CO^$r#vgu zJ?TRSr*=Ta{RjV_eE9#eJ{)E0;b_!O>9?Q2+qCR@la3rZ$bW58(%D1cV|&u0W*EZy znup&RPvV0VuvOCFVLkAF7{Ckhs{tNO#Nd;H!%`201Bz4?b-F{4&pP~?ft?83=JS2+ zfnx~Dm$RLtkN*D2G86zJcUbzhNi)+1CCz9{X-&Q^a8%zdaLfT);|-{@K{~8v6lbKVj@{W4~(bcZ~h9vG*8zpRrSl zHQ!;z&M@{d#y-*5lZ>5X?6Zu$z}OcVyUN%N#=gSX*BZOS*tZz_E*oE@<+#PzcNzPB zV{bL~Q^tPL*l!rS$Jn15`zvFAXYAB-H2*`5J<{068GF33ry4uY*mI1%(AZ0iU1RL! z#%?zDT4Uc}?4KKZv$20~?8l6~-Pk*f{g$ymGWKW2?lX4MJe`iA#y-s0eq*0t?1{!c z!`MM%&olOg#;!DWy|FJdcB`?kGxi2!|H9b!8T%n)cN+V7W4~tX_l#{B`wL@#YwSVu zb$Zf`eWbBR8~bEqPd4@pV;30vTw^ab_Ql3-GWM0mZa4N%jlI#>zcTg~V?Sc-XN>)l zv3DAKm$7#n`)gw>)1HPHd$_TGXzWa5PcZg$W6v^nk+FYl>~dq*8hfR&uQB#IW8ZJu z&sJkUW$YJ?UB5=>?@D7g8@t`u9md{Z>`lhrZ0s$@-fHYlV|N>Shp~4W+m7$wwJj5_ z$Jj+7EpM~2w-~#}*y+nPJ=54Z#+l)PCv3CE~*uGNj-em0WjNP(C<3BR?Rb|@U zW9*B|wfh5OUs0jme=~M_rFOq-?1f9U`!~iOQ>ERl#!jx*?(>ZO=*8MS26IRLg+sD``|rOi-~V*~cEauUXS?loXuAitM;rei`#(AGpB(s44*Vwv{*wd$ zJ9FTWA7#uN-|1O=muF^uI{sxW9zVW0xjwZ%6^rlqJ0z#1VM$5ZtkRmsikWgC;hak| zI}EaVB~HaD+r>)|wxduV+B2j%)ipY-anIHFQH_gx?{+wIuE0>t@mAwn&=4{rXavsL zEY-*0j61NhtfF2{>lwr>oYt)|tSj<)Iz7REL0xHi0%A@b&Ytau;gQ_|$fo>d^$DnX zrL{{d5-}kh99))&n_q#`snt!Z5GB^5^NuDPL8ClfF%%B_&IE7QaC?TZY*0>Cm<2Qp+QJmdFu<4t41s z?XHmXgmCw1H%@Sr;YI->Qb0B*>B#GG>Z7UB#bUQAnX(Z_mtu25eE*mHt{?@5SAc9wT8Zj&ibY*o-D%&ew>aduV`#)sFNuA z_9ODRKe;p~4-D3bBQdOe>eBZ8Xe&x}s17#;XO7IFPsyeYZrUXkC<-|bOop4>q-CL| zij{65H}6lirQEVVNe=RY=hpp6p<0{R=_c}sq&~bVa&{+c6@laEB{-T#`F6NaIHQ8? zFCcfiki0HYR$5<5e2)uXkGponSq3M^ZA+Ho^nY!MaNd(Z;IU+S?=x7|u@W5FLd6HR zImPI%stTUCMk^z>-NsUvO^~DEz;?K?xY$uu!JF^pI?@dZL_5f)M6BEg(TBbm&1Rcg zhm&9^9h|el=>`zCBoI*ML~cz$B7=$Sw2{k845r&)%AwXu^qu~a%ba$#!=_4PB{&gL z+DJY-2jWqxB|LvkV$T3#6HXoiZ6%`RtQn4SQKf*oX8@IHB)%^Zug?^d(CpPkq4S}{ zoahFj{Xhf}POEX0%mIBkqHIVcLq9FY*>5NbDs4u+DbYhCPOa5cG}YC*ylggJDsX$K zK`O}>8?&;kgmo1PfV{T4&<&;4jpDb{AaQ27k4OeY?y!-_d6XGZI}=gM ziR&@ArDZt$f*U(PS&1lIyeyMrUsAez;zYShwgiXOsw)~$SS}scXM3utTT)ts6OiV{ z2bebx(nW*gXjOPRprVp7wkIG>?dxzOYwGGQ(T#nB8*S3M$>6HXCm21x*~ZkC)r87X zKxTY^2H{YsRdjQ3P)!qftqBr!#!=Ag6Nu`zQOiqAGujcy7@2oEn9>G!E9`OOO=!!F zGvW6bTulwimO~v>a)W|%LirLY$L7I04~a5WpxuSih27!C@NPVKZE)e_A}(;7+&CR{ za{|hQ-C~f?1Nx+>t(dmD2u2}yx=_`P&~I8%;jIkG$VBQTJQAoWI}F9C>^p6QK4!_# zJr1g|3`b3Yu@W#+R(s;8diJSJb@bS0u)N||Qd6t-YHC1YIT9dtlM8Dq>gGgLNttQsTL$2fUrp7bFt@rWyk4O-LuVWd z0re4MM%jG;yc5Ze0}**~69ISHv{k55qR4s-rm2)E;xMnlRxQ?nNlrw2Y`PiMu$$!N zo|2`@CCB@|hmJGOwwLCEbfMS-BWEnqZV0Ttc4O_Zajs^w!N&38rc3#5GWZpxx{x*- zw;A(7KL{eUWK~HcR2pKDI=j`uu8fZ?JL5=u$k-i6@%XtOFYFkIlsdXIjz#L|SI|8~ zqYo!XeQ%59V;L+*RwZcna`k|OJr1D}cLa&)Gnlx_Y#xHaBFfLS&UWK;M#LQk(Nu>6 z*WmE~w09<8Rut#@?^$Hul&F}f83;iT9d^Yf3W5kmM-(&|m&2Kv1B?zc<17f8C?qbZ zMA5jQs3Fk=G@=+aViFY2PtauR|BC3IE>X|X(H8~2`+iD&qPGesMei3@)}}b#$z8rjmlidoXJt~+l|^Hs zyNV9VG_nupYei$De-w|4mTnafP4WR<(@w|M`;pqNwqDmx8_BF=bW^)Squbg|jPC3( zO^1o5qPIIuj+S(G-9WWRY4pd=WzkQ&u-B*$_K#hn!sHY~R~E)Ye4j3iic-;vLVw5k z?$(FZHAEk69Tkm9%T>ynLVv6E*Fu-k#|n$0xzfWfx=%OK&n_zTG5ibiFSag@=E-N5 zilZlV3;%Kqh7Dp@2((RqHjS45qFu+uFMsX^- zp*SiklWU7BipS|d#NQOV9K9gla9Mq}+W%y}Zl98ER5aRE{fE5eqs3!nNYiLP;xT$! z1e=`c7e73eIcivU;Hu z=E|!zwa@)ZxA*;8x4)1t@)bvGp3v>ZPwMvLr*!+PXI+kT_?yNNJB^|h=-u|Biq32Alew~IR4BV4PUf%N!4)lQUmU&n zvPOK_s}fvsW3;-x8;BV_&}Dk`+pZPSKe|SR@hG$Cnf8*XRP;sn;^_7_3JX%1n#$p4gej?fjmT+%Oj7ba78NWXrfL=_x6FP~*nP;%Hvy zy6EiA#nGSMR9C%ay|{C2U37&wJu6Of{Jo_f{$%S4>$c8Xxx%LM}>XWn7`9Cf6Pz z=g8=$F4?)(Ch=M+x<<{rcO734}6vZFA`$qEpu0AEH=uVkj zbHig|5Pi`#DxO{&{i2(UhM6t4pLg?`d%B-oRU^Df0$lY%9Ml7f>tp<@gbd-@ZeH+= zIHjUzx<%*8pQ@S~xzGJqw+6YvJ42JUL6f#&V;sQa;<#qBI{xMp-M%5)ILK>|hIchc z4dSNm(QP7l?K3r9@wslB{dV3~>T=R*c(r@{w+)Z?b{O5;M)h6{2Z&)|=gS?nN5;e79Zbwu{_$iQ6u7+jV}sSP~*v9b+ba+^_H9`yaml z?tORfdr9Gw1!ojKQLwEnbi1o?apBE{mlr18E)lm26K?kx{-W^rvRb?Q3$HA^zwj)$ z?cVq2g)d6j8rOw|>+x?v;S2KbmxZqvEHAjZc-wOdE-ZSmV12>B(Yu^B?WlPLM>b_H zEvP)VVCsbh$Ddh{UR;nqx8UT(1t%>oIP%mZXQxh|eDbD(6Lvf%v$Ej$y9)aC={DfG zqTMDuSh&1kb7<}4}o%&4uY0;>Sg_jqHYG4-DX z$9>kJPd^!RoIZF+r@s{*-tiAb8w$rQE$lOPZ13YQFW7C)>Vnq__8PVQ)Ngcsq~PGu zPZU-BrFh6SMdwTS#~roXcMn}%G;sGT3U}$Y*R2IhJMR8^@yi8|7WA20*yrkk6D}(p zyxZIDE-CtJ@eg-zYPhCgbji*?FR1x#!Q`a{C1aNq4w%yWz~u$|cD=1&>H`IR`t&aO zwB7EHckDN)v`?Rf1*d*mkh-GaqkZ=>zX^xEm&B%u*0f?xm}hO zt}h(-dBM0*bBjjJ-D=dTg1Qau=eCy(Nq=+UGsgJeqoe~Zy27~o zirWJIv+y(-a`V&P=enLc+IvNUjCAacE+gc(uVMY$SJpA=DT{KMY%HsO4D=JBCsQv& zJ={XQWz}B_eKquC>QCvJ)LT}4j{)BQZ0O0Q_Vm2k6Pv+xRs7mQ}y)u0Dc?p(j&s<5Rt5)lY_gJ@jPiWvG%{ zlvQt8_4A;A8+tPJw!BquS@pk$zDPQfYyBfrZ{y1q|6|Z^4?UTB8(*&YKY)H$=*iS? ztAAwCAJtpd^mpFPc}HWRC#${2{iOGf^_Eq?0s7;iCsXe};45J$Yy6f~|1t__4)kQ| zp9tc&tooIu-r!>B$<)hkb&ImbZ&~$!g?Mg5&mtoF3dIEZ~+N*wu{*gt0RBu`J`t1l^nxQAF zz3O++KeFhL>Mg7Oq!G?L>LTCD)ApCF_NuqXyXq~g{w(MRKu^wBzZm)hp(p37Ujcmu z^yGZ?_d`DydNTEG9e>;H;mhwL=*iT#b^IL({k71Osc$R(-#~vm^knMWivJbp{{lUk z`nHb0ZT9r}Uk^Q*daXmcC~N((to3IP=--B(OnqDNS3uux2VZ~5)Z6%S#eX*R--Mn_ zy*=JlZ&}lS|45g;Xaw|R>h1M{>Mg7O*}c4eBJ^bH?eVU9%c}3ZkJnd2Po{or{UeM1 zsNS;bcSLXQ`OuTqKA+=%2=u>(o}90K9Q5}Cq)$b4eZ0O0{L06m%dw&G7ge;4#*>f1X07C`?f^knL_4(g&@CL7CIe^x;M z59rC%w-x^j(0>R$nR**vuJ{WMbjgc4?da=2nR^ZzpRWa`^G{*HitGxTKY+dBR(gkI(! za@P-J>f5UScR}9=dNTEG)&G~E-xGQ=_3}8{E&8MT-?Hxi_rLG`CqqwGdyV@=?;Y1a z%c_6s5N~i2^knL7ebe|YtNwN97eY_YS05ef=ew)X#v&=>6N>tD=LEULBl3tIk`wfx^H^X0cQ^kl}r-h0RU-?Hl0 z9_9`9fu2mg-QOC&W!1j|{SToh=d1r1`q|Kvsc&ole}AG+{{raA)VH<&&xL*o^knMW z+W)sh|9j}k)VH<&pM(A(=*iS~(Lb{2kCwk>E&o?hKpUYatG&kkf~>kwZ&~%LkMRCm zecRVRGWB+UYy6f~{|xkfp(p37e-ruxpeIw`TmQ(SKN`PfjlcV3=N%mhJz4EF|F3)R zSZ`VNA45L_dNTFP1HEO{FFn#5oB}bPkRln{BUcUf(GWE8+%f!*L>Ni3E z3+TzzpA)3tvg&6|@dmd*Pp1At{UeM1X#AE{-~NZrJ9-3qvf69;Kj^(YIZ2EvugMWSj{-nfgqix2$^3uW<$RWa=*s^p;i6 zc{y%^o=kmZptr30?@sjw_d`#n{@g%sS@kzT{~YvW>fs%izh%{P{*Y$q$<$vM`9--* zHkMV-c}KSD?T;U_+V_?9crTCRx2$^3SMn|B$<&`2=q;h0qvi{2 z;SqV>Th{nF56=kb$<(I; zy=B#N{+`32CsTiVptr1g&ihjZJ(+r3p2f$%Wz}=Opt;bKskimDOdKt%{%=)2ftNu~ zrhZe9e#@%oJVn<-Pp1BaKyO*~oZn~_^knMgv4&feHT{-V&v}uaf}TwMF@fH)>N%g% zYtWOax92;JpZvMlmmqBY+2K1;)UQhv&A_}$gTZy+QDDy3bU1h+{L8_dzo`+t0{&-$ zIiJ&I;I;5y2Il-ue*ibb|1V(9_w*c?^FF-^=KN0ua`Msqa2}}b!JH3jS1{*=+850E zp$-wY<&#nWu5!M^yk0*CF9Tl;9?K4VJL~VP~zJYTsIY7$EkxJ`5GkRUalJJ(nXrWTxji{UeM1Xn9!H{0ypd-q8)v zlht19({A27)>~HnG0@)$J(>Cmf!?y}uZ8|m=*h8O|Hz_0n*IrfRlf-r7%xLlRx?fi za#?jzR=s7_Us3P8qfenHQ@>jO$f7^0x2*c(8=ZI5Np2LiK9JR3<41Lk^_Ert5cJ=K zo=m+hFOA=_>c4>-q+OsVQ*ZD8RBu`JCqO>}dNTFsZWX8Bvg)sb{y^x-)PK(xPpr4B z`e&g(0(vs_zX~>#|V%wSJMAzq$_IUs>~KS<7ehY2JS+ z^knMC>mOP4NA;FfKWeV}M$s+Mlht19x4phsy=B$kJXeflxet0W^>Wy`MOpQhRsZx{ z@BbY1Wa>wF?>POIRo`WvH+UC%GWFd9y=B#Z3;ON@eEE~9-?q>PpseY)top$}_5R<1 zo=m+|Ik!-6S@qw8egyPn>dy}JB->7lC_#SAu(i zRn=PkUN82xe!n5C_4|xqJjH6{Z_2K|e96q;elB&{`e|9qr|=AKPzybodVBw&`^U2C zkAnV8=*iS?AH;82^)sQr3VJg27X|ghvg*G$%SZ4#=*iTJvs;uk{gzcf06YB8(37d} z6zDChei-yGLQkgN=2znPIf{1|LFCrv3-|M;84llZ|E7U+^>M9d+K_ zmmgW}`^tKY_m1_JRe!+w-r$?ilc^sZ=q;YJh82YNE~_W4Db zI9gVH7aTy7peIvr+Z)weR{eI+r=cfP-#f@Zxkl{u`mMu!wUp>;9c8t1il#zo`ncC~N)}LBB((*OS#>^*_}=vgnWMEvx=p z7dr2#KlEg^SN$mO9qTQt{ut=@fu2nL4E-aE{%HJ`Re#?_&O4d}Jz4EF{vCqzn`PBM zf3erkfSyeKTi!d4-?Hi-y2Km&7+U=*iTJvs;uke#@$Fx5)ed19~#` zQmx%Wy=B!8gZ>lf$<)hbKtgX>^~XWqX^`aCF!g%{ddsT66#5;YCsTiPptr30x1jG2 zJ(>C$f!?y}e{i`s7zsU@`o;Q37X2xcjb+upbA|JcCO}VCd)@!GJy*SD)%RKK^~XX_ zrhc3D-d|bumQ_FeSKfan^knJ}@ZNFyEvtSO^k+d&rXGiPthcQCPS^MdE`gp*y}e)4 z^jlW_{?K0wJ(>EcLHfzJhcm-JFZ>@g4FZQ;66%5N=zs6th z6M3TeYyQY>Gy?p=CE!RL#re1ct zTa?RWV_Efe(BA?*nfgwFo_xR9>;7Ds=l*y??Ct(|Q8?G}ehSia$Z)?u$V`vsK^Ohe z|CTjBYi@AfQ91NvweKtI;odveTUPxJ%e_GZ^knKg271e??*si=(37eEgZ`04e>Cmn zE5%;V2TRc2-=Hkzy9(v|BzO(@bMRX5069^q{W|bu@CLBP*V^$iTkP%rIa4^-{(1gJ zO}*TwiN78%WDQ@-cdGu8MSnDZmbHBLUE#c=_Ir3eS?yIn&U?pt%c}ng^u3@bQ!mr5 zxJ7?7e#@%A?q=^l5PGuOYy7tTRlQ}^KLq{$(37bj>w}NeZ&~%-f9DMjhn}3TeiHN< z=*iUg4&o=*i+u_F^yeI5tuGr>J7FT>GMyfes!R?tokRQ|1R`o>R$`=mQ{b( zZQfuX=*iUY73eLi{zK@$4?UUsQGuR3MeMbH_CkG{CtLzs{ZV~u^=q-%+xm6AaIX5r z?`v)^3D^2XX8IVVa+z+h=wHnr?fY#(zrC?ny=B$&yPkVMPuB3YeoqbbmaYEaE$AVS z>$hdAulz6SZ~VOv@nq=9O#e3!p|a-Rvc`We^b4UUQ!iD(E!109{Ugw?fSyeKBZ1zs z>aV`t8$1X-nfikRy=B#JgkHz}YyBZpKRVEpH;KL0?-I6`dwcE=?gbu9e+j3x`aW3f zZGGQII9Giiu+k^!TJhKPl9}Eo^p7n1Qzjeo9hx4wK3Re56ZLN`Jr4%yc^v6EGkD+j z*&P~N6z#K*PY+qc*ZNfeF>Zs^I>+w-Z$Z&~#_ z-{T{A2zoO0(yhuZ%Br`l`Z4!-|8>xl)n3c*Q12b5-?Hi#LjN-KWa?MzA6fKA2UYOnDR^xm=Fvg%KVKH6984O72+ptr308=&tAJ(>D%>K|G3N7HXv^?zRN zyrZ3n*E(6ZE@5Po}TUf~y=B$^ z3HnXYlc_&3XwNOHewV-c_@n)N`pMM43~yzP-?HjE|IHipf}TwMqk-PC>YswM8 z`bOx<)SnROEvvpi3UnUyWa_uqKeFhLrr)ya_kYZJN9RLNR{OrP4))%$-m>azp}z`x zGWGWSqw!l-{bJ~Eg`Q0PNku*Z%Br`l`Yum-|Gz>{rv4KBBa8m1-m>a{`Ly$nHb75S zd(Ho$!SQ2R^>04o_3uJYrv8WCJC5J7>c>Cp4chJRk3TZ?_ITIyTULD&^gBRLroJhN z-?HjogMK&Y$<#LlddsRm?m2HT8hSGI*93aYs*j%c29u#DQ$IS;TUPyO=+n@XsV@oi zmQ|mIz6N?S^*aZ8%c?&e`kz2grvB%F-m>bqdBGc820fYjnm}(^^>d;B4fJH{@pw3{ zf0k80aJ`SZVCHP42D)4FGHQ=S-wcr)tb>K(A8^G^_H-f))fKN{|cr17`_ylmYpdixa zB5((=y0&(`wNmUWozia}7S46ObuRYzeq(%lN!IZD%39*1kMyTZHkP%%T)#m)WH}ak zvf8VDfO^V8y=B!uzQK7%CqPf8ev0>w^_EpX@I`NM3iM>^dk1>Usz2mKZ?FJ*vUs`l z9~kH@tNudhuY#UT{qjI>S@rw9 zkp|^5*;rQnmC$d1o=p7%f!?y}D_-^n&Crvn?-S@PtNu*rKZTy0uYM`?-J~LF`H`vb z9mH>0<6i@PFX+kCmjrrpAF=0uHQ86#JwME|ex$^{QiWJ*gmcx8jY!{f;_vSNz)atd zihKadWwNoX`K#RM{ojM0O#SYNpL)xxzYzM)^5Re9CsY4;aWa0(F8)p4zc2KaVCwq? z@mp5?xv<|0dNTEc0=;F`-vRw0(37bz4fK{(|0?vA(37dR^|?$OEvvrcn?8b*p(p37 z9|--q(37cO7^L5_#{Wm?uY{gV{i%W8vg-GE%NyJXJ(>DX1HEO{4{i1a_d-vmJ{9OK ztNudhpMsuD{S|@Uvg!xE?G0Xqo=p8mf!?y}`@Z81HbYOQ{=`6US@jn{-{T;E{E(@? zx6lWmTqYaKsz3aF@4qYbWa0=;F`{|fra(3A7kuYvwV=*ju& z--P~j=*iTt3DR#_)BpPqyuszrld10==q;=MY3Of&o=p9&f!?y}3qJG)tDq-SFOQks zqFg2$@)KfT;=SDVoq)F+pY-1+;8eh82D~ibdxZ7;)gR}tP2j=c9VdAIk>KxxM}bcP zj|cw}JP~|9cnVnaTd5l?;du9V#NM7CKM~G#e%u%3TYj)VzQ`JMUs>(_w3e@B-9JBs z{$%LM)SrO#DXZSH>Q_U54)kQ|djxvRs(%9dE1)M+-z(5tR{a~$FNdB?eWyTAzFX{d ze^1SGf25&b2>2KzjE5zTY2Yrl+6&kwt&BJS}T}c0>bwDD-5t*Zp~kth!Kd zS@kzVKNWg1^^?3j)>~G6@yFiaBD}f!?y}UxWTm=*iSC z2=ta!KdZZ1O201X$<+TW&|6l0Q4gZ3nyMaf7 zw+D{`4*-t`@1rco*9;tAW5IRcBfzu4v%qt~SAyq*?*%Ue{|meb+~ZIm-xBbi;AP(lX0Ivc+4qgNP7`ztTyUfS84m=*b0bC2-2)-2D489Y*8T>Lh`kCKq*8osta%Yyqw%X<7gj0uUK zhn`IR5D7yUNIr1ZAf` zUkGb?O+|UB-lnh9k-qN_zmNDWFu!-W8<^iO{2rL!BRmYu?+d2E{9a%qcpgsBXMy=W zzbnA}KHqXMzqj`QnBUKP5zO!5eG2CH?Y5VWK;0yh{9fHKFuy-n2IlwVP6U5g>I>~` zFu(V9Irz9i-v75?evj=gFu$+%D45?%dj)*-V6Wc{=J(9H{=lb~-zV!0=J&?-1@rr1 zKLGQ4U=3h?-|GS}zt?pGnBU)81LpU%{t4#yv5Kbn^zeIE+k*N1s$IbR9@XApeqZWP zFuxa-2J`z*jbMJy=^QY>&vX@--&wX$JFqHe3DBra0KX*nmAX6)=JyZY1M_Xae*ZJToUi|vV9vjP7nt+uzX0a^_@96|-+lMv zefl_m{dd5ekA5#O=a(-7bH4Z!!JPknKA7{lF9mac_WQw{Z+#t@^QXTK=6vX%ftSj8 zK$q_F;8ojy&R5}$cC|N8e}&S(7>Fz2UU59WN+?}9mhbcd-ve$EHI6PWWm4+V3+=JDX~%C9cRPxbnn zL=KQ~%BwXD;oX>Y>@Qb)8 z8Vcroy9a?ef9|nh&WGCo=KQwjf;nI9FTtFDb|ske$vy_={IG9;Ip1rM=cil*=6sVkfjNKVyique1Lk~$Bfy(Z^8SZ{IbYy0V9x({BAD~}%?5LRzO%rbZ|_nt=g+$a z%=z%H2XlVA+rgVp^Xa({JZi4z$H7m7Uk7tOq|d;d->9q9Gu@w@ujt!g&hIk>%=vlt z2XnriiD1s3QwipLI1OOVZ*vBi^VM7o=KM1^fH|McAHbX+<^eG0Q+W!^`BDA_=6oZc zgE@aluZ+(x=L6XV%=tY=f;nHu!C=n6Q3>XJ8hTu6`Eh=X^T3?{;tDY5uec7(`6%uH zbAE}xfH_~p3t-Ow@Ftk^IkcbVo@$EkYbG-T$V2-c89?bF5e*km*^TS|{AJ%qD%ah}Qo5At;)#=`!<59l>=J?Y7 zV2&5v8_e;aWnhlyJO<41iYI_M{_s>V#{-@Z=J>vA!5pu5E12W&?g4YW(_>(cUwQ@1 z@i6a#IliT6hR-j@tMmeM{E4>PT3-9F^80fT_)75J;CH~|z#P9Z3C!^rDKN)ZoB-x{ ziBrKG4{<)2;~5r#|Ge6#XDOKD4Q>W=`~cfKjt964{_M~G2$=oTUjnng`Nv@PAMa4* z%Y*&FcLcM4_h9lPK7C`r?0KU{!R*ib37GwJyPe?k$Nsk80ki+?9$@x|9RnWyywC4MF#D@kg4zFc4w(H(=Y!cl z^fEB}doH7Xy$}EQVD`s+5X}CS>%rG=@b+(j9|wO59{8g7?{=ckFZ-)~8_fP^rC|0a z+aJvSVH3dYKlKAJ`$J6!vwu?qnEjQ`1hfCq1z`3kx*W{@H!HyGPxB!CH~IXm2eZG+ z+hF!z=~(Ua%l;@kg4w@h5SaZ%MuXY^V-lGCIi`czKjTy|`&%pkv;V|ZVD^W&4b1)x zkAT@<;U8f3KlljD{scW{`uwneKwmK5_wNVh`}@Ped>@|y^Zh!{AABD=2mX8?Hy_OR zYnOxhzU*2s-+$c-=KHLB!F)fp4$SvWuY>t~`ExLz7x%33`Q`K9zF|3|^2;Qun1^Z$PUo(lhVa^0`x!TF$jf;qonZ!qTCcp`Wy zcnbJY@Ko@p;2B`%zYe@hqfhT_@Dbp-;BxSM@JZl>;LE^^z;}a}fH#7dfwyk*@vQ*w z4PFVJ0A2;I2d@Dy2CoJG8N3esHh2Sg+gU!ojo|&k&EUhpo53uf2;&P*g?|Sy%clo; zDg1kZ*MdvHFN6DoKLHO0_dMCBZzOmKcog^u@OW?ocp~^>@D%WE;Hlupz%#(_fa}1$ zW@G<@2Y}~-j{wgHmxC9A&jT+4UkY9Vz8ky@`~Y|bxEZ_>ycxU-+o`ETfh^+PlKm`i+|+9n+o0*JOjKlxDLDoqz)Qee|JbKz8F(ak1vmv>2|f$F3cMV=2K)qgE%+1gI&dF(uBGRn4d4mjjo>

XQQ)2C`uN6! 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 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem.build_complete b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem.build_complete deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem_make.out b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem_make.out deleted file mode 100644 index 95d8007..0000000 --- a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/gem_make.out +++ /dev/null @@ -1,140 +0,0 @@ -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/bin/ruby -r ./siteconf20190924-36740-x47nfw.rb extconf.rb -checking for ffi.h... no -checking for ffi.h in /usr/local/include,/usr/include/ffi... no -checking for shlwapi.h... no -checking for ruby/thread.h... yes -checking for rb_thread_blocking_region()... no -checking for rb_thread_call_with_gvl()... yes -checking for rb_thread_call_without_gvl()... yes -creating extconf.h -creating Makefile - -To see why this extension failed to compile, please check the mkmf.log which can be found here: - - /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log - -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -make "DESTDIR=" clean - -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -make "DESTDIR=" -Configuring libffi -clang: error: unsupported option '-print-multi-os-directory' -clang: error: no input files -cd "/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18" && /Applications/Xcode.app/Contents/Developer/usr/bin/make -/Applications/Xcode.app/Contents/Developer/usr/bin/make 'AR_FLAGS=' 'CC_FOR_BUILD=' 'CFLAGS=-Wall -fexceptions' 'CXXFLAGS=-g -O2' '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=' 'LIBCFLAGS=' 'LIBCFLAGS_FOR_TARGET=' 'MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make' 'MAKEINFO=/bin/sh /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing 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=g++' 'LD=ld' 'NM=/usr/bin/nm -B' '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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/prep_cif.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/types.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/raw_api.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/java_raw_api.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/closures.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffi64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c -o src/x86/unix64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S -fno-common -DPIC -o src/x86/.libs/unix64.o -/bin/sh ./libtool --tag=CC --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c -o src/x86/ffiw64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -Wall -fexceptions -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c -fno-common -DPIC -o src/x86/.libs/ffiw64.o -/bin/sh ./libtool --mode=compile xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c -o src/x86/win64.lo /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S -libtool: compile: xcrun clang -DHAVE_CONFIG_H -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -I. -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -Iinclude -I/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src -c /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S -fno-common -DPIC -o src/x86/.libs/win64.o -/bin/sh ./libtool --tag=CC --mode=link xcrun clang -Wall -fexceptions -o libffi_convenience.la src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -libtool: link: ar cru .libs/libffi_convenience.a 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/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o -libtool: link: ranlib .libs/libffi_convenience.a -libtool: link: ( cd ".libs" && rm -f "libffi_convenience.la" && ln -s "../libffi_convenience.la" "libffi_convenience.la" ) -/bin/sh ./libtool --tag=CC --mode=link xcrun clang -Wall -fexceptions -no-undefined -version-info `grep -v '^#' /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libtool-version` -o libffi.la -rpath /usr/local/lib src/prep_cif.lo src/types.lo src/raw_api.lo src/java_raw_api.lo src/closures.lo src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -libtool: link: xcrun clang -dynamiclib -o .libs/libffi.7.dylib 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/ffi64.o src/x86/.libs/unix64.o src/x86/.libs/ffiw64.o src/x86/.libs/win64.o -install_name /usr/local/lib/libffi.7.dylib -compatibility_version 9 -current_version 9.0 -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.7.dylib" "libffi.dylib") -libtool: link: ( cd ".libs" && rm -f "libffi.la" && ln -s "../libffi.la" "libffi.la" ) -compiling AbstractMemory.c -compiling ArrayType.c -compiling Buffer.c -compiling Call.c -compiling ClosurePool.c -compiling DataConverter.c -compiling DynamicLibrary.c -compiling Function.c -Function.c:951:17: warning: 'ffi_prep_closure' is deprecated [-Wdeprecated-declarations] - ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure); - ^ -/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h:339:18: note: 'ffi_prep_closure' has been explicitly marked deprecated here - __attribute__((deprecated)) - ^ -1 warning generated. -compiling FunctionInfo.c -compiling LastError.c -compiling LongDouble.c -compiling MappedType.c -compiling MemoryPointer.c -compiling MethodHandle.c -compiling Platform.c -compiling Pointer.c -compiling Struct.c -compiling StructByReference.c -compiling StructByValue.c -compiling StructLayout.c -compiling Thread.c -compiling Type.c -compiling Types.c -compiling Variadic.c -compiling ffi.c -linking shared-object ffi_c.bundle -ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame - -current directory: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c -make "DESTDIR=" install -cd "/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18" && /Applications/Xcode.app/Contents/Developer/usr/bin/make -/Applications/Xcode.app/Contents/Developer/usr/bin/make 'AR_FLAGS=' 'CC_FOR_BUILD=' 'CFLAGS=-Wall -fexceptions' 'CXXFLAGS=-g -O2' '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=' 'LIBCFLAGS=' 'LIBCFLAGS_FOR_TARGET=' 'MAKE=/Applications/Xcode.app/Contents/Developer/usr/bin/make' 'MAKEINFO=/bin/sh /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing 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=g++' 'LD=ld' 'NM=/usr/bin/nm -B' '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'. -compiling AbstractMemory.c -compiling ArrayType.c -compiling Buffer.c -compiling Call.c -compiling ClosurePool.c -compiling DataConverter.c -compiling DynamicLibrary.c -compiling Function.c -Function.c:951:17: warning: 'ffi_prep_closure' is deprecated [-Wdeprecated-declarations] - ffiStatus = ffi_prep_closure(code, &fnInfo->ffi_cif, callback_invoke, closure); - ^ -/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h:339:18: note: 'ffi_prep_closure' has been explicitly marked deprecated here - __attribute__((deprecated)) - ^ -1 warning generated. -compiling FunctionInfo.c -compiling LastError.c -compiling LongDouble.c -compiling MappedType.c -compiling MemoryPointer.c -compiling MethodHandle.c -compiling Platform.c -compiling Pointer.c -compiling Struct.c -compiling StructByReference.c -compiling StructByValue.c -compiling StructLayout.c -compiling Thread.c -compiling Type.c -compiling Types.c -compiling Variadic.c -compiling ffi.c -linking shared-object ffi_c.bundle -ld: warning: could not create compact unwind for _ffi_call_unix64: does not use RBP or RSP based frame -/usr/bin/install -c -m 0755 ffi_c.bundle ./.gem.20190924-36740-x1wmd8 diff --git a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log b/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log deleted file mode 100644 index 1fdbe02..0000000 --- a/vendor/bundle/ruby/2.3.0/extensions/universal-darwin-18/2.3.0/ffi-1.9.25/mkmf.log +++ /dev/null @@ -1,250 +0,0 @@ -"pkg-config --exists libffi" -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 -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_header: checking for ruby/thread.h... -------------------- yes - -"xcrun clang -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 -c conftest.c" -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -Undefined symbols for architecture x86_64: - "_rb_thread_blocking_region", referenced from: - _t in conftest-4e6b3e.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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -I/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.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.14.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 conftest.c -L. -L/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/lib -L. -lruby.2.3.0 -lpthread -ldl -lobjc " -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 */ - --------------------- - -extconf.h is: -/* begin */ -1: #ifndef EXTCONF_H -2: #define EXTCONF_H -3: #define HAVE_RUBY_THREAD_H 1 -4: #define HAVE_RB_THREAD_CALL_WITH_GVL 1 -5: #define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1 -6: #define HAVE_FFI_PREP_CIF_VAR 1 -7: #define USE_INTERNAL_LIBFFI 1 -8: #define RUBY_1_9 1 -9: #endif -/* end */ - 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 deleted file mode 100644 index 12cacd2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/CHANGELOG.md +++ /dev/null @@ -1,216 +0,0 @@ -# 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 deleted file mode 100644 index c2344b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Gemfile +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index ef51da2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/LICENSE.txt +++ /dev/null @@ -1,202 +0,0 @@ - - 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 deleted file mode 100644 index e01fd0e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/README.md +++ /dev/null @@ -1,121 +0,0 @@ -# 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 deleted file mode 100644 index ffdcb8c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/Rakefile +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index cdfc22418a51396f2b89cfc1afb2c892b30d7e3f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 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 deleted file mode 100644 index 33f026a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/idna/pure.rb +++ /dev/null @@ -1,677 +0,0 @@ -# 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 deleted file mode 100644 index a4fa1a7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/uri.rb +++ /dev/null @@ -1,2492 +0,0 @@ -# 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 deleted file mode 100644 index 4d28465..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/lib/addressable/version.rb +++ /dev/null @@ -1,30 +0,0 @@ -# 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 deleted file mode 100644 index 2f47ec3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/idna_spec.rb +++ /dev/null @@ -1,298 +0,0 @@ -# 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 deleted file mode 100644 index eee3f86..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/net_http_compat_spec.rb +++ /dev/null @@ -1,28 +0,0 @@ -# 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 deleted file mode 100644 index 622a4ab..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/rack_mount_compat_spec.rb +++ /dev/null @@ -1,104 +0,0 @@ -# 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 deleted file mode 100644 index 3275494..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/security_spec.rb +++ /dev/null @@ -1,57 +0,0 @@ -# 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 deleted file mode 100644 index bd8ab12..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/template_spec.rb +++ /dev/null @@ -1,1419 +0,0 @@ -# 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 deleted file mode 100644 index 9a15c28..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/addressable/uri_spec.rb +++ /dev/null @@ -1,6468 +0,0 @@ -# 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 deleted file mode 100644 index 0b53829..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/spec/spec_helper.rb +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 093ce81..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/clobber.rake +++ /dev/null @@ -1,2 +0,0 @@ -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 deleted file mode 100644 index b4052c0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/gem.rake +++ /dev/null @@ -1,91 +0,0 @@ -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 deleted file mode 100644 index 74ec2fd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/git.rake +++ /dev/null @@ -1,45 +0,0 @@ -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 deleted file mode 100644 index 41fc5c2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/metrics.rake +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index e74a6c8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/rspec.rake +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 68e4491..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/addressable-2.5.2/tasks/yard.rake +++ /dev/null @@ -1,27 +0,0 @@ -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 deleted file mode 100644 index 044fba3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Gemfile +++ /dev/null @@ -1,11 +0,0 @@ -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 deleted file mode 100644 index bac4270..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/History.markdown +++ /dev/null @@ -1,25 +0,0 @@ -## 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 deleted file mode 100644 index b3b6be9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 9cf886d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/README.markdown +++ /dev/null @@ -1,47 +0,0 @@ -# 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 deleted file mode 100644 index b7e9ed5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index a4bd0cd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/colorator.gemspec +++ /dev/null @@ -1,23 +0,0 @@ -# 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 deleted file mode 100644 index 107f6e3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator.rb +++ /dev/null @@ -1,111 +0,0 @@ -$:.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 deleted file mode 100644 index f2e0bf0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/colorator-1.1.0/lib/colorator/core_ext.rb +++ /dev/null @@ -1,9 +0,0 @@ -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/ffi-1.9.25/.gitignore b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitignore deleted file mode 100644 index 8a55281..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitignore +++ /dev/null @@ -1,22 +0,0 @@ -doc/ -bin/ -.yardoc -*.orig -nbproject/private -pkg -*.orig -*.rej -*.patch -*.diff -build -*.so -*.[oa] -core -lib/ffi/types.conf -lib/ffi_c.bundle -lib/ffi_c.so -vendor -.bundle -Gemfile.lock -types_log -*.gem diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitmodules b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitmodules deleted file mode 100644 index fd11f34..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.gitmodules +++ /dev/null @@ -1,3 +0,0 @@ -[submodule "ext/ffi_c/libffi"] - path = ext/ffi_c/libffi - url = https://github.com/libffi/libffi.git diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.travis.yml deleted file mode 100644 index f2537ef..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.travis.yml +++ /dev/null @@ -1,52 +0,0 @@ -dist: trusty -sudo: false -group: beta -language: ruby -before_install: - - gem install bundler -script: - - bundle exec rake compile || bundle exec rake compile - - bundle exec rake test -os: - - linux - - osx -rvm: - - 1.9.3 - - 2.0.0 - - 2.1 - - 2.2.8 - - 2.3.5 - - 2.4.3 - - 2.5.0 - - ruby-head - - rbx - - system -env: - - CC=gcc - - CC=clang -matrix: - allow_failures: - - rvm: system - - os: osx - rvm: 2.0.0 - - os: osx - rvm: ruby-head - - rvm: rbx - - rvm: rbx-head - - rvm: 1.9.3 - exclude: # ruby 2.4.2 needs build with xcode9 or later on osx - - os: osx - rvm: 2.4.2 - include: - - os: osx - osx_image: xcode9.1 - rvm: 2.4.2 - env: - - CC=gcc - - os: osx - osx_image: xcode9.1 - rvm: 2.4.2 - env: - - CC=clang -after_failure: - - "find build -name mkmf.log | xargs cat" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.yardopts b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.yardopts deleted file mode 100644 index 8ef32b9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/.yardopts +++ /dev/null @@ -1,5 +0,0 @@ ---title "Ruby FFI" ---charset UTF-8 ---private -lib/**/*.rb -ext/**/*.c \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md deleted file mode 100644 index 1fabe5a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/CHANGELOG.md +++ /dev/null @@ -1,74 +0,0 @@ -1.9.25 / 2018-06-03 -------------------- - -Changed: -* Revert closures via libffi. - This re-adds ClosurePool and fixes compat with SELinux enabled systems. #621 - - -1.9.24 / 2018-06-02 -------------------- - -Added: -* Added a CHANGELOG file -* Add mips64(eb) support, and mips r6 support. (#601) - -Changed: -* Update libffi to latest changes on master. -* Don't search in hardcoded /usr paths on Windows. -* Don't treat Symbol args different to Strings in ffi_lib. -* Make sure size_t is defined in Thread.c. Fixes #609 - - -1.9.23 / 2018-02-25 -------------------- - -Changed: -* Fix unnecessary rebuild of configure in darwin multi arch. Fixes #605 - - -1.9.22 / 2018-02-22 -------------------- - -Changed: -* Update libffi to latest changes on master. -* Update detection of system libffi to match new requirements. Fixes #617 -* Prefer bundled libffi over system libffi on Mac OS. -* Do closures via libffi. This removes ClosurePool and fixes compat with PaX. #540 -* Use a more deterministic gem packaging. -* Fix unnecessary update of autoconf files at gem install. - - -1.9.21 / 2018-02-06 -------------------- - -Added: -* Ruby-2.5 support by Windows binary gems. Fixes #598 -* Add missing win64 types. -* Added support for Bitmask. (#573) -* Add support for MSYS2 (#572) and Sparc64 Linux. (#574) - -Changed: -* Fix read_string to not throw an error on length 0. -* Don't use absolute paths for sh and env. Fixes usage on Adroid #528 -* Use Ruby implementation for `which` for better compat with Windows. Fixes #315 -* Fix compatibility with PPC64LE platform. (#577) -* Normalize sparc64 to sparcv9. (#575) - -Removed: -* Drop Ruby 1.8.7 support (#480) - - -1.9.18 / 2017-03-03 -------------------- - -Added: -* Add compatibility with Ruby-2.4. - -Changed: -* Add missing shlwapi.h include to fix Windows build. -* Avoid undefined behaviour of LoadLibrary() on Windows. #553 - - -1.9.17 / 2017-01-13 -------------------- diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING deleted file mode 100644 index 7622318..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/COPYING +++ /dev/null @@ -1,49 +0,0 @@ -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.25/Gemfile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Gemfile deleted file mode 100644 index bb6c30a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Gemfile +++ /dev/null @@ -1,15 +0,0 @@ -source 'https://rubygems.org' - -group :development do - gem 'rake', '~> 10.1' - gem 'rake-compiler', '~> 1.0.3' - gem 'rake-compiler-dock', '~> 0.6.2' - gem 'rspec', '~> 3.0' - gem 'rubygems-tasks', '~> 0.2.4', :require => 'rubygems/tasks' - gem "rubysl", "~> 2.0", :platforms => 'rbx' -end - -group :doc do - gem 'kramdown' - gem 'yard', '~> 0.9' -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE deleted file mode 100644 index 20185fd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE +++ /dev/null @@ -1,24 +0,0 @@ -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.25/LICENSE.SPECS b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE.SPECS deleted file mode 100644 index 5c9ffce..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/LICENSE.SPECS +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2008-2012 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.25/README.md b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/README.md deleted file mode 100644 index be3053c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/README.md +++ /dev/null @@ -1,112 +0,0 @@ -# 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) [![Build status Windows](https://ci.appveyor.com/api/projects/status/r8wxn1sd4s794gg1/branch/master?svg=true)](https://ci.appveyor.com/project/larskanis/ffi-aofqa/branch/master) - -## 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 `mprotect` 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 - git submodule update --init --recursive - cd ffi - rake 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.25/Rakefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Rakefile deleted file mode 100644 index 4f7c074..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/Rakefile +++ /dev/null @@ -1,268 +0,0 @@ -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 - -def which(name) - exts = ENV['PATHEXT'] ? ENV['PATHEXT'].split(';') : [''] - ENV['PATH'].split(File::PATH_SEPARATOR).each do |path| - exts.each do |ext| - app = File.join(path, name+ext) - return app if File.executable? app - end - end - nil -end - -GMAKE = which('gmake').nil? ? 'make' : 'gmake' - -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 => %w[ gem:java gem:windows ] - -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 CHANGELOG.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 - ext.cross_compiling do |spec| - spec.files.reject! { |path| File.fnmatch?('ext/*', path) } - end - end - - # 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 "sudo apt-get update && sudo apt-get install -y libltdl-dev && bundle && rake cross native gem MAKE='nice make -j`nproc`'" - end -end - -directory "ext/ffi_c/libffi" -file "ext/ffi_c/libffi/autogen.sh" => "ext/ffi_c/libffi" do - warn "Downloading libffi ..." - sh "git submodule update --init --recursive" -end - -LIBFFI_GIT_FILES = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") - -# Generate files in gemspec but not in libffi's git repo by running autogen.sh -gem_spec.files.select do |f| - f =~ /ext\/ffi_c\/libffi\/(.*)/ && !LIBFFI_GIT_FILES.include?($1) -end.each do |f| - file f => "ext/ffi_c/libffi/autogen.sh" do - chdir "ext/ffi_c/libffi" do - sh "sh ./autogen.sh" - end - touch f - if gem_spec.files != Gem::Specification.load('./ffi.gemspec').files - warn "gemspec files have changed -> Please restart rake!" - exit 1 - end - 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.25/appveyor.yml b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/appveyor.yml deleted file mode 100644 index e5ab153..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/appveyor.yml +++ /dev/null @@ -1,22 +0,0 @@ -install: - - SET PATH=C:\Ruby%RUBYVER%\bin;%PATH% - - SET RAKEOPT=-rdevkit - - ps: | - if ($env:RUBYVER -like "*head*") { - $(new-object net.webclient).DownloadFile("https://github.com/oneclick/rubyinstaller2/releases/download/rubyinstaller-head/rubyinstaller-$env:RUBYVER.exe", "$pwd/ruby-setup.exe") - cmd /c ruby-setup.exe /verysilent /dir=C:/Ruby$env:RUBYVER - } - - ridk version - - gem --version - - gem install bundler --quiet --no-ri --no-rdoc - - bundle install -build: off -build_script: - - bundle exec rake compile || bundle exec rake compile -test_script: - - bundle exec rake test -environment: - matrix: - - RUBYVER: "head-x64" - - RUBYVER: 24 - - RUBYVER: 25-x64 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/.RUBYARCHDIR.time b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/.RUBYARCHDIR.time deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.c deleted file mode 100644 index 684907b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.c +++ /dev/null @@ -1,1109 +0,0 @@ -/* - * 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" - -#ifdef PRIsVALUE -# define RB_OBJ_CLASSNAME(obj) rb_obj_class(obj) -# define RB_OBJ_STRING(obj) (obj) -#else -# define PRIsVALUE "s" -# define RB_OBJ_CLASSNAME(obj) rb_obj_classname(obj) -# define RB_OBJ_STRING(obj) StringValueCStr(obj) -#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.25/ext/ffi_c/AbstractMemory.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.h deleted file mode 100644 index 1119288..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/AbstractMemory.h +++ /dev/null @@ -1,175 +0,0 @@ -/* - * 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.25/ext/ffi_c/ArrayType.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.c deleted file mode 100644 index bfd666a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.c +++ /dev/null @@ -1,162 +0,0 @@ -/* - * 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.25/ext/ffi_c/ArrayType.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.h deleted file mode 100644 index 356ffb1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ArrayType.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.25/ext/ffi_c/Buffer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Buffer.c deleted file mode 100644 index faf4834..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Buffer.c +++ /dev/null @@ -1,365 +0,0 @@ -/* - * 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.25/ext/ffi_c/Call.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.c deleted file mode 100644 index 0b9aceb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.c +++ /dev/null @@ -1,520 +0,0 @@ -/* - * 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 _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_RUBY_THREAD_H) -#include -#endif -#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 void * -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 NULL; -} - -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.25/ext/ffi_c/Call.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.h deleted file mode 100644 index 56bdd61..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Call.h +++ /dev/null @@ -1,110 +0,0 @@ -/* - * 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.25/ext/ffi_c/ClosurePool.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.c deleted file mode 100644 index 5499b40..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.c +++ /dev/null @@ -1,283 +0,0 @@ -/* - * 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.25/ext/ffi_c/ClosurePool.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.h deleted file mode 100644 index b842375..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ClosurePool.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.25/ext/ffi_c/DataConverter.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DataConverter.c deleted file mode 100644 index 2d5b827..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DataConverter.c +++ /dev/null @@ -1,91 +0,0 @@ - -#include - -#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.25/ext/ffi_c/DynamicLibrary.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.c deleted file mode 100644 index 4a2ea38..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.c +++ /dev/null @@ -1,339 +0,0 @@ -/* - * 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.25/ext/ffi_c/DynamicLibrary.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.h deleted file mode 100644 index 97bf7bc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/DynamicLibrary.h +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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.25/ext/ffi_c/Function.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.c deleted file mode 100644 index 9e861ff..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.c +++ /dev/null @@ -1,1001 +0,0 @@ -/* - * Copyright (c) 2009-2011 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 _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 -#if defined(HAVE_RUBY_THREAD_H) -#include -#endif - -#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 void * 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 void * -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 NULL; -} - -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 void * -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 NULL; -} - -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.25/ext/ffi_c/Function.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.h deleted file mode 100644 index 052aaf6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Function.h +++ /dev/null @@ -1,87 +0,0 @@ -/* - * 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.25/ext/ffi_c/FunctionInfo.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/FunctionInfo.c deleted file mode 100644 index 8085c87..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/FunctionInfo.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * 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.25/ext/ffi_c/LastError.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.c deleted file mode 100644 index 795a42e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.c +++ /dev/null @@ -1,184 +0,0 @@ -/* - * 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.25/ext/ffi_c/LastError.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.h deleted file mode 100644 index ee1dfbb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LastError.h +++ /dev/null @@ -1,47 +0,0 @@ -/* - * 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.25/ext/ffi_c/LongDouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.c deleted file mode 100644 index a21883a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.c +++ /dev/null @@ -1,63 +0,0 @@ -#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.25/ext/ffi_c/LongDouble.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.h deleted file mode 100644 index 2e52ccb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/LongDouble.h +++ /dev/null @@ -1,51 +0,0 @@ -/* - * 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.25/ext/ffi_c/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Makefile deleted file mode 100644 index f397053..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Makefile +++ /dev/null @@ -1,263 +0,0 @@ - -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.14.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.14.sdk/System/Library/Frameworks/Ruby.framework/Versions/2.3/usr/include/ruby-2.3.0/universal-darwin18 -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.20190924-36740-x1wmd8 -sitelibdir = $(DESTDIR)./.gem.20190924-36740-x1wmd8 -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.14.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 Foundation -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 $(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. -dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -ARCH_FLAG = -DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG) -LDSHARED = $(CC) -dynamic -bundle -LDSHAREDXX = $(CXX) -dynamic -bundle -AR = libtool -static -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-darwin18 -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 = AbstractMemory.c ArrayType.c Buffer.c Call.c ClosurePool.c DataConverter.c DynamicLibrary.c Function.c FunctionInfo.c LastError.c LongDouble.c MappedType.c MemoryPointer.c MethodHandle.c Platform.c Pointer.c Struct.c StructByReference.c StructByValue.c StructLayout.c Thread.c Type.c Types.c Variadic.c ffi.c -SRCS = $(ORIG_SRCS) -OBJS = AbstractMemory.o ArrayType.o Buffer.o Call.o ClosurePool.o DataConverter.o DynamicLibrary.o Function.o FunctionInfo.o LastError.o LongDouble.o MappedType.o MemoryPointer.o MethodHandle.o Platform.o Pointer.o Struct.o StructByReference.o StructByValue.o StructLayout.o Thread.o Type.o Types.o Variadic.o ffi.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) -.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.25/ext/ffi_c/MappedType.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.c deleted file mode 100644 index d1a4189..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.c +++ /dev/null @@ -1,168 +0,0 @@ -/* - * 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.25/ext/ffi_c/MappedType.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.h deleted file mode 100644 index 4b26cc1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MappedType.h +++ /dev/null @@ -1,59 +0,0 @@ -/* - * 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.25/ext/ffi_c/MemoryPointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.c deleted file mode 100644 index 0d91c35..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.c +++ /dev/null @@ -1,197 +0,0 @@ -/* - * 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 _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.25/ext/ffi_c/MemoryPointer.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.h deleted file mode 100644 index 1257683..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MemoryPointer.h +++ /dev/null @@ -1,53 +0,0 @@ -/* - * 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.25/ext/ffi_c/MethodHandle.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.c deleted file mode 100644 index 70efb72..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.c +++ /dev/null @@ -1,358 +0,0 @@ -/* - * 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 -#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.25/ext/ffi_c/MethodHandle.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.h deleted file mode 100644 index c3341bf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/MethodHandle.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.25/ext/ffi_c/Platform.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.c deleted file mode 100644 index de114a8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.c +++ /dev/null @@ -1,129 +0,0 @@ -/* - * 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. - * Note that __sparcv9 seems to only be set for Solaris. On Linux, __sparc will - * be set, along with __arch64__ if a 64-bit platform. - */ -#elif defined(__sparcv9__) || defined(__sparcv9) -# define CPU "sparcv9" - -#elif defined(__sparc__) || defined(__sparc) -# if defined(__arch64__) -# define CPU "sparcv9" -# else -# define CPU "sparc" -# endif - -#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.25/ext/ffi_c/Platform.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.h deleted file mode 100644 index 5575e34..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Platform.h +++ /dev/null @@ -1,45 +0,0 @@ -/* - * 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.25/ext/ffi_c/Pointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.c deleted file mode 100644 index 1eee790..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.c +++ /dev/null @@ -1,508 +0,0 @@ -/* - * 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 _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.25/ext/ffi_c/Pointer.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.h deleted file mode 100644 index 2d86851..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Pointer.h +++ /dev/null @@ -1,63 +0,0 @@ -/* - * 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.25/ext/ffi_c/Struct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.c deleted file mode 100644 index c6428a2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.c +++ /dev/null @@ -1,829 +0,0 @@ -/* - * 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 "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.25/ext/ffi_c/Struct.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.h deleted file mode 100644 index 85e8263..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Struct.h +++ /dev/null @@ -1,106 +0,0 @@ -/* - * 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.25/ext/ffi_c/StructByReference.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.c deleted file mode 100644 index 73e5111..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.c +++ /dev/null @@ -1,190 +0,0 @@ -/* - * 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.25/ext/ffi_c/StructByReference.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.h deleted file mode 100644 index cf797af..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByReference.h +++ /dev/null @@ -1,50 +0,0 @@ -/* - * 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.25/ext/ffi_c/StructByValue.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.c deleted file mode 100644 index 0d9fb9c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.c +++ /dev/null @@ -1,150 +0,0 @@ -/* - * 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 _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.25/ext/ffi_c/StructByValue.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.h deleted file mode 100644 index 07b2763..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructByValue.h +++ /dev/null @@ -1,55 +0,0 @@ -/* - * 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.25/ext/ffi_c/StructLayout.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructLayout.c deleted file mode 100644 index 483e532..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/StructLayout.c +++ /dev/null @@ -1,698 +0,0 @@ -/* - * 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.25/ext/ffi_c/Thread.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.c deleted file mode 100644 index e85ea40..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.c +++ /dev/null @@ -1,353 +0,0 @@ -/* - * 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 -#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.25/ext/ffi_c/Thread.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.h deleted file mode 100644 index c51a5a9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Thread.h +++ /dev/null @@ -1,95 +0,0 @@ -/* - * 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.25/ext/ffi_c/Type.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.c deleted file mode 100644 index 034482f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.c +++ /dev/null @@ -1,397 +0,0 @@ -/* - * 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 _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.25/ext/ffi_c/Type.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.h deleted file mode 100644 index d5522ee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Type.h +++ /dev/null @@ -1,62 +0,0 @@ -/* - * 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.25/ext/ffi_c/Types.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.c deleted file mode 100644 index bccf894..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.c +++ /dev/null @@ -1,139 +0,0 @@ -/* - * Copyright (c) 2009, Wayne Meissner - * Copyright (c) 2009, Luc Heinrich - * 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. - */ - -#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.25/ext/ffi_c/Types.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.h deleted file mode 100644 index 0d4806f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Types.h +++ /dev/null @@ -1,89 +0,0 @@ -/* - * 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.25/ext/ffi_c/Variadic.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Variadic.c deleted file mode 100644 index 877ffab..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/Variadic.c +++ /dev/null @@ -1,304 +0,0 @@ -/* - * Copyright (c) 2008-2010 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" -# 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.25/ext/ffi_c/compat.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/compat.h deleted file mode 100644 index a4dfc08..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/compat.h +++ /dev/null @@ -1,78 +0,0 @@ -/* - * 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_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.25/ext/ffi_c/extconf.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.h deleted file mode 100644 index 35d5140..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.h +++ /dev/null @@ -1,9 +0,0 @@ -#ifndef EXTCONF_H -#define EXTCONF_H -#define HAVE_RUBY_THREAD_H 1 -#define HAVE_RB_THREAD_CALL_WITH_GVL 1 -#define HAVE_RB_THREAD_CALL_WITHOUT_GVL 1 -#define HAVE_FFI_PREP_CIF_VAR 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.25/ext/ffi_c/extconf.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.rb deleted file mode 100644 index 45ab977..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/extconf.rb +++ /dev/null @@ -1,72 +0,0 @@ -#!/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_closure_alloc - libffi_ok = have_library("ffi", "ffi_call", [ "ffi.h" ]) || - have_library("libffi", "ffi_call", [ "ffi.h" ]) - libffi_ok &&= have_func("ffi_closure_alloc") - - # 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_header('ruby/thread.h') # for compat with ruby < 2.0 - have_func('rb_thread_blocking_region') - have_func('rb_thread_call_with_gvl') - have_func('rb_thread_call_without_gvl') - - if libffi_ok - have_func('ffi_prep_cif_var') - else - $defs << "-DHAVE_FFI_PREP_CIF_VAR" - end - - $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.25/ext/ffi_c/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi.c deleted file mode 100644 index ea9a058..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi.c +++ /dev/null @@ -1,98 +0,0 @@ -/* - * 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.25/ext/ffi_c/ffi_c.bundle b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/ffi_c.bundle deleted file mode 100755 index e9433c468a53a6326142bfca1a84ee42297e9710..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 185524 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

$OhSv44p{ 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

XQQ)2C`uN6! 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 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.7.dylib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.7.dylib deleted file mode 100755 index 8dc33a4c75bbc6943ff9c08a601311e228a23a6b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 55212 zcmeIb3w&Kwl|O!NlG}zyxfi4o1tmz)R7MDhQVbn$uoq9U(SSq|(KMtft@IJw1Pf!v zv^SUL^z=#;f>m*dk8%1F9iu}bbr|IwlUBP81iP{A+IRXxq}EVU3sIJ6iMJH(+28uQWk3Q7-MC?MzQLvV2JXQ;IMC4b3>+P;={+cdS5zCnY}wwH0r z++2T@yBd+ZW%ZZW7eHBgQ}J}Hycuy7d9$+2Qq9d9)-`Xwe*M)O*EP3yY(ji?d=?$? z71Bldctt_=&CS z*=j6BloPh4xp~F%cfTvSY`N7@Sp!jRo+keFlQd4g72;Ze_!3-IVfs-B9p#+exp~vs z>o&HwtUG(%+N*i3UcL6L^Uqp!J%WIEo#S-Z;^|}^ry7rHJc-BtU6FO1MpU$W*m1_u z5RM_%;qG^wESWPxp6m;Yk_=FWPNo4@ocoz084^Iq?4>2bx^(=Wc2; z;rhwA>vc_eos(Wu;59t8%u7zJ@EXQPl8=+TRM%w0^^)1xjnEm4MPu8j8%C0cs1|ZB z;^rqOUB6+xj6}b&lBlV}Cki($sFOR#a3!GS*dgGj| zw_j7Qj|a4qQqxYX$J9n;mGh-s66F$=plTGPf;(i3vQi6KiJiL4 zajd+YlZC`gd!5gF95xNX3ihYpHSKpkkESgH))i>}3iOM&cZGN2qTn5eK$9XmD|TuR zQ9H3yLwtE`Uc)4jaV!@hoCHEtksSXH`o(d*ibcV1{utu4C=Gqp#0Pl>ZR9))BJLyZ zBd&<1mwVaZ2^cjXtGc9p)dj^cs`cqh9+E6We*U)`u*LfmE43-p~MHM6u*l z?zMR!D*>s|`68?35DJ0-g6dDS29+SjlW2{J+$|U?Y|)1v$oF>vGr&La@iJ7@1XcT# z;&}=frt9h}VkuZpAqQ?zEKmc6If*^M$SWqGli6VJAG7o;FdL!h)@E^U=RPJc- zeavfkD7O8tnV*T?C14F>ZtID?Ze;J_gW4u1c2}hbolmj-p_|$dPIn?$mTOY9!n@dg zXm6=@$-Oxb5xaYKB=J0m8@qotB)<;1>-e+dcqk9yw$6rvQ=n zGnv`e!@MPmE(x8Ps95G@-Au)IW#UauV8lG>E*^HhhX6AM&48A6qESs_K^wKHCXfXa zXzf@~i-juc$=#;)U`)CfjK|xS#XJd@goQGXnZ7LI!jkH@y3&HPOC z!vY2&FVY{WY#e}7Ir>GG5LgA}gx~i~L=PO{Vm_~|f%z_; zM&66%>B#!>AEhCp#5t#V2U5?JqoH2YSgfZOd1ib*p343%6_k0&hhp1kWrfK>41FK# zIgM$&NejZc0Rz~ugf52Qjkg$p!pVqwAaX=Cke?hls8x*rEA!)LRR3aVnZA9=_N~qh z?__=^N>dkt`e)A#3l;4Y)ywR2!*d~HQ1R?~eJl?$$J}6giq*_9H|#9HG3(rLZ64sc zSe$(Y-dnpMcrJFllcT#u`w$PZfxRPu+LJ+!i>^|LLOVN0l_&jq#7@oY_77mxe&~TU z=vp7w!?-?=l>2Z^;G%9n1J^roG2g;`1K|Sw{!wUG5nsqc$r&9M#Yh1wohJ|9MAqfUcWUy_*8j8#RR0&OmqPyc+4+R?0j76YcCu_t)18YY zz%(9C?w!)L;J|wr2p7sdZ;OGAO^eifawmn}^XcA%f_` z*pO9M?9^@)*Y(!cN%~WTgw)b+eGbX7^l`WcKZS>b>*Vwai22bsAS*RdCM$7~w@ma- zc3N}|+^;mWP5`3>{zj}Ab1cNw_zT04Sh|BLNO0V(T~l1z#I`?Qff)P?C&g0Sq8O^i z4P)QSRAC_HPC`ruHRq{R7UtRn%!V}cTwfou#zezt+oRq7g4c@(VP4$pWljX3_lV!m z=VQ-!O^^FckEafni)$jPYW4T*@l-b9H$0yD?cvmu5${15G378Fv6_K#FzyZ?go${t z+>MN(0@w*6Pn=P+2;&mR#gL@eC5K|^)0F6OZ&+5Pj~z@sd-(K)H=!PHp@+LwWXdrez4K0_onL~o2Vb2fKF~2ulF8V<~{h>FNS{+srQEK7r&T1YINCY`@PPc ze&^0JlRFvg^}Bk5doeY*nS~vke^YxCSk$g)9b4fw^}$Ebw;X)ORlXwfD7s=0h;dy8 zzBlbg7?*^*CB3exJLG#`G2c%Da&O`BxLdw=qp`1IW9Q;Ka5fAYzN5~D?mXWQ!)s^x z-Y0xNQwG&8$ndV}Sn7Q3InBy<$!^mnpt=EhrCpNyEM<}1Fk6vwsbK*5s0F?3Hw+kb zyCm#4?Skjyc-N1<`DUQ;(p%6$Zt7k>;C*_7%6W`=kaO2xut>l%?F92P0?j3mm*HfG z6nP9k38@F65lCQ~D;Eqnd3fn75c3z__i56cCa|~P`|W*{gU6me?O6^kGX^x%4ufMB z`Y7TpOyizgE{rmWF@ox%HzIjvm#7BF!)fh02sZ5qJ0ooxqZD$)*c1}W{zHlceQmdl zDudRh00u1fqLY{<5d@c`FKTdiIAA^oPjPDLcaaR%ivIIO`3@o_cn(V)=mjWn=*u24 zINk|(5txG8YPKCZuRFHQ==cc`dD!p-PK+XLmz+o~ZJJSEg7uZ3I-@>18uC@46&%_p z130$*I1#ewafrAgwdqFk#*d!J6ff;Emb#aT)v;}xw1Xs3Bry7`J^@QeAua1gvrP0g zCc>GKe9=G#zoz*8Qkw{Bp`d4^2Ega8lp3QOw3;QXW+ZwQV*EpJtquBV$qdIzhysKN zHa{Z(C2G$!P%Qr-XY5w8rviv$DY_qpU;cvUFonq?dqIvNFH0^Zq8qvw=9PEM6ia_(G-L3mL(ZlWwSKP)PoD$oEYx}MHcgtiB8pNFf zS72Qvwr#O;D1g>M2HYr36K?q>m2@biM35&$JP}bbZL(+yN72$}AlRr_%$SpqEo7X4 zG(Wl$S(cSDj5E<+VNT7n@?AF?_=jPa6q_;kFa=obHp7%#w{R4Ndowq|($keFD4CL- z9aJLC?;qCe9ccm;?~;DGkZ9Y zu+uS&4npd|mqJS>wYM6U4denBePn0CK8V0$L-X)QLEF1cix;9iFal=5Vh+Z|u*Vjh zicqc(%rlt7(pZy2AYf>6O@@n0R1Z5DeAX=(#1x;1-Ml~1{d6P|yKBGOI_h$xsOJr~ z1$EI|02AxEii)^SuI2%HG$svSC-8$^+S<`E%*aSEc z_`QY4;huYxP0K{f5Z1|%j-RHXLL2Xb;aCp`m)S!C=7qn+tlyjYq;&43iXn?6g8{UZ zVo2N-N%Zc?us{#wj_t}q(R>+&Fvay|n6o3zdvBU(cgVe1D2x#Z>|z9RassUlSxjbe zGykQG9OgPXTqz`8au82kaBz9a-6mWG?hM9yRw^aTB|mqCxn6Pr;a#9Gq7>@xTe#z9 zNC8j-=10z@EG%Y-A>|j_K+5kdep$R%8!u@es;fbD11hm7#i2Ou#2+;F20LbV< zEd%NYu&8>m>saG_JJQ>~ldMgLbeRgh20~QJo}Pg0NE2{3mL8&SOjq=xGE~ZuGmyJg zbx&~8xuZp3F&eVzp%Z`u2H zONgDg8=Y94J61t#LXEcUHMV6?s{?41*&P@_O;7dCR@2YJnnWOKwT0|aV~A2Y%c$`+ zp)UIQSrLgEHZUq&)yf<-QQXRzc_tO(0i?&$nAivwxaHBGU`}+s=;QJb;~p7kLG;H=(X~KHyD&FK z??i4a{Yv5)iGCRo{vp_HgQjF%^mBx~k&v=epIQ0=Bm`Hvv}$_LfLzSdTo?T?Vbhlp zl~VT>B!HH)P_D-G6}iBCWz5oi5ic!fvN4?NBtMp3B#n`*;*oz@nj?P&?zt(#WTFX# zb^ggTiU#W!gay6|&STs(RdG@4yKZ4M%JpVal$dQ|aA%^wgXL>bxpSe?32hsT^_V4@ zz}7{7fYLIjF>^ z{~gulUMIq!Bo$7E;?;s+QDq4}G3MS_K&YL`EF{%v2-)*pK#E>K?UGuAJWfW~8FDN8 zDs6OXA*?!b^7AACccgg_=SiJc(}K@>+c31G${cqzQGFF3b<1G3PtxVeJYclo*gtMmk zro&67(+Fzw7XFd*U5BC&Nvew;Lek7OU0eVold6hY+6)I%y`bRi%4LS_C0`eiUcH%P z|M_~`jj4NC4jedBB}TB+MQ@muf8%z>Rfqrib2Z=taX!l|5MwuHqF?$1 z9^!1nf=GR9Q{&6pQhqE;Yr5DHV!6w?g$c zBI$8yrtqo~(JZ5>d-<^aGLjx;41YN>I=4zLQ(`wt$0@+61b9YzO0amtUgjPY^yR)a zNAJdPE}nX_(#s49J4U@I^s5b@|N1)ZG_RdGbBkp6raZ|sDxRGfv ziaZhNgjl_+3u0kb78z!Q3ybs^W4=J6w}ja^UV#(|jwEV88b!)Ps~PndzJwXpl$t4L zEn0&0gx1J03%`dV-oo!{LBZzlk;=KjWXRZ~^3bw`DlL?3PAw zJm1S&PesxeJaycP-@(hYBO$j4qz%0tH_U&2zj6ZSFL~B6^-P(&_!0Q*2ng)*Aef+X zADaNu0nO6t#BM)?HBu1kd0d+;8L4bFI4PjRxwpe~FYt%&QUsa_w@ZjpGUOPln7e*j zA#LMw8?*vRt&83aTVdv~Oe)N{)R7TT%xAvgj_un#Z*2;AYlHFJD3An~ZpKjgXM~Im zs14@6Nq?VU@0XOig-3&s-pod%#kLu(AOLmIDa_a)Q8Ra>2~up*H5E}SrNpGm2x`>{ zT3JZkjJAMsE0|QlPVQ*jf}1xX)PxEPG<1x)0>WF+4iGXD^fHWH=Cc-T&0c{& zxM}aev=qD=l>oyA0(!~kW9c^&C=Zso z-{;7}WR+R^LE;-j*8Q&$WRt-U5W%GNY5+=Fa32$7o~Ny)Xg${aNASGmhvG1yXOidN zxDfU)!)QKu$UPIDO4*C0V%Sm*W9dX86;W{<$>J$T$&k5Nt!tOvX0`+9O%+z1pN9eJ z383csP@IWy&n3rWDVb;JtW&2dhygpd2`;YXa4Mj#zAAR}-tL1qp8l-cx?d5mhaG{+ z;SLvsLlX9}VGGyzr%QqBEU-H11{D}?&AQ}7tVgx3EF3XTlLKL{y7Lg9iwMdJpmzge zK<8$b7H5xHo78Va_r0KC6UDBzUAihkX)&BnD*^K0_){;P0`%Mg0G*atW8pFc{ye(| z;o+FjOBX`X;}?4A2(ly1d${^Az1xS@qf$!nZtJB(e6H4;p4(OArfY=0&8rJ|v<4wP z|IWe9jRNbVn<)0t^(xEZOXTWeNuH~{JaZ)MF^7>+u-HdOw5K;#c#Rdgm0AwHI~T?0 zg%IMRn+RQW?7>0wVCbT=31<0l!+Ohm^*hej1`%ow`TR*(m54*Fwvax$WVcH2a)s!g z8;21uLZB<_tAT?xb|Y*Ya|hR1y3`L+gL!ca$BqoX%cKTPn3GVmV3Sf>PmR`7;sgAc ztxB!cHDMH$K&^F+=l9~VGl4-FZWdze%I?SMuEkXG@razS+?=flc2i{keaN5~NBf7M ztHyQz9U?_9p!G)H+m5zF-qaZ&nP9kao2kcA4y{;M6*jW63C!Uu$+Ds)!WB$04yVwy zH0{TcM&OyIoA#Av+9d*I^O(37&t0M&p-8bjn6opCB@hB?)ynY~J`(n|X;DVtbi!XF z1kd8&kqm`Vw0hV;ECz04L4dV)z*Y%U%qGB?IOgjt2>;LnGM9sIBb?IH*RMZrUk4u z8t(BM?kQSjGz>us{HA-bxM;ekXl2oKr{8pEdDD>B1Q3KnkVLqMu=%=nP`J)}9(&sB zyhqmyf}?Py&~)c4%Y@{pRmKo!?rHUm>U@g#zhv~Crc#ZGuxpfd^$=}6Sq~e#dXU!9 zX=rC?SK~PMaH&yEC`g?=#Hc17F{+^qMv?<4PezT&K+qXBfRgD$8g^JX!_ssY2sKQo z3BO5KIFb?w3kQ(GHwbxE8LuGAWK0bl?C zc$ZH5*+&#*a>r{vu+ehI$b55zQognK1DeO1MnJ27Ld6e3}m-pa-Ym6B* z2Ggb+Dg@ouiRUfP8Z&522r8he2d1Agjyfh}tvTkR4`HzJy;1p~b&z_nNqG%+6`D_E zFBK9Eb!$EumYcPPKFG5z#3n51S$VY3!Qlj=msiU0;t_y%YQ}_Q%xWf8TZnR4WL6W> z)KM)ko3RueCA9%Ye7&L@b#^iK(sjxf0>pu{k%U@+&~vY;pm$cX77GgF<)1}qS;eNB z?@$}WR2B%VrqJ?H_qE!eQbxr34VFLy>RB-IJ_PI84>0X+tLTTZfm*GbsCtCPnpOXR z4hvnoN}R%a77j)-UTf?p;Epu!p>btqhJ;9m*_Ln&A=b64w)0%vGV&!rg}&XVR+$DE zp}m)Vg;8*-tnx7h&u(rR=cP!&5>iE@>#vJ?M3Vmu(`(9@URa1ZW@?;U7LC_f1q$PU z#<%t53Qx^MOf&3+B66fi=*#_8tL?Ycy)1_o*NCn)@-!D4Uo0fj&YiVJbSWCOWQOSO zD-=``IOvWf#0q5bRa>he^gtU^?fj5x9V<|?1=|d!!WvTWpH-+pwnA8Ib{t7YXdCXo z+DZr2d~kOdMU2X}#9+fb6`p6sAd@Xp3~_VJr08H*?oMC?-)1Xf3^r?IR00foOQU(S z4TogyE}nU5LR0L95zWVJ0_Cd7kRr>hN?2r0BI||;{LNyS5qM6^Ofm~Bv#CPMOp%IZ zHb-Y0%Pa)+q-xbqSG8DyG~24a?j;pjW^vLjR+k~#vM7!YRJ1mwD)(;j;;NbFnOzw0 zaX6@i)J#FUz+cA)=1WM=nvA!h57J9JzcNM{d5hym>aR z)z4y~2~UiI&nrXS?g-D>I_wr-cU0_FmUwY1nUVM6nrJncN70}18{ue?VlySKSzt7? zNaAFjieiGy-y?O46IZF&Bk7(vaSez`se%*N1mn5C67{b8PF$=ThcAt~d#AxH8k_WC z78#p;NGNgQ5_YD&NkEV&53x6iN}af4nl&yDV-nE->iJh~uw0b~sUR=c>UR-XUzyYo)olq9tF(TF2#M_N=jp@Q&LA2;uAx_oiGC>b+A6Y; zJkVa;8qlt-8A;TldgI6a-c<-)hH6Fn^Ea96^yKTbOtF#`+y-#_+6zELoaYX^F>r-cB@} zKI)?1gH;~ec9tZV_ktQZx$x{E)=ik&WmV`S%44plB2P#3NLFgUfHuV6TYRaki+O`f zj4beHaek&1_;IN6Dn8@|nhgogqz_9-vQ0eP#M%Fw=_@- zUZ@yiWh?X`d(b>j2pn`n8gSB2=ZEAVP*0$4AWHHhC}3luJ1i_Q5$j2aj_2$MSt;Mz zh-zI=A7TM)y#gtEGzSP__;(8k^E}CuR9dL9^gB@xqNtg<^^gjIk~76J0ZVic2=O`& z_PRvz6sVIdQ^Q}+UBd`!0E19f z^lNQ=kW6Y{ymhsfT+T!fpm*F0@NtfGwE$8`q@B=qIoHJ}U%Ugs7XX`63sx)#z>uot z)7V2gB=1vTt*o!?;fdnq!uH+nVn|s4EPI11iQWm;r7j+1|Id8a>t ztRV`JH;k9Iy}j-QkHpd+QFyct3w64kVZ3isO~URmiE>oj5*ACnMGH~XkOEeCv#LUwB0(vf1VbMcN*RhpXJOR_Vb#eBj%K42oPg!9C9&Y-GKl~? z(!9^jq_5|h)RC_kZBVf^O!@$_W-w`4LCxySn2@G(I*^_(;Q~|`U+ICjDmVd6M;}e+ z?i3uNlbAb>*Rq0tMNbxK(*R{?Fvepk_(Rc5C^ZqiOXKe1y{?A`-mNn1tpVO%gnPke z1;dgCY28TcGk(r)?Hc6gt?^!y)+x-W2xL^?0|4RS{T@8S z@5MBR%9{t!Q~PUi&3DV+vJ`6r*I)WpK2pDduKqo=B+gBeFSzPDp(Wo3aS+E9Q;M}@ z15STi71=Npyq$tWKS-$UU?QBL(u7f)jl-9M_X_ENqHVNn;qi)rgNGPM`A_!dZloE>7dDzOjrkKI1LDQ5U+W z@)%SGc$9$y4+%7tnZSXf>i{eBnj)Ij$p3#)V`sxoWZTVLrf;00VkoSAjdM)p`ac)sU?_HIOu~n zOAO!PDVn^uB1;>L_e5wTYkq3!Yqa)@k%X<-D#U`fvnJKpf#38L$iSyB#=PXd;2g}f z(&w3_zsAfGoGg%?Xieudx<5w(W|j>80FNabY?z!Vd;!LM|AH^J*l$DNT`}xuBm@_G zC7TeDC|rqh49hqUFg~l0&1W2GQvjz8GL_o{6~;lR@B5nfkD(Dz67EMU-}3ri!AKY{ z83}pFa3nw+A*5<*@ST+jR)@3+A!G3{1`DY}lDPD15Jp_Wq)@dBWn9+mbrOlKJNN}+nazWYfpuSYyfQ8WgRA-^8!uxpdhe9eq zQyohuRRS%VN~s7Q^a3>12=6XLBXPdA!gqFgzWR^q1V+OWmC(KB*!d-#>4auU5DZWul8N&c`^aAnU8U*~{DBqvcWcT;=u5^j(DRSy%|I{=43OX6;Dx-kT=U z9da)|UZeh6wy@~cn?ClS`g_)a5>aHiU#nd_299*2owyRUkjgDIT{Kz+#&pMejL)0^ zV5Ql=6L@gb?kKF0Vrblv+>Kn3ScjVE9lIGQ86l0M?*@&=XWm`xGhZnf5;eBsLZ5jE z>glGa?pFwEag6Q;`)rT8Xnha|2hcK63)@Nb?>V zgT`kraQ0nj4tJulK67oxT--7~a{(Fw(IA@>WH8uZ`;KYwn6R%f6B(a*{)hs)s_-Oq zqcDv@>#}*xyBGpk*-VaRuWuXZ<44vv&GBNThv3Cs8fJWPRqQ zUP0j1hd%S-WPAR3h3&VL-6S_Ya|NG^jmBrLMB2BuYmIDIqeonlFQRdUk}3%tp|iGU zaUqb!SB(}Ls-<-3!Y&V~*1<%PO_WwB3IADz3S=vU=Cu_{Mp)se-({skge4V5LAI59 zOc3SJl4^!xAt7shC}>U`F7#{o!qHHPQU;7D<&Gb zUub&R7cgoGXSNZbWyJ~3vNK(hW?KorX z8gqP^xkX-Y0-Q>KXK+Jh1mN-I3Os$e7kj-ONtb&+Vd(Ydv)Jo>2)fGe=e@k2u=vJ^ zl+*N*a*4dxyR?MydKVPlBZcAh=F@n+^R?x@-a}gbY+i3R*{En(uJ-IQQ}bt+s~Gd` zMnpAZdUjcYd9SyLR)cwz&uR5~6W2@;qeX9UhSNXG9AmxSg3R9|b&JAuOo9C}W>WV`FC%F;l8UUs0VI@oy_FHArz{8v;^o2Rr|!ec(d9t1 zv^rxd@vAe|>n$1T^%l?>UhfG-pqb+JHYg>d(Ce*`wsF?$t*LWq)TFXqIcMGyfSbdx z$G$vOixdN*%;k#3W*V<|KNetxUT+^;FtD!U!+ifyAW0>~92B(k@kxjWLl z7n@h=tFpvMF)?HGJq=X}iYz2=Mr)`=q!~qC?|%g=X7hU6!7wgM@2&f|iYZ+F+4b4h z$wbNe1|PJBkvffYv6y+_kNiw~GdU`#w*I9pqOF*Frc2_wmDjgFX6 z7_nIL?}vp1Ps`$G-3V>PA(h)KRx;KTLWO3|1yMRmR!W#kN|!K3hUB5^iXqHJgTT(k z0WK_JQp45qsR+@QvSO5XN6cwu0O|WD;HJo!T>z-5zsq9-Y;%@dDD-j%`MeQ{r)f4x! z=T;f)({OvM^VzOtx3V0Z8~Ext>Iq%i--pqJGN{73v=J) z&Rs*^rES{jZIvd`fRRr>8p8w8k%Ty)d^x3rucGR4C3HqR^)Z3#@I^&)Kw1;Qc`;-4 z_79@PlkkLc6OKQ`gJzGTQ`guGyOK2r9yOy}W8qPqD+IdGbWs3Vnc6*R^o>Dc_VUBm zcWp+vqpyx*g;sl}QR$gRqY~DDF0yA_0Z?PozNl;L8J3+n*%*69GUu{q6zQK~&xC+l zwJsF4*F&4AfZG+8z^R5>BLv$o?^J;Y2~Cj+$*S?wn}c1g+l4$oKukQ%e~mb;RLGZ6a0R{(8A%f*uvrG z+w>!D<^3$-$=#RFyUi$<$XhrpS6ISWI9jP7-6NI4!r{|cIQiN_3rEf}DFw3`Ic&An z>v>$dbrjMz(V9A% z8d?!0?|c|jNBL)7TcxR^B-zrdU(w2V}T4 zbrd2bvbUePJJP(*YU&tbq?npIf?Sn^BD1t(+AC=dRf`}fGIgH05cIzX70MXM->~sR z8>ZO0SvGV3NB0x>b?Ma7+cB9zn$Cyxj6~m02QdDE13=?Ndytn}+NBV>=E_1$uv);@ z!L0x>V=#I$${}&wUwWy`jh*8#oPuBxHdMtqP+Im%l!du70zc{*fBFqZT5g+o17Da7UV)~grm_6)(wO=B2adEsZ_@GOFZ~`01PAKShU7!J zvq7=HbO=eX#>RvDk?e-27qDqCn)@CK@kkuXzk$Kl=wh6fQwIhiau%CT*Ur?x9s?7O!oXl$NH5)c zy`AkKj8_ACjBK@2f!jI8M2M~9?gJQ5_(>%2opDI5H zw*10f{3F++n;Xnuc!NN74Fxw}KyVn&a@P8j>Xn0czb^WIfE0aZZMS{RZ>bcfkxd&q zIVu}fIJ}PoB*B-7kA_=@k~orlp5tXCxewgIS1NErA@<{heB`TPBA1f<=aBXwWb&o8`&T0K*z> zd0xBpVX81WqM=>7&vxlP?b3NDT-c@I_xY>QLjKwdF!Lu~f(QViV6a(<4G%Vg8Ntbt zIw>2G{7IGk_^P%0$)aL1OV>lTg7$BUKF1L2n!u=LmqGy1O+2!JxsyBjbvS_2^G2;e zSQ32tt*lyqZ=i=<;SrVOp&Ykeiu7WzMj*|v9bq>yc51@@-b{k+kaljf*=N_9W}Z<0LnFeLc$Pj;LmyY1+VJUy;#s9(8|@ zgA05SHug;nZ?;NTu7s|^L89QAe-uVQJ5WQw0^+i2+j~itKz5D=9HrvlhtQEig*%hO zm4ljb2TNsY0wj$D{DP9ebI2l}aDlQ%1iuFkZl(v|Hp*UFsi#INO%h1^RAV_H7UL|5 zhC-U<)Q)W_CWO7gXPyjgVo1S*#9R){#iIISlLvngAn z^k&g>LqbqFXFb3Z^1YBu|cGrm!H2U~)RP^h6`*Ri2D+;Tig`YWU>#6^f|-E1Vtjx_J#W+P1%VC_YV zK^5hs;2VW=w%+*Eia%0#8P4Abl}f6Mb?02#LqryyWc5+)@x6}+hI2>?JV$*a@x+=2=z&Fw*`F7pbT zdH2a~g{?$mg#fb^b_L=^jv@k_N(#+Z7y;-gx*Shm?!}IxMoE`@KVj%7;xEt8BH%Km&iMcN=q0=kya{&_efzliug2+BE`yk=qT#KRu~gz^AfSiRw%;Z zXW#ZVA6j1n7_6}g3VuUN)h_|>ak$%lz(>N>WG&Lo4j7?lI)@qsMo`VV14b3RN9q&L zkk;IZD!KQ?ObJ(+XFPX&8S6CON9ZNvW5mpm689KgL3AY)O;HXKN?bwGwiz!L6A;+t zA+8{z(ic6JXjVcVX1bCsul?FW$xuI#fX?s()hYtb6hDwbDH(-+AceGz%dON3Ghk0t_>|%ya@NvC@Htn-T^$m zE@mA+3K3G(+t1t`Y2J$+Kg;t3N*VR~NL}jnF_*S!&6@535=a)=lC^D8>QXZbx zM5Mxg8KY|~Xvdi>96Zf^NR<$B%j^#s7koclaL5JvNy+)Ww= zw3AC|700PlIJ}4pb z3&UAIxsTsV&x|7#Ytc}8pj}%V_PPFrqoDxZPCR0^&_@H=DNo*$nw}TCi9Ets$I>7* zT^al28dCvAnn6-A%HOcX`#n64nCj}TjAbYxAgWuQbXRc&Ow*Ff;-f~fq~=j&SdB7b zLp&U@B!_`9f~3!Ecj?8MU2bTxdo?xPyR?N5wCAR2gn{Xg~D|2L~ZC;362!x7qCHPo~-4-1l)CN#4USP7LTn z#0G4|j9k}%-QSy#jLr%ChJD@v|JXh-O?2l`K#J+3X?JY<3 zb8rZuOYV`_J-Nk*iG=S+{zB$0EOrZjM%rtd7Qb`Qvj~6yF6ic~(ao}mg)cq=l+uF~ zD3C>KmOh((E5+yZ1%TS$;=BoAdole>1y=z-t3!Vf&&bQ~J2p(GF33+!(=s(t%Ndu< z6t@{r{Y0?*BoND-bF%d~4xk>Jd^Qy~NE3IM@jq>yoDf9OzXnJ0^C5gRILhI{or|y5 zpf88es_|vMd&)Aep~rONMJVVed(NOTmyrrl1PVG4L?K~V&G>=LQKRa502*q!ao?>% zmqvfX^5UI5D9)b8LBJpoqKoZm;z2i>C6tam0$_zgWoSF4-H)T!?8c zR9pj4T03380ysgCu~3sHRaDt6m<#)Y$1%o`&)FR|D<7aowc2gv$y*Av+OG0spJ=sD zqE3(z)?hW7TIg!{La$NFxFeFNDsC9aY5f=tr^gfc6X8d}fnt?h*KR;$;m-x}=V6fc zuR)<;$7!rmH|oowqdZ>vjk`C?#K9t_y}J4uNpn#m?2!;hs~j$krRd=DO`^XnGl48j zVX0^4;iU+*0Q+eR$F_fpYCaRK*QrUe?8wdCz`SB69F0!<^*pctJQVh1e_20wqXRU} zb^d$`^#$~jukYR0&u=j5&;_sn-A{XzK zPo@{>*VEA-7r z%t4L#Y3eb6^-*jP#gx?ladb7JeRKU{_3n{mFNrYfe3>sL>bD-`{7^5y%a{-{Kx4yB zGp2TOO!*aPoa%0STpni`#dRSH9sAXK43H)~DH1~zGY9NVnT?RP3y#LVSY`x0QZRYY zVXPK!52lIk;2STX4Q3ii-OHgAP7^!JlRX8~L~nVrTc(MRYn=mNH*n<*-~VKq;EXC3 zuzG=tj9?B%Tu}b{`+nF2M_UYj_KzN~9L)U(wX@QRg^ze6G*%W%e-(6bRTtYvi$m6P z{Fyz3o(j{jxVrIgL%4bix1DAh>V$hITZ;(?FGoEItp9!ITqo=bf^!xnSvv@mI2 zZ2QGX(!G-Wm=eb&#xvTvzZQOXm}~V=l*@3ubVcjvax{8H|vv^q|X(Omr>e5rh;4`65AfvZh(omx-7^m1c5*{dZ-l5UgkVkxajStiHntrK*x(Qd zVoOw5bbRL48sK;VaH1lFhND0+3-E;iE|H^r6trgZ=f1hHRq9bj9ex^xxt%BVmxyUH zc#}_lJWMt!m}ILtoE#TQzD>BMO3i}gsNZm#cVL7+;|ReHZM4TI;Iio@Z-v`VL)Y*xWc+KCYz!kTmN;Md zxWp;^Q-Y~)1UwQ?1#*vy-F;~#P5D;%g0Pa7(U_G|{t`Tto!9~I#OAO-!u!Mpu+4doS`Tw&mL% z9>&H*A#+6*lqiv8IGUL|(Xgj1cHM$?8B3crGdY?^IlrV~zeTx{hP|0=X)ANP1_S7?Zk056( zFS82w*!EjlAQRQ^QRtd4Ty}jPE+Y~>;uvyOvSfu{Wg37H#*s>4mJ!xyBJ8l-JMus> zPz9GAvI2gZg>a54EJ$NPni<4!Yz#DDep&EU)R~`4Fd1?MqMJQ-@fJG69zB6G%FS44 z>;=$Q(2yr^J%{VxV3Hr{T8J{te*x=-mvEJ%{4!jtaWQ_R%N`No{G~^euyaz^iBIv% zjE5t9n3*DAjr?G!NqnA(lW1_N>v@dQ0>~dp;`Gt>Y~k||O!&_*9u5hE?$&&mS&X81 zg?^bHA*9h4je6iGH)Vw3DNTi;M%{&cEEBMFU}>ZoJSc6-NH@MmAt8(BYN%2L9i@-5 zc%DbD!Gm0b=co{m&`Yfh+9^zOj0L~4ec~b*>gT&26rT&NuqM93Ys6WL?=JWL(BM6= z%o|4Rc=wC3WwE;+S&?}S_a0)~zli&LGA9DAW6@;&;e$BOW6y=g?t+$@{{VJn z^a;lqqO1Gd*nJXmWB2QGmq|x1*ORMbf6D-#Ka}TB-j3KZ$N9o0zThe`OD*x{ysE%-f-^N=e}afn@DgHG)CX*`q;*cYI(mT!TV*6ykEJJ_p94^ z|5`U%!@#%uOyD~M2;_bVNp-hQQh%+EePY?7THIGGO5lF^qDI`WTC@`PRg2nj|N5eC z1-o;RAc=kAo<##l$#ItKGgw^j!bPsvu?X~Dz6iawVo}u!Z`q>i6$sTV_iv~|FIA(L zYTV4uMeLg8-oy$7ClCxyd6v}dBQ+PYGse&v7|iI5&){x5V;r5aTKEQDbR)xw-8B!v zgcG}4pFSVpYwSLget&VgD*)_|4a{(!i~X%Ue{zEJSxYMa`;ja_hTEfvF&dsicIvAf(fnzJJFyt zwO$T>1?Y!KsBXO9qv7KjHnm|y*tu^K1AI#NP^SF)3NIO?x+WLIZqZ-5*jt_qBq^wf zWwda>NeagNFn%CYiei^VoDrgkz6{;|8C+k(<(ntNygq@;u1D0DZVzdOPIlgv0j@+Fd{TBw9rF=we_Bi-Dln`;(k9&h;z}RhEYNHi3!ZjR@kS@e5*U z>e)h8W9!54D2p8B5%blV?!$AQSr$LP)So^C5L``DP^&!kJ_ee0qpm?X8>sz}jcB$8 z$rA{39kg3E=v!&WNf>%o)2;^Df%t*>)9jwD@Vc4z>iqnv~MomL|6L^uOc>k-@>!xK@3g9s{HGi zdC+k5&41moIHUdcysr6mAHU4f`ovtczKK1WiM|#p1g*nZ{WJUl;ra6Sy&rQ2&z&rb zE$*7Yt#b^w^;z87266k)0B%ivxHWX+CXU6}VmZhZTfCcRL2JLPrm1((~1U6P9;=3$XBhri~MZ1PVUPE!O zq2SkW2-I*e)ZkcprfsVE!_aB3gL=c^h5w)aL0DlNpG7m@^?rw!X_kABy8f|?o{hzk z;a|R}5}_4~Dp&Z+7R3>S1--(D1&!cUi>eMc#r=jV=-uiSnT6j1Q&TUV(2zOtKy3S0 zFf?cshkHl=J41aB^3%w$%iY%Oa?g42f#>RD$K%oWta%2@vF3w4j`fw~b3MiN5Y|~H zet-6tC#>%CG}>qJNG8hJr>)1vgWqCJi~Rat)Q0Ekde*+WPappSTr=yGU@hoC#s32} z{;#UT`a8HBgyd7Ku_naAaK$351uv0RdxJNYqow`7itzvDj+&$WSQB3cZ^cD5Zff$1 zXJf}NTeJjsEW>fXe36U$Rf`%|WUzn^4#-*6Ws7Q{5^#s@b;SdR&$tI#@$eb<$(_Fx zeE5vLa^ENS{c<0b`vJK>B=?8qJ|_1^<^H(be<=5Hx&K)1PsshJa-YB*%km5GsDJO_ zGZy37w+8*@`xv5qm%EdpwG43uwWfoi0fy2H z-OA9-4DDp-%M9@s4%d8>A)aVhb1y?Yl(~l9og7`2Yo2B3N{09w$2nR^YhKIH#SERr z5OqHv!yE?u7~q~`E)MK@_+es8X5V&e7%-p&CA0>9~b;_WzD}h zH^B@3&R)HGEq`J3iYp2d5yU+8A{c!545ESFEsbB^(70^*WzN|h>)V~PuWQ+)fmLnS zoxOR@ddGcFLy|mq92!cba1k#4@o6YV_9boE|^ z>vE*O6sDKC$5nD2ejTnQzbY(2JUel%LF##UT0C>LpFAghHP5lv4E=n zSTL{bqI5-1`Ddzjz4Egse(r?N$8S6C3&;N5(YIF)6ptTP^?%dfxRKd|<~eDeFPNuu zhjQa+^E}Z!Uu&K<=6SApUTB^dn`fhWUTL1I%yWZzZZXeo=DE{6tsbawsMhgEs}p}# z4^*1;xJj>;T;?l$wMjS0PT$vUNT0h);@Oh;Kiu)PbBjy-WiiSiOZ>mZV{5J5q@nmX zY>Ga+P5Mc5q@OZJ`WYqZ7XMi#>BY6Z9DA7qFLU5!4!q2PmpSk<2VUmD%N%%_121#n zWe&W|f&c9sIR3P%m9My{J>DMgF0X9g6}hb5{4<0fpJ;Aw-rUjBdTn#-nroY{>1^4w z%DMET@xH{W>({M9PUqFlSFhc$s%?|g9dL2Wzeu0+(JCp~wrSJGO%9^f5?$Z6zP0^& zVq#j2P21eoVbf|$DqP*Nb{%1tAid@4jhi|cNg&d?ZsX=QMqETzuingHBZD2AIybbo zbV%M6NVul0qiw@=%wCDu`fE3C?r4K^5AijOuWylXJHwqDOl%8c?Hy}2wY985YDe3a z=CvEvO4Z$w8CmN#wn}q)XJ&P7u$g_#+}yEgUE2m$y-T9kZ*JYVVKw6ej01Y@20^u( z(T{CfE3MF;h@g>co8gU}*Y3RO8fSlGQ_IJionJ>j(sEr(vvXHjtMl3Nj_cdonw@`- zI%S*M+MAt=J2tg!+SGD=bH~PJKs&dVITfwW^(;v4b#7{N2Fj#-VN$C6nvG%p_bZ&T zwW}R3V&L(CgtBJm(-CJd;*_^;1co~z@RB-vBI{dP*Q{!5cYah}?sT6B2WI!lxQ+2P za7v^Zd~j|DGW0aK(AnD2yb+z&*0I^iMZ)UPo{Dm30{*)4&1-LHb9R=2@^;e-=Tl{^ zE$h}fpDzR2*8uI*Yk8~2ZSV~E0i}wsmpR{J{_B}lgH++tBV`teWyOnSri$MbRq?!5 z@e)uBE(VH$GjZ#C6L06(DsC!wZb2Kf=dud8Aj_0B&CVU=B=6~Rrvgtj_xt6mH?_4n zkCu0CSi9w|=Q;ma@v*fV@Vq;U(r-cOv3J6!J9sz}X>MD+78#$7Ryboj%OcIr6p&oA z(dnx&MW3iph})xz;(LG`{0ty9`R^Is6-MuX05m&yS2#F2R};2XWvz z`#DH~Gxntr`dcVGgzt4!IJfTM{R!NiGE?zZQ{f{-Nfeo=b2AG3_-=v@4Dmjp_kWR; zVM&quzym~tkwXH$8+Cq!a((-l-~Eu>AC>##fU3N14aMC*(dY z_r8B4%x<}7ad*m<#QQCY-z_BZd#GXXNtPIu`vmUhulvNYvcZbR#zgx-q`NFzfqP^i zl9-B2MY<7*cSi;z3EaEmeUa+1nrvD3f~k|U#|)NFm95N1CSEmhJi*4w`XY@}kwjl) zu)I5xJz?zVv9k85qq-w~Wqp;|NcXY3%YIsR@k^156W!&B?r0(#X`h4BS_ zdlBn!!uUKqufka{K6mywPCK59ZiMd~&pw}ibg%`-UYVZ#g5y-<*)gEc4`3UL-*0R@ zMjN)##K(9V5`QTZujOk``1`zxXHA^ncwzZL9w5OV_X8PEoUC!~080FHjsL>Lr%e1e zHh+oc|H;I=FVOh0aObnUlhF9dCO*}m@zqsDJC@y2$I-)`aqAJzDMCT{()KQeLa=bbX~_RR`^ zG){gAKTZ5Z6Hjz#K2L@*f2vdCwI<%qEf@SPH*qJe@ei7K_C}4bHSzeTHU4oM-&G7> z{dXGonP1^J$2L>3^y+X#9@X#p!D5i`%Uu6tmO~J)@){Ga54dY{GJZv-Z zCq9P&{%*y^{6t2g&Y+3kYVt=-+%fw*KQZz6mlXba6JKezYmWsk;;X(*^G`SNAAers ze{JH<|Izs6Cf@f-jc>4V=o|iRHSs~Sk#~!U5Ae+g{QaYeccYK^caMqNZRj7^@}JQB zpPTqfLtg|PBK$GsUt!|arafnvcF(rPicIei4S~HzUAwR|NAEHnD|dkyw=2jW8y1K z98-nVH+F}XkDGX4;-{H-m4QFk#9b4Ahlvjv`1hLlfQes?IM{{%`gd(f{Q8pk_LBH# zOX6QIiT_hc{5vJ_`%B^nO5%@}#GfdMA1sMKQxbovB+g&AE^Kd2NxZfs&ciW<@bx8e zwY~(SRkKno%*LqwVaB;e7$MsQMn{aV@;grH@Pd>nRkVPrcqy$q@hAwJmrWY)~ z@|iQRl$M^glwIWI@o@Er1zK?e7Hh=`Shy7@EGdX{9a)5e2}LNFP=taBg(zf23g4G{ zun;KlU1`jEt%@9E;;$-7QJ0xX@=Fso9)SC28VlDoHc$ zC+l}=-fSFB*3)EMOfx)r;_X`7vJO6&=9X)&+0=Fo{b|bXO)VQXuS2xCWz#im1DsMS z+t;uj_Bm3%s+b&dimmYbxU)4XckdZT4Gw_UToZ9_-%nvLsLt=(`9vsBsA2iLs5 zy=7C&deq#Z@Xed~%tzOOF3^gmHXD3&@!2qHp^Hx%NWUfU2-c2`NTeod+px;Qwyc7G zQ)v8!*g98fZRib0;KZi{evF zZDvMr@+`>4`u2^W4K1J`l>(@OodJeckjTxLHq`M`plD{~6>6m!nS~l@eakg#TU8pw zzkdtv=W!9hSQn7Xw_#`qL%FtQuEnu>ggYESH E05ef%u>b%7 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.dylib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.dylib deleted file mode 120000 index 04debe8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.dylib +++ /dev/null @@ -1 +0,0 @@ -libffi.7.dylib \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.la deleted file mode 120000 index 004dbb5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.la +++ /dev/null @@ -1 +0,0 @@ -../libffi.la \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.lai b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.lai deleted file mode 100644 index d720fef..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi.lai +++ /dev/null @@ -1,41 +0,0 @@ -# libffi.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libffi.7.dylib' - -# Names of this library. -library_names='libffi.7.dylib libffi.dylib' - -# The name of the static archive. -old_library='' - -# Linker flags that cannot 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=8 -age=1 -revision=0 - -# 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.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi_convenience.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi_convenience.la deleted file mode 120000 index 0727452..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/.libs/libffi_convenience.la +++ /dev/null @@ -1 +0,0 @@ -../libffi_convenience.la \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/Makefile deleted file mode 100644 index 7e46b90..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/Makefile +++ /dev/null @@ -1,1809 +0,0 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. -# Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994-2014 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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -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-darwin18.6.0 -host_triplet = x86_64-apple-darwin18.6.0 -target_triplet = x86_64-apple-darwin18.6.0 -#am__append_1 = doc -#am__append_2 = src/debug.c -# Build debug. Define FFI_DEBUG on the commandline so that, when building with -# MSVC, it can link against the debug CRT. -#am__append_3 = -DFFI_DEBUG -subdir = . -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.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) -DIST_COMMON = $(srcdir)/Makefile.am $(top_srcdir)/configure \ - $(am__configure_deps) $(noinst_HEADERS) $(am__DIST_COMMON) -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__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(toolexeclibdir)" \ - "$(DESTDIR)$(pkgconfigdir)" -LTLIBRARIES = $(noinst_LTLIBRARIES) $(toolexeclib_LTLIBRARIES) -am__DEPENDENCIES_1 = -am__libffi_la_SOURCES_DIST = src/prep_cif.c src/types.c src/raw_api.c \ - src/java_raw_api.c src/closures.c src/debug.c -am__dirstamp = $(am__leading_dot)dirstamp -#am__objects_1 = src/debug.lo -am_libffi_la_OBJECTS = src/prep_cif.lo src/types.lo src/raw_api.lo \ - src/java_raw_api.lo src/closures.lo $(am__objects_1) -libffi_la_OBJECTS = $(am_libffi_la_OBJECTS) -AM_V_lt = $(am__v_lt_$(V)) -am__v_lt_ = $(am__v_lt_$(AM_DEFAULT_VERBOSITY)) -am__v_lt_0 = --silent -am__v_lt_1 = -libffi_la_LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(libffi_la_LDFLAGS) $(LDFLAGS) -o $@ -am__DEPENDENCIES_2 = $(am__DEPENDENCIES_1) -am__libffi_convenience_la_SOURCES_DIST = src/prep_cif.c src/types.c \ - src/raw_api.c src/java_raw_api.c src/closures.c src/debug.c -am__objects_2 = src/prep_cif.lo src/types.lo src/raw_api.lo \ - src/java_raw_api.lo src/closures.lo $(am__objects_1) -am_libffi_convenience_la_OBJECTS = $(am__objects_2) -nodist_libffi_convenience_la_OBJECTS = -libffi_convenience_la_OBJECTS = $(am_libffi_convenience_la_OBJECTS) \ - $(nodist_libffi_convenience_la_OBJECTS) -AM_V_P = $(am__v_P_$(V)) -am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) -am__v_at_0 = @ -am__v_at_1 = -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_V_lt) $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CCAS) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CCASFLAGS) $(CCASFLAGS) -AM_V_CPPAS = $(am__v_CPPAS_$(V)) -am__v_CPPAS_ = $(am__v_CPPAS_$(AM_DEFAULT_VERBOSITY)) -am__v_CPPAS_0 = @echo " CPPAS " $@; -am__v_CPPAS_1 = -COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ - $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -LTCOMPILE = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=compile $(CC) $(DEFS) \ - $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) \ - $(AM_CFLAGS) $(CFLAGS) -AM_V_CC = $(am__v_CC_$(V)) -am__v_CC_ = $(am__v_CC_$(AM_DEFAULT_VERBOSITY)) -am__v_CC_0 = @echo " CC " $@; -am__v_CC_1 = -CCLD = $(CC) -LINK = $(LIBTOOL) $(AM_V_lt) --tag=CC $(AM_LIBTOOLFLAGS) \ - $(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \ - $(AM_LDFLAGS) $(LDFLAGS) -o $@ -AM_V_CCLD = $(am__v_CCLD_$(V)) -am__v_CCLD_ = $(am__v_CCLD_$(AM_DEFAULT_VERBOSITY)) -am__v_CCLD_0 = @echo " CCLD " $@; -am__v_CCLD_1 = -SOURCES = $(libffi_la_SOURCES) $(EXTRA_libffi_la_SOURCES) \ - $(libffi_convenience_la_SOURCES) \ - $(EXTRA_libffi_convenience_la_SOURCES) \ - $(nodist_libffi_convenience_la_SOURCES) -DIST_SOURCES = $(am__libffi_la_SOURCES_DIST) \ - $(EXTRA_libffi_la_SOURCES) \ - $(am__libffi_convenience_la_SOURCES_DIST) \ - $(EXTRA_libffi_convenience_la_SOURCES) -RECURSIVE_TARGETS = all-recursive check-recursive cscopelist-recursive \ - ctags-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 \ - tags-recursive uninstall-recursive -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -DATA = $(pkgconfig_DATA) -HEADERS = $(noinst_HEADERS) -RECURSIVE_CLEAN_TARGETS = mostlyclean-recursive clean-recursive \ - distclean-recursive maintainer-clean-recursive -am__recursive_targets = \ - $(RECURSIVE_TARGETS) \ - $(RECURSIVE_CLEAN_TARGETS) \ - $(am__extra_recursive_targets) -AM_RECURSIVE_TARGETS = $(am__recursive_targets:-recursive=) TAGS CTAGS \ - cscope distdir dist dist-all distcheck -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) \ - $(LISP)fficonfig.h.in -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -CSCOPE = cscope -DIST_SUBDIRS = include testsuite man doc -am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/fficonfig.h.in \ - $(srcdir)/libffi.pc.in README compile config.guess config.sub \ - depcomp install-sh ltmain.sh missing -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -distdir = $(PACKAGE)-$(VERSION) -top_distdir = $(distdir) -am__remove_distdir = \ - if test -d "$(distdir)"; then \ - find "$(distdir)" -type d ! -perm -200 -exec chmod u+w {} ';' \ - && rm -rf "$(distdir)" \ - || { sleep 5 && rm -rf "$(distdir)"; }; \ - else :; fi -am__post_remove_distdir = $(am__remove_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 -DIST_TARGETS = dist-gzip -distuninstallcheck_listfiles = find . -type f -print -am__distuninstallcheck_listfiles = $(distuninstallcheck_listfiles) \ - | sed 's|^\./|$(prefix)/|' | grep -v '$(infodir)/dir$$' -distcleancheck_listfiles = find . -type f -print -ACLOCAL = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing aclocal-1.15 -ALLOCA = -AMTAR = $${TAR-tar} -AM_DEFAULT_VERBOSITY = 1 -AM_LTLDFLAGS = -AM_RUNTESTFLAGS = -AR = ar -AUTOCONF = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoconf -AUTOHEADER = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoheader -AUTOMAKE = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing automake-1.15 -AWK = awk -CC = xcrun clang -CCAS = xcrun clang -CCASDEPMODE = depmode=none -CCASFLAGS = -CCDEPMODE = depmode=none -CFLAGS = -Wall -fexceptions -CPP = xcrun clang -E -CPPFLAGS = -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=none -CXXFLAGS = -g -O2 -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 -HAVE_LONG_DOUBLE_VARIANT = 0 -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -LD = ld -LDFLAGS = -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LIPO = lipo -LN_S = ln -s -LTLIBOBJS = -LT_SYS_LIBRARY_PATH = -MAINT = # -MAKEINFO = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo -MANIFEST_TOOL = : -MKDIR_P = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d -NM = /usr/bin/nm -B -NMEDIT = nmedit -OBJDUMP = objdump -OBJEXT = o -OPT_LDFLAGS = -OTOOL = otool -OTOOL64 = : -PACKAGE = libffi -PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues -PACKAGE_NAME = libffi -PACKAGE_STRING = libffi 3.99999 -PACKAGE_TARNAME = libffi -PACKAGE_URL = -PACKAGE_VERSION = 3.99999 -PATH_SEPARATOR = : -PRTDIAG = -RANLIB = ranlib -SECTION_LDFLAGS = -SED = /usr/bin/sed -SET_MAKE = -SHELL = /bin/sh -STRIP = strip -TARGET = X86_64 -TARGETDIR = x86 -TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -VERSION = 3.99999 -abs_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18 -abs_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -abs_top_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18 -abs_top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -ac_ct_AR = ar -ac_ct_CC = xcrun clang -ac_ct_CXX = g++ -ac_ct_DUMPBIN = -am__include = include -am__leading_dot = . -am__quote = -am__tar = $${TAR-tar} chof - "$$tardir" -am__untar = $${TAR-tar} xf - -ax_enable_builddir_sed = sed -bindir = ${exec_prefix}/bin -build = x86_64-apple-darwin18.6.0 -build_alias = -build_cpu = x86_64 -build_os = darwin18.6.0 -build_vendor = apple -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host = x86_64-apple-darwin18.6.0 -host_alias = -host_cpu = x86_64 -host_os = darwin18.6.0 -host_vendor = apple -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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 = $(MKDIR_P) -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr/local -program_transform_name = s,x,x, -psdir = ${docdir} -runstatedir = ${localstatedir}/run -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -sys_symbol_underscore = yes -sysconfdir = ${prefix}/etc -target = x86_64-apple-darwin18.6.0 -target_alias = -target_cpu = x86_64 -target_os = darwin18.6.0 -target_vendor = apple -toolexecdir = ${exec_prefix}/lib/gcc-lib/$(target_alias) -toolexeclibdir = ${exec_prefix}/lib -top_build_prefix = -top_builddir = . -top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -AUTOMAKE_OPTIONS = foreign subdir-objects -ACLOCAL_AMFLAGS = -I m4 -SUBDIRS = include testsuite man $(am__append_1) -EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ - ChangeLog.libffi ChangeLog.libffi-3.1 \ - m4/libtool.m4 m4/lt~obsolete.m4 \ - m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ - m4/ltversion.m4 src/debug.c msvcc.sh \ - generate-darwin-source-and-headers.py \ - libffi.xcodeproj/project.pbxproj \ - libtool-ldflags libtool-version configure.host - - -# local.exp is generated by configure -DISTCLEANFILES = local.exp - -# 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)' - - -# Subdir rules rely on $(FLAGS_TO_PASS) -FLAGS_TO_PASS = $(AM_MAKEFLAGS) -MAKEOVERRIDES = -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libffi.pc -toolexeclib_LTLIBRARIES = libffi.la -noinst_LTLIBRARIES = libffi_convenience.la -libffi_la_SOURCES = src/prep_cif.c src/types.c src/raw_api.c \ - src/java_raw_api.c src/closures.c $(am__append_2) -noinst_HEADERS = \ - src/aarch64/ffitarget.h src/aarch64/internal.h \ - src/alpha/ffitarget.h src/alpha/internal.h \ - src/arc/ffitarget.h \ - src/arm/ffitarget.h src/arm/internal.h \ - src/avr32/ffitarget.h \ - src/bfin/ffitarget.h \ - src/cris/ffitarget.h \ - src/frv/ffitarget.h \ - src/ia64/ffitarget.h src/ia64/ia64_flags.h \ - src/m32r/ffitarget.h \ - src/m68k/ffitarget.h \ - src/m88k/ffitarget.h \ - src/metag/ffitarget.h \ - src/microblaze/ffitarget.h \ - src/mips/ffitarget.h \ - src/moxie/ffitarget.h \ - src/nios2/ffitarget.h \ - src/or1k/ffitarget.h \ - src/pa/ffitarget.h \ - src/powerpc/ffitarget.h src/powerpc/asm.h src/powerpc/ffi_powerpc.h \ - src/s390/ffitarget.h src/s390/internal.h \ - src/sh/ffitarget.h \ - src/sh64/ffitarget.h \ - src/sparc/ffitarget.h src/sparc/internal.h \ - src/tile/ffitarget.h \ - src/vax/ffitarget.h \ - src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h src/x86/asmnames.h \ - src/xtensa/ffitarget.h \ - src/dlmalloc.c - -EXTRA_libffi_la_SOURCES = \ - src/aarch64/ffi.c src/aarch64/sysv.S \ - src/alpha/ffi.c src/alpha/osf.S \ - src/arc/ffi.c src/arc/arcompact.S \ - src/arm/ffi.c src/arm/sysv.S \ - src/avr32/ffi.c src/avr32/sysv.S \ - src/bfin/ffi.c src/bfin/sysv.S \ - src/cris/ffi.c src/cris/sysv.S \ - src/frv/ffi.c src/frv/eabi.S \ - src/ia64/ffi.c src/ia64/unix.S \ - src/m32r/ffi.c src/m32r/sysv.S \ - src/m68k/ffi.c src/m68k/sysv.S \ - src/m88k/ffi.c src/m88k/obsd.S \ - src/metag/ffi.c src/metag/sysv.S \ - src/microblaze/ffi.c src/microblaze/sysv.S \ - src/mips/ffi.c src/mips/o32.S src/mips/n32.S \ - src/moxie/ffi.c src/moxie/eabi.S \ - src/nios2/ffi.c src/nios2/sysv.S \ - src/or1k/ffi.c src/or1k/sysv.S \ - src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ - src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \ - src/powerpc/sysv.S src/powerpc/linux64.S \ - src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ - src/powerpc/aix.S src/powerpc/darwin.S src/powerpc/aix_closure.S \ - src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \ - src/s390/ffi.c src/s390/sysv.S \ - src/sh/ffi.c src/sh/sysv.S \ - src/sh64/ffi.c src/sh64/sysv.S \ - src/sparc/ffi.c src/sparc/ffi64.c src/sparc/v8.S src/sparc/v9.S \ - src/tile/ffi.c src/tile/tile.S \ - src/vax/ffi.c src/vax/elfbsd.S \ - src/x86/ffi.c src/x86/sysv.S \ - src/x86/ffiw64.c src/x86/win64.S \ - src/x86/ffi64.c src/x86/unix64.S \ - src/xtensa/ffi.c src/xtensa/sysv.S - -libffi_la_LIBADD = $(TARGET_OBJ) -libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) -EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES) -libffi_convenience_la_LIBADD = $(libffi_la_LIBADD) -libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES) -nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) -LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) -AM_CFLAGS = $(am__append_3) -libffi_version_script = -##libffi_version_script = -Wl,--version-script,libffi.map -##libffi_version_script = -Wl,-M,libffi.map-sun -libffi_version_dep = -##libffi_version_dep = libffi.map -##libffi_version_dep = libffi.map-sun -libffi_version_info = -version-info `grep -v '^\#' $(srcdir)/libtool-version` -libffi_la_LDFLAGS = -no-undefined $(libffi_version_info) $(libffi_version_script) $(LTLDFLAGS) $(AM_LTLDFLAGS) -libffi_la_DEPENDENCIES = $(libffi_la_LIBADD) $(libffi_version_dep) -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 .lo .o .obj -am--refresh: Makefile - @: -$(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 -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 - @test -f $@ || rm -f stamp-h1 - @test -f $@ || $(MAKE) $(AM_MAKEFLAGS) stamp-h1 - -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 $@ - -clean-noinstLTLIBRARIES: - -test -z "$(noinst_LTLIBRARIES)" || rm -f $(noinst_LTLIBRARIES) - @list='$(noinst_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } - -install-toolexeclibLTLIBRARIES: $(toolexeclib_LTLIBRARIES) - @$(NORMAL_INSTALL) - @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ - list2=; for p in $$list; do \ - if test -f $$p; then \ - list2="$$list2 $$p"; \ - else :; fi; \ - done; \ - test -z "$$list2" || { \ - echo " $(MKDIR_P) '$(DESTDIR)$(toolexeclibdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(toolexeclibdir)" || exit 1; \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 '$(DESTDIR)$(toolexeclibdir)'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=install $(INSTALL) $(INSTALL_STRIP_FLAG) $$list2 "$(DESTDIR)$(toolexeclibdir)"; \ - } - -uninstall-toolexeclibLTLIBRARIES: - @$(NORMAL_UNINSTALL) - @list='$(toolexeclib_LTLIBRARIES)'; test -n "$(toolexeclibdir)" || list=; \ - for p in $$list; do \ - $(am__strip_dir) \ - echo " $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f '$(DESTDIR)$(toolexeclibdir)/$$f'"; \ - $(LIBTOOL) $(AM_LIBTOOLFLAGS) $(LIBTOOLFLAGS) --mode=uninstall rm -f "$(DESTDIR)$(toolexeclibdir)/$$f"; \ - done - -clean-toolexeclibLTLIBRARIES: - -test -z "$(toolexeclib_LTLIBRARIES)" || rm -f $(toolexeclib_LTLIBRARIES) - @list='$(toolexeclib_LTLIBRARIES)'; \ - locs=`for p in $$list; do echo $$p; done | \ - sed 's|^[^/]*$$|.|; s|/[^/]*$$||; s|$$|/so_locations|' | \ - sort -u`; \ - test -z "$$locs" || { \ - echo rm -f $${locs}; \ - rm -f $${locs}; \ - } -src/$(am__dirstamp): - @$(MKDIR_P) src - @: > src/$(am__dirstamp) -src/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/$(DEPDIR) - @: > 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/debug.lo: src/$(am__dirstamp) src/$(DEPDIR)/$(am__dirstamp) -src/aarch64/$(am__dirstamp): - @$(MKDIR_P) src/aarch64 - @: > src/aarch64/$(am__dirstamp) -src/aarch64/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/aarch64/$(DEPDIR) - @: > src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/aarch64/ffi.lo: src/aarch64/$(am__dirstamp) \ - src/aarch64/$(DEPDIR)/$(am__dirstamp) -src/aarch64/sysv.lo: src/aarch64/$(am__dirstamp) \ - src/aarch64/$(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/arc/$(am__dirstamp): - @$(MKDIR_P) src/arc - @: > src/arc/$(am__dirstamp) -src/arc/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/arc/$(DEPDIR) - @: > src/arc/$(DEPDIR)/$(am__dirstamp) -src/arc/ffi.lo: src/arc/$(am__dirstamp) \ - src/arc/$(DEPDIR)/$(am__dirstamp) -src/arc/arcompact.lo: src/arc/$(am__dirstamp) \ - src/arc/$(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/ffi.lo: src/arm/$(am__dirstamp) \ - src/arm/$(DEPDIR)/$(am__dirstamp) -src/arm/sysv.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/ffi.lo: src/avr32/$(am__dirstamp) \ - src/avr32/$(DEPDIR)/$(am__dirstamp) -src/avr32/sysv.lo: src/avr32/$(am__dirstamp) \ - src/avr32/$(DEPDIR)/$(am__dirstamp) -src/bfin/$(am__dirstamp): - @$(MKDIR_P) src/bfin - @: > src/bfin/$(am__dirstamp) -src/bfin/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/bfin/$(DEPDIR) - @: > src/bfin/$(DEPDIR)/$(am__dirstamp) -src/bfin/ffi.lo: src/bfin/$(am__dirstamp) \ - src/bfin/$(DEPDIR)/$(am__dirstamp) -src/bfin/sysv.lo: src/bfin/$(am__dirstamp) \ - src/bfin/$(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/ffi.lo: src/cris/$(am__dirstamp) \ - src/cris/$(DEPDIR)/$(am__dirstamp) -src/cris/sysv.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/ffi.lo: src/frv/$(am__dirstamp) \ - src/frv/$(DEPDIR)/$(am__dirstamp) -src/frv/eabi.lo: src/frv/$(am__dirstamp) \ - src/frv/$(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/ffi.lo: src/m32r/$(am__dirstamp) \ - src/m32r/$(DEPDIR)/$(am__dirstamp) -src/m32r/sysv.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/m88k/$(am__dirstamp): - @$(MKDIR_P) src/m88k - @: > src/m88k/$(am__dirstamp) -src/m88k/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/m88k/$(DEPDIR) - @: > src/m88k/$(DEPDIR)/$(am__dirstamp) -src/m88k/ffi.lo: src/m88k/$(am__dirstamp) \ - src/m88k/$(DEPDIR)/$(am__dirstamp) -src/m88k/obsd.lo: src/m88k/$(am__dirstamp) \ - src/m88k/$(DEPDIR)/$(am__dirstamp) -src/metag/$(am__dirstamp): - @$(MKDIR_P) src/metag - @: > src/metag/$(am__dirstamp) -src/metag/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/metag/$(DEPDIR) - @: > src/metag/$(DEPDIR)/$(am__dirstamp) -src/metag/ffi.lo: src/metag/$(am__dirstamp) \ - src/metag/$(DEPDIR)/$(am__dirstamp) -src/metag/sysv.lo: src/metag/$(am__dirstamp) \ - src/metag/$(DEPDIR)/$(am__dirstamp) -src/microblaze/$(am__dirstamp): - @$(MKDIR_P) src/microblaze - @: > src/microblaze/$(am__dirstamp) -src/microblaze/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/microblaze/$(DEPDIR) - @: > src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/microblaze/ffi.lo: src/microblaze/$(am__dirstamp) \ - src/microblaze/$(DEPDIR)/$(am__dirstamp) -src/microblaze/sysv.lo: src/microblaze/$(am__dirstamp) \ - src/microblaze/$(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/moxie/$(am__dirstamp): - @$(MKDIR_P) src/moxie - @: > src/moxie/$(am__dirstamp) -src/moxie/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/moxie/$(DEPDIR) - @: > src/moxie/$(DEPDIR)/$(am__dirstamp) -src/moxie/ffi.lo: src/moxie/$(am__dirstamp) \ - src/moxie/$(DEPDIR)/$(am__dirstamp) -src/moxie/eabi.lo: src/moxie/$(am__dirstamp) \ - src/moxie/$(DEPDIR)/$(am__dirstamp) -src/nios2/$(am__dirstamp): - @$(MKDIR_P) src/nios2 - @: > src/nios2/$(am__dirstamp) -src/nios2/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/nios2/$(DEPDIR) - @: > src/nios2/$(DEPDIR)/$(am__dirstamp) -src/nios2/ffi.lo: src/nios2/$(am__dirstamp) \ - src/nios2/$(DEPDIR)/$(am__dirstamp) -src/nios2/sysv.lo: src/nios2/$(am__dirstamp) \ - src/nios2/$(DEPDIR)/$(am__dirstamp) -src/or1k/$(am__dirstamp): - @$(MKDIR_P) src/or1k - @: > src/or1k/$(am__dirstamp) -src/or1k/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/or1k/$(DEPDIR) - @: > src/or1k/$(DEPDIR)/$(am__dirstamp) -src/or1k/ffi.lo: src/or1k/$(am__dirstamp) \ - src/or1k/$(DEPDIR)/$(am__dirstamp) -src/or1k/sysv.lo: src/or1k/$(am__dirstamp) \ - src/or1k/$(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/ffi.lo: src/pa/$(am__dirstamp) src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/linux.lo: src/pa/$(am__dirstamp) \ - src/pa/$(DEPDIR)/$(am__dirstamp) -src/pa/hpux32.lo: src/pa/$(am__dirstamp) \ - src/pa/$(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/ffi_sysv.lo: src/powerpc/$(am__dirstamp) \ - src/powerpc/$(DEPDIR)/$(am__dirstamp) -src/powerpc/ffi_linux64.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/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/ppc_closure.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/darwin.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_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/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/ffi.lo: src/s390/$(am__dirstamp) \ - src/s390/$(DEPDIR)/$(am__dirstamp) -src/s390/sysv.lo: src/s390/$(am__dirstamp) \ - src/s390/$(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/ffi.lo: src/sh/$(am__dirstamp) src/sh/$(DEPDIR)/$(am__dirstamp) -src/sh/sysv.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/ffi.lo: src/sh64/$(am__dirstamp) \ - src/sh64/$(DEPDIR)/$(am__dirstamp) -src/sh64/sysv.lo: src/sh64/$(am__dirstamp) \ - src/sh64/$(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/ffi64.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/tile/$(am__dirstamp): - @$(MKDIR_P) src/tile - @: > src/tile/$(am__dirstamp) -src/tile/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/tile/$(DEPDIR) - @: > src/tile/$(DEPDIR)/$(am__dirstamp) -src/tile/ffi.lo: src/tile/$(am__dirstamp) \ - src/tile/$(DEPDIR)/$(am__dirstamp) -src/tile/tile.lo: src/tile/$(am__dirstamp) \ - src/tile/$(DEPDIR)/$(am__dirstamp) -src/vax/$(am__dirstamp): - @$(MKDIR_P) src/vax - @: > src/vax/$(am__dirstamp) -src/vax/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/vax/$(DEPDIR) - @: > src/vax/$(DEPDIR)/$(am__dirstamp) -src/vax/ffi.lo: src/vax/$(am__dirstamp) \ - src/vax/$(DEPDIR)/$(am__dirstamp) -src/vax/elfbsd.lo: src/vax/$(am__dirstamp) \ - src/vax/$(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/ffiw64.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/ffi64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/x86/unix64.lo: src/x86/$(am__dirstamp) \ - src/x86/$(DEPDIR)/$(am__dirstamp) -src/xtensa/$(am__dirstamp): - @$(MKDIR_P) src/xtensa - @: > src/xtensa/$(am__dirstamp) -src/xtensa/$(DEPDIR)/$(am__dirstamp): - @$(MKDIR_P) src/xtensa/$(DEPDIR) - @: > src/xtensa/$(DEPDIR)/$(am__dirstamp) -src/xtensa/ffi.lo: src/xtensa/$(am__dirstamp) \ - src/xtensa/$(DEPDIR)/$(am__dirstamp) -src/xtensa/sysv.lo: src/xtensa/$(am__dirstamp) \ - src/xtensa/$(DEPDIR)/$(am__dirstamp) - -libffi.la: $(libffi_la_OBJECTS) $(libffi_la_DEPENDENCIES) $(EXTRA_libffi_la_DEPENDENCIES) - $(AM_V_CCLD)$(libffi_la_LINK) -rpath $(toolexeclibdir) $(libffi_la_OBJECTS) $(libffi_la_LIBADD) $(LIBS) - -libffi_convenience.la: $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_DEPENDENCIES) $(EXTRA_libffi_convenience_la_DEPENDENCIES) - $(AM_V_CCLD)$(LINK) $(libffi_convenience_la_OBJECTS) $(libffi_convenience_la_LIBADD) $(LIBS) - -mostlyclean-compile: - -rm -f *.$(OBJEXT) - -rm -f src/*.$(OBJEXT) - -rm -f src/*.lo - -rm -f src/aarch64/*.$(OBJEXT) - -rm -f src/aarch64/*.lo - -rm -f src/alpha/*.$(OBJEXT) - -rm -f src/alpha/*.lo - -rm -f src/arc/*.$(OBJEXT) - -rm -f src/arc/*.lo - -rm -f src/arm/*.$(OBJEXT) - -rm -f src/arm/*.lo - -rm -f src/avr32/*.$(OBJEXT) - -rm -f src/avr32/*.lo - -rm -f src/bfin/*.$(OBJEXT) - -rm -f src/bfin/*.lo - -rm -f src/cris/*.$(OBJEXT) - -rm -f src/cris/*.lo - -rm -f src/frv/*.$(OBJEXT) - -rm -f src/frv/*.lo - -rm -f src/ia64/*.$(OBJEXT) - -rm -f src/ia64/*.lo - -rm -f src/m32r/*.$(OBJEXT) - -rm -f src/m32r/*.lo - -rm -f src/m68k/*.$(OBJEXT) - -rm -f src/m68k/*.lo - -rm -f src/m88k/*.$(OBJEXT) - -rm -f src/m88k/*.lo - -rm -f src/metag/*.$(OBJEXT) - -rm -f src/metag/*.lo - -rm -f src/microblaze/*.$(OBJEXT) - -rm -f src/microblaze/*.lo - -rm -f src/mips/*.$(OBJEXT) - -rm -f src/mips/*.lo - -rm -f src/moxie/*.$(OBJEXT) - -rm -f src/moxie/*.lo - -rm -f src/nios2/*.$(OBJEXT) - -rm -f src/nios2/*.lo - -rm -f src/or1k/*.$(OBJEXT) - -rm -f src/or1k/*.lo - -rm -f src/pa/*.$(OBJEXT) - -rm -f src/pa/*.lo - -rm -f src/powerpc/*.$(OBJEXT) - -rm -f src/powerpc/*.lo - -rm -f src/s390/*.$(OBJEXT) - -rm -f src/s390/*.lo - -rm -f src/sh/*.$(OBJEXT) - -rm -f src/sh/*.lo - -rm -f src/sh64/*.$(OBJEXT) - -rm -f src/sh64/*.lo - -rm -f src/sparc/*.$(OBJEXT) - -rm -f src/sparc/*.lo - -rm -f src/tile/*.$(OBJEXT) - -rm -f src/tile/*.lo - -rm -f src/vax/*.$(OBJEXT) - -rm -f src/vax/*.lo - -rm -f src/x86/*.$(OBJEXT) - -rm -f src/x86/*.lo - -rm -f src/xtensa/*.$(OBJEXT) - -rm -f src/xtensa/*.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/aarch64/$(DEPDIR)/ffi.Plo -#include src/aarch64/$(DEPDIR)/sysv.Plo -#include src/alpha/$(DEPDIR)/ffi.Plo -#include src/alpha/$(DEPDIR)/osf.Plo -#include src/arc/$(DEPDIR)/arcompact.Plo -#include src/arc/$(DEPDIR)/ffi.Plo -#include src/arm/$(DEPDIR)/ffi.Plo -#include src/arm/$(DEPDIR)/sysv.Plo -#include src/avr32/$(DEPDIR)/ffi.Plo -#include src/avr32/$(DEPDIR)/sysv.Plo -#include src/bfin/$(DEPDIR)/ffi.Plo -#include src/bfin/$(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/m88k/$(DEPDIR)/ffi.Plo -#include src/m88k/$(DEPDIR)/obsd.Plo -#include src/metag/$(DEPDIR)/ffi.Plo -#include src/metag/$(DEPDIR)/sysv.Plo -#include src/microblaze/$(DEPDIR)/ffi.Plo -#include src/microblaze/$(DEPDIR)/sysv.Plo -#include src/mips/$(DEPDIR)/ffi.Plo -#include src/mips/$(DEPDIR)/n32.Plo -#include src/mips/$(DEPDIR)/o32.Plo -#include src/moxie/$(DEPDIR)/eabi.Plo -#include src/moxie/$(DEPDIR)/ffi.Plo -#include src/nios2/$(DEPDIR)/ffi.Plo -#include src/nios2/$(DEPDIR)/sysv.Plo -#include src/or1k/$(DEPDIR)/ffi.Plo -#include src/or1k/$(DEPDIR)/sysv.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)/ffi_linux64.Plo -#include src/powerpc/$(DEPDIR)/ffi_sysv.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)/ffi64.Plo -#include src/sparc/$(DEPDIR)/v8.Plo -#include src/sparc/$(DEPDIR)/v9.Plo -#include src/tile/$(DEPDIR)/ffi.Plo -#include src/tile/$(DEPDIR)/tile.Plo -#include src/vax/$(DEPDIR)/elfbsd.Plo -#include src/vax/$(DEPDIR)/ffi.Plo -#include src/x86/$(DEPDIR)/ffi.Plo -#include src/x86/$(DEPDIR)/ffi64.Plo -#include src/x86/$(DEPDIR)/ffiw64.Plo -#include src/x86/$(DEPDIR)/sysv.Plo -#include src/x86/$(DEPDIR)/unix64.Plo -#include src/x86/$(DEPDIR)/win64.Plo -#include src/xtensa/$(DEPDIR)/ffi.Plo -#include src/xtensa/$(DEPDIR)/sysv.Plo - -.S.o: -# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CPPAS)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) - $(AM_V_CPPAS)$(CPPASCOMPILE) -c -o $@ $< - -.S.obj: -# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -# $(CPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CPPAS)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) - $(AM_V_CPPAS)$(CPPASCOMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.S.lo: -# $(AM_V_CPPAS)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -# $(LTCPPASCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Plo -# $(AM_V_CPPAS)source='$<' object='$@' libtool=yes -# DEPDIR=$(DEPDIR) $(CCASDEPMODE) $(depcomp) - $(AM_V_CPPAS)$(LTCPPASCOMPILE) -c -o $@ $< - -.c.o: -# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.o$$||'`;\ -# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CC)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) - $(AM_V_CC)$(COMPILE) -c -o $@ $< - -.c.obj: -# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.obj$$||'`;\ -# $(COMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ `$(CYGPATH_W) '$<'` &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Po -# $(AM_V_CC)source='$<' object='$@' libtool=no -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) - $(AM_V_CC)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` - -.c.lo: -# $(AM_V_CC)depbase=`echo $@ | sed 's|[^/]*$$|$(DEPDIR)/&|;s|\.lo$$||'`;\ -# $(LTCOMPILE) -MT $@ -MD -MP -MF $$depbase.Tpo -c -o $@ $< &&\ -# $(am__mv) $$depbase.Tpo $$depbase.Plo -# $(AM_V_CC)source='$<' object='$@' libtool=yes -# DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) - $(AM_V_CC)$(LTCOMPILE) -c -o $@ $< - -mostlyclean-libtool: - -rm -f *.lo - -clean-libtool: - -rm -rf .libs _libs - -rm -rf src/.libs src/_libs - -rm -rf src/aarch64/.libs src/aarch64/_libs - -rm -rf src/alpha/.libs src/alpha/_libs - -rm -rf src/arc/.libs src/arc/_libs - -rm -rf src/arm/.libs src/arm/_libs - -rm -rf src/avr32/.libs src/avr32/_libs - -rm -rf src/bfin/.libs src/bfin/_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/m88k/.libs src/m88k/_libs - -rm -rf src/metag/.libs src/metag/_libs - -rm -rf src/microblaze/.libs src/microblaze/_libs - -rm -rf src/mips/.libs src/mips/_libs - -rm -rf src/moxie/.libs src/moxie/_libs - -rm -rf src/nios2/.libs src/nios2/_libs - -rm -rf src/or1k/.libs src/or1k/_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/tile/.libs src/tile/_libs - -rm -rf src/vax/.libs src/vax/_libs - -rm -rf src/x86/.libs src/x86/_libs - -rm -rf src/xtensa/.libs src/xtensa/_libs - -distclean-libtool: - -rm -f libtool config.lt -install-pkgconfigDATA: $(pkgconfig_DATA) - @$(NORMAL_INSTALL) - @list='$(pkgconfig_DATA)'; test -n "$(pkgconfigdir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(pkgconfigdir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(pkgconfigdir)" || exit 1; \ - fi; \ - 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|^.*/||'`; \ - dir='$(DESTDIR)$(pkgconfigdir)'; $(am__uninstall_files_from_dir) - -# 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. -$(am__recursive_targets): - @fail=; \ - if $(am__make_keepgoing); then \ - failcom='fail=yes'; \ - else \ - failcom='exit 1'; \ - fi; \ - dot_seen=no; \ - target=`echo $@ | sed s/-recursive//`; \ - case "$@" in \ - distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ - *) list='$(SUBDIRS)' ;; \ - esac; \ - 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" - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-recursive -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - 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; \ - $(am__define_uniq_tagged_files); \ - 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-recursive - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - 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" -cscope: cscope.files - test ! -s cscope.files \ - || $(CSCOPE) -b -q $(AM_CSCOPEFLAGS) $(CSCOPEFLAGS) -i cscope.files $(CSCOPE_ARGS) -clean-cscope: - -rm -f cscope.files -cscope.files: clean-cscope cscopelist -cscopelist: cscopelist-recursive - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -distclean-tags: - -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags - -rm -f cscope.out cscope.in.out cscope.po.out cscope.files - -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 \ - $(am__make_dryrun) \ - || test -d "$(distdir)/$$subdir" \ - || $(MKDIR_P) "$(distdir)/$$subdir" \ - || exit 1; \ - 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-hook - -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__post_remove_distdir) - -dist-bzip2: distdir - tardir=$(distdir) && $(am__tar) | BZIP2=$${BZIP2--9} bzip2 -c >$(distdir).tar.bz2 - $(am__post_remove_distdir) - -dist-lzip: distdir - tardir=$(distdir) && $(am__tar) | lzip -c $${LZIP_OPT--9} >$(distdir).tar.lz - $(am__post_remove_distdir) - -dist-xz: distdir - tardir=$(distdir) && $(am__tar) | XZ_OPT=$${XZ_OPT--e} xz -c >$(distdir).tar.xz - $(am__post_remove_distdir) - -dist-tarZ: distdir - @echo WARNING: "Support for distribution archives compressed with" \ - "legacy program 'compress' is deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - tardir=$(distdir) && $(am__tar) | compress -c >$(distdir).tar.Z - $(am__post_remove_distdir) - -dist-shar: distdir - @echo WARNING: "Support for shar distribution archives is" \ - "deprecated." >&2 - @echo WARNING: "It will be removed altogether in Automake 2.0" >&2 - shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz - $(am__post_remove_distdir) - -dist-zip: distdir - -rm -f $(distdir).zip - zip -rq $(distdir).zip $(distdir) - $(am__post_remove_distdir) - -dist dist-all: - $(MAKE) $(AM_MAKEFLAGS) $(DIST_TARGETS) am__post_remove_distdir='@:' - $(am__post_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.lz*) \ - lzip -dc $(distdir).tar.lz | $(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 u+w $(distdir) - mkdir $(distdir)/_build $(distdir)/_build/sub $(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/sub \ - && ../../configure \ - $(AM_DISTCHECK_CONFIGURE_FLAGS) \ - $(DISTCHECK_CONFIGURE_FLAGS) \ - --srcdir=../.. --prefix="$$dc_install_base" \ - && $(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__post_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: - @test -n '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: trying to run $@ with an empty' \ - '$$(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - $(am__cd) '$(distuninstallcheck_dir)' || { \ - echo 'ERROR: cannot chdir into $(distuninstallcheck_dir)' >&2; \ - exit 1; \ - }; \ - test `$(am__distuninstallcheck_listfiles) | wc -l` -eq 0 \ - || { 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 $(LTLIBRARIES) $(DATA) $(HEADERS) fficonfig.h -installdirs: installdirs-recursive -installdirs-am: - for dir in "$(DESTDIR)$(toolexeclibdir)" "$(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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -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 src/$(DEPDIR)/$(am__dirstamp) - -rm -f src/$(am__dirstamp) - -rm -f src/aarch64/$(DEPDIR)/$(am__dirstamp) - -rm -f src/aarch64/$(am__dirstamp) - -rm -f src/alpha/$(DEPDIR)/$(am__dirstamp) - -rm -f src/alpha/$(am__dirstamp) - -rm -f src/arc/$(DEPDIR)/$(am__dirstamp) - -rm -f src/arc/$(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/bfin/$(DEPDIR)/$(am__dirstamp) - -rm -f src/bfin/$(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/m88k/$(DEPDIR)/$(am__dirstamp) - -rm -f src/m88k/$(am__dirstamp) - -rm -f src/metag/$(DEPDIR)/$(am__dirstamp) - -rm -f src/metag/$(am__dirstamp) - -rm -f src/microblaze/$(DEPDIR)/$(am__dirstamp) - -rm -f src/microblaze/$(am__dirstamp) - -rm -f src/mips/$(DEPDIR)/$(am__dirstamp) - -rm -f src/mips/$(am__dirstamp) - -rm -f src/moxie/$(DEPDIR)/$(am__dirstamp) - -rm -f src/moxie/$(am__dirstamp) - -rm -f src/nios2/$(DEPDIR)/$(am__dirstamp) - -rm -f src/nios2/$(am__dirstamp) - -rm -f src/or1k/$(DEPDIR)/$(am__dirstamp) - -rm -f src/or1k/$(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/tile/$(DEPDIR)/$(am__dirstamp) - -rm -f src/tile/$(am__dirstamp) - -rm -f src/vax/$(DEPDIR)/$(am__dirstamp) - -rm -f src/vax/$(am__dirstamp) - -rm -f src/x86/$(DEPDIR)/$(am__dirstamp) - -rm -f src/x86/$(am__dirstamp) - -rm -f src/xtensa/$(DEPDIR)/$(am__dirstamp) - -rm -f src/xtensa/$(am__dirstamp) - -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-recursive - -clean-am: clean-generic clean-libtool clean-noinstLTLIBRARIES \ - clean-toolexeclibLTLIBRARIES mostlyclean-am - -distclean: distclean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) - -rm -f Makefile -distclean-am: clean-am distclean-compile distclean-generic \ - distclean-hdr distclean-libtool distclean-tags - -dvi: dvi-recursive - -dvi-am: - -html: html-recursive - -html-am: - -info: info-recursive - -info-am: - -install-data-am: install-pkgconfigDATA - -install-dvi: install-dvi-recursive - -install-dvi-am: - -install-exec-am: install-toolexeclibLTLIBRARIES - -install-html: install-html-recursive - -install-html-am: - -install-info: install-info-recursive - -install-info-am: - -install-man: - -install-pdf: install-pdf-recursive - -install-pdf-am: - -install-ps: install-ps-recursive - -install-ps-am: - -installcheck-am: - -maintainer-clean: maintainer-clean-recursive - -rm -f $(am__CONFIG_DISTCLEAN_FILES) - -rm -rf $(top_srcdir)/autom4te.cache - -rm -rf src/$(DEPDIR) src/aarch64/$(DEPDIR) src/alpha/$(DEPDIR) src/arc/$(DEPDIR) src/arm/$(DEPDIR) src/avr32/$(DEPDIR) src/bfin/$(DEPDIR) src/cris/$(DEPDIR) src/frv/$(DEPDIR) src/ia64/$(DEPDIR) src/m32r/$(DEPDIR) src/m68k/$(DEPDIR) src/m88k/$(DEPDIR) src/metag/$(DEPDIR) src/microblaze/$(DEPDIR) src/mips/$(DEPDIR) src/moxie/$(DEPDIR) src/nios2/$(DEPDIR) src/or1k/$(DEPDIR) src/pa/$(DEPDIR) src/powerpc/$(DEPDIR) src/s390/$(DEPDIR) src/sh/$(DEPDIR) src/sh64/$(DEPDIR) src/sparc/$(DEPDIR) src/tile/$(DEPDIR) src/vax/$(DEPDIR) src/x86/$(DEPDIR) src/xtensa/$(DEPDIR) - -rm -f Makefile -maintainer-clean-am: distclean-am maintainer-clean-generic - -mostlyclean: mostlyclean-recursive - -mostlyclean-am: mostlyclean-compile mostlyclean-generic \ - mostlyclean-libtool - -pdf: pdf-recursive - -pdf-am: - -ps: ps-recursive - -ps-am: - -uninstall-am: uninstall-pkgconfigDATA uninstall-toolexeclibLTLIBRARIES - -.MAKE: $(am__recursive_targets) all install-am install-strip - -.PHONY: $(am__recursive_targets) CTAGS GTAGS TAGS all all-am \ - am--refresh check check-am clean clean-cscope clean-generic \ - clean-libtool clean-noinstLTLIBRARIES \ - clean-toolexeclibLTLIBRARIES cscope cscopelist-am ctags \ - ctags-am dist dist-all dist-bzip2 dist-gzip dist-hook \ - dist-lzip 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-man \ - install-pdf install-pdf-am install-pkgconfigDATA install-ps \ - install-ps-am install-strip install-toolexeclibLTLIBRARIES \ - installcheck installcheck-am installdirs installdirs-am \ - maintainer-clean maintainer-clean-generic mostlyclean \ - mostlyclean-compile mostlyclean-generic mostlyclean-libtool \ - pdf pdf-am ps ps-am tags tags-am uninstall uninstall-am \ - uninstall-pkgconfigDATA uninstall-toolexeclibLTLIBRARIES - -.PRECIOUS: Makefile - -##libffi.map-sun : libffi.map $(top_srcdir)/../contrib/make_sunver.pl \ -## $(libffi_la_OBJECTS) $(libffi_la_LIBADD) -## perl $(top_srcdir)/../contrib/make_sunver.pl libffi.map \ -## `echo $(libffi_la_OBJECTS) $(libffi_la_LIBADD) | \ -## sed 's,\([^/ ]*\)\.l\([ao]\),.libs/\1.\2,g'` \ -## > $@ || (rm -f $@ ; exit 1) - -libffi.map: $(top_srcdir)/libffi.map.in - $(COMPILE) -D$(TARGET) -E -x assembler-with-cpp -o $@ $< - -dist-hook: - if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog - -# 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.25/ext/ffi_c/libffi-universal-darwin18/config.log b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/config.log deleted file mode 100644 index 2e7d0d4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/config.log +++ /dev/null @@ -1,1318 +0,0 @@ -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.99999, which was -generated by GNU Autoconf 2.69. Invocation command line was - - $ /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure --disable-static --with-pic=yes --disable-dependency-tracking --disable-docs --host= - -## --------- ## -## Platform. ## -## --------- ## - -hostname = ip-145-116-155-146.wlan-int.ru.nl -uname -m = x86_64 -uname -r = 18.6.0 -uname -s = Darwin -uname -v = Darwin Kernel Version 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/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 18.6.0: Thu Apr 25 23:16:27 PDT 2019; root:xnu-4903.261.4~2/RELEASE_X86_64 -Kernel configured for up to 6 processors. -6 processors are physically available. -6 processors are logically available. -Processor type: x86_64h (Intel x86-64h Haswell) -Processors active: 0 1 2 3 4 5 -Primary memory available: 16.00 gigabytes -Default processor set: 443 tasks, 2363 threads, 6 processors -Load average: 2.68, Mach factor: 3.31 -/bin/machine = unknown -/usr/bin/oslevel = unknown -/bin/universe = unknown - -PATH: /Users/hanna/Library/Android/sdk/tools -PATH: /Users/hanna/Library/Android/sdk/platform-tools -PATH: /Users/hanna/Android/flutter/bin -PATH: /Users/hanna/go/bin -PATH: /Users/hanna/Library/Android/sdk/tools -PATH: /Users/hanna/Library/Android/sdk/platform-tools -PATH: /Users/hanna/Android/flutter/bin -PATH: /bin -PATH: /usr/local/bin -PATH: /usr/bin -PATH: /bin -PATH: /usr/sbin -PATH: /sbin -PATH: /usr/local/go/bin -PATH: /usr/local/MacGPG2/bin -PATH: /Users/hanna/development/flutter/bin - - -## ----------- ## -## Core tests. ## -## ----------- ## - -configure:2704: checking build system type -configure:2718: result: x86_64-apple-darwin18.6.0 -configure:2738: checking host system type -configure:2751: result: x86_64-apple-darwin18.6.0 -configure:2771: checking target system type -configure:2784: result: x86_64-apple-darwin18.6.0 -configure:2881: checking for gsed -configure:2912: result: sed -configure:2940: checking for a BSD-compatible install -configure:3008: result: /usr/bin/install -c -configure:3019: checking whether build environment is sane -configure:3074: result: yes -configure:3222: checking for a thread-safe mkdir -p -configure:3261: result: /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d -configure:3268: checking for gawk -configure:3298: result: no -configure:3268: checking for mawk -configure:3298: result: no -configure:3268: checking for nawk -configure:3298: result: no -configure:3268: checking for awk -configure:3284: found /usr/bin/awk -configure:3295: result: awk -configure:3306: checking whether make sets $(MAKE) -configure:3328: result: yes -configure:3357: checking whether make supports nested variables -configure:3374: result: yes -configure:3559: checking for gcc -configure:3586: result: xcrun clang -configure:3815: checking for C compiler version -configure:3824: xcrun clang --version >&5 -Apple LLVM version 10.0.1 (clang-1001.0.46.4) -Target: x86_64-apple-darwin18.6.0 -Thread model: posix -InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin -configure:3835: $? = 0 -configure:3824: xcrun clang -v >&5 -Apple LLVM version 10.0.1 (clang-1001.0.46.4) -Target: x86_64-apple-darwin18.6.0 -Thread model: posix -InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin -configure:3835: $? = 0 -configure:3824: xcrun clang -V >&5 -clang: error: unsupported option '-V -Wno-atomic-implicit-seq-cst' -clang: error: no input files -configure:3835: $? = 1 -configure:3824: xcrun clang -qversion >&5 -clang: error: unknown argument '-qversion', did you mean '--version'? -clang: error: no input files -configure:3835: $? = 1 -configure:3855: checking whether the C compiler works -configure:3877: xcrun clang conftest.c >&5 -configure:3881: $? = 0 -configure:3929: result: yes -configure:3932: checking for C compiler default output file name -configure:3934: result: a.out -configure:3940: checking for suffix of executables -configure:3947: xcrun clang -o conftest conftest.c >&5 -configure:3951: $? = 0 -configure:3973: result: -configure:3995: checking whether we are cross compiling -configure:4003: xcrun clang -o conftest conftest.c >&5 -configure:4007: $? = 0 -configure:4014: ./conftest -configure:4018: $? = 0 -configure:4033: result: no -configure:4038: checking for suffix of object files -configure:4060: xcrun clang -c conftest.c >&5 -configure:4064: $? = 0 -configure:4085: result: o -configure:4089: checking whether we are using the GNU C compiler -configure:4108: xcrun clang -c conftest.c >&5 -configure:4108: $? = 0 -configure:4117: result: yes -configure:4126: checking whether xcrun clang accepts -g -configure:4146: xcrun clang -c -g conftest.c >&5 -configure:4146: $? = 0 -configure:4187: result: yes -configure:4204: checking for xcrun clang option to accept ISO C89 -configure:4267: xcrun clang -c conftest.c >&5 -configure:4267: $? = 0 -configure:4280: result: none needed -configure:4305: checking whether xcrun clang understands -c and -o together -configure:4327: xcrun clang -c conftest.c -o conftest2.o -configure:4330: $? = 0 -configure:4327: xcrun clang -c conftest.c -o conftest2.o -configure:4330: $? = 0 -configure:4342: result: yes -configure:4370: checking for style of include used by make -configure:4398: result: GNU -configure:4424: checking dependency style of xcrun clang -configure:4535: result: none -configure:4608: checking for g++ -configure:4624: found /usr/bin/g++ -configure:4635: result: g++ -configure:4662: checking for C++ compiler version -configure:4671: g++ --version >&5 -Apple LLVM version 10.0.1 (clang-1001.0.46.4) -Target: x86_64-apple-darwin18.6.0 -Thread model: posix -InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin -Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1 -configure:4682: $? = 0 -configure:4671: g++ -v >&5 -Configured with: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX10.14.sdk/usr/include/c++/4.2.1 -Apple LLVM version 10.0.1 (clang-1001.0.46.4) -Target: x86_64-apple-darwin18.6.0 -Thread model: posix -InstalledDir: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin -configure:4682: $? = 0 -configure:4671: g++ -V >&5 -clang: error: unsupported option '-V -Wno-atomic-implicit-seq-cst' -clang: error: no input files -configure:4682: $? = 1 -configure:4671: g++ -qversion >&5 -clang: error: unknown argument '-qversion', did you mean '--version'? -clang: error: no input files -configure:4682: $? = 1 -configure:4686: checking whether we are using the GNU C++ compiler -configure:4705: g++ -c conftest.cpp >&5 -configure:4705: $? = 0 -configure:4714: result: yes -configure:4723: checking whether g++ accepts -g -configure:4743: g++ -c -g conftest.cpp >&5 -configure:4743: $? = 0 -configure:4784: result: yes -configure:4809: checking dependency style of g++ -configure:4920: result: none -configure:4950: checking dependency style of xcrun clang -configure:5059: result: none -configure:5121: checking how to print strings -configure:5148: result: printf -configure:5169: checking for a sed that does not truncate output -configure:5233: result: /usr/bin/sed -configure:5251: checking for grep that handles long lines and -e -configure:5309: result: /usr/bin/grep -configure:5314: checking for egrep -configure:5376: result: /usr/bin/grep -E -configure:5381: checking for fgrep -configure:5443: result: /usr/bin/grep -F -configure:5478: checking for ld used by xcrun clang -configure:5545: result: ld -configure:5552: checking if the linker (ld) is GNU ld -configure:5567: result: no -configure:5579: checking for BSD- or MS-compatible name lister (nm) -configure:5633: result: /usr/bin/nm -B -configure:5763: checking the name lister (/usr/bin/nm -B) interface -configure:5770: xcrun clang -c conftest.c >&5 -configure:5773: /usr/bin/nm -B "conftest.o" -configure:5776: output -0000000000000000 S _some_variable -configure:5783: result: BSD nm -configure:5786: checking whether ln -s works -configure:5790: result: yes -configure:5798: checking the maximum length of command line arguments -configure:5929: result: 196608 -configure:5977: checking how to convert x86_64-apple-darwin18.6.0 file names to x86_64-apple-darwin18.6.0 format -configure:6017: result: func_convert_file_noop -configure:6024: checking how to convert x86_64-apple-darwin18.6.0 file names to toolchain format -configure:6044: result: func_convert_file_noop -configure:6051: checking for ld option to reload object files -configure:6058: result: -r -configure:6132: checking for objdump -configure:6148: found /usr/bin/objdump -configure:6159: result: objdump -configure:6191: checking how to recognize dependent libraries -configure:6391: result: pass_all -configure:6476: checking for dlltool -configure:6506: result: no -configure:6536: checking how to associate runtime and link libraries -configure:6563: result: printf %s\n -configure:6624: checking for ar -configure:6640: found /usr/bin/ar -configure:6651: result: ar -configure:6688: checking for archiver @FILE support -configure:6705: xcrun clang -c conftest.c >&5 -configure:6705: $? = 0 -configure:6708: ar cru libconftest.a @conftest.lst >&5 -ar: @conftest.lst: No such file or directory -configure:6711: $? = 1 -configure:6731: result: no -configure:6789: checking for strip -configure:6805: found /usr/bin/strip -configure:6816: result: strip -configure:6888: checking for ranlib -configure:6904: found /usr/bin/ranlib -configure:6915: result: ranlib -configure:7017: checking command to parse /usr/bin/nm -B output from xcrun clang object -configure:7170: xcrun clang -c conftest.c >&5 -configure:7173: $? = 0 -configure:7177: /usr/bin/nm -B 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:7180: $? = 0 -cannot find nm_test_var in conftest.nm -configure:7170: xcrun clang -c conftest.c >&5 -configure:7173: $? = 0 -configure:7177: /usr/bin/nm -B 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:7180: $? = 0 -configure:7246: xcrun clang -o conftest conftest.c conftstm.o >&5 -configure:7249: $? = 0 -configure:7287: result: ok -configure:7334: checking for sysroot -configure:7364: result: no -configure:7371: checking for a working dd -configure:7409: result: /bin/dd -configure:7413: checking how to truncate binary pipes -configure:7428: result: /bin/dd bs=4096 count=1 -configure:7757: checking for mt -configure:7787: result: no -configure:7807: checking if : is a manifest tool -configure:7813: : '-?' -configure:7821: result: no -configure:7877: checking for dsymutil -configure:7893: found /usr/bin/dsymutil -configure:7904: result: dsymutil -configure:7969: checking for nmedit -configure:7985: found /usr/bin/nmedit -configure:7996: result: nmedit -configure:8061: checking for lipo -configure:8077: found /usr/bin/lipo -configure:8088: result: lipo -configure:8153: checking for otool -configure:8169: found /usr/bin/otool -configure:8180: result: otool -configure:8245: checking for otool64 -configure:8275: result: no -configure:8320: checking for -single_module linker flag -xcrun clang -o libconftest.dylib -dynamiclib -Wl,-single_module conftest.c -configure:8353: result: yes -configure:8356: checking for -exported_symbols_list linker flag -configure:8376: xcrun clang -o conftest -Wl,-exported_symbols_list,conftest.sym conftest.c >&5 -configure:8376: $? = 0 -configure:8386: result: yes -configure:8389: checking for -force_load linker flag -xcrun clang -c -o conftest.o conftest.c -ar cru libconftest.a conftest.o -ranlib libconftest.a -xcrun clang -o conftest conftest.c -Wl,-force_load,./libconftest.a -configure:8421: result: yes -configure:8498: checking how to run the C preprocessor -configure:8529: xcrun clang -E conftest.c -configure:8529: $? = 0 -configure:8543: xcrun clang -E conftest.c -conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found -#include - ^~~~~~~~~~~~~~~~~~ -1 error generated. -configure:8543: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| /* end confdefs.h. */ -| #include -configure:8568: result: xcrun clang -E -configure:8588: xcrun clang -E conftest.c -configure:8588: $? = 0 -configure:8602: xcrun clang -E conftest.c -conftest.c:11:10: fatal error: 'ac_nonexistent.h' file not found -#include - ^~~~~~~~~~~~~~~~~~ -1 error generated. -configure:8602: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| /* end confdefs.h. */ -| #include -configure:8631: checking for ANSI C header files -configure:8651: xcrun clang -c conftest.c >&5 -configure:8651: $? = 0 -configure:8724: xcrun clang -o conftest conftest.c >&5 -configure:8724: $? = 0 -configure:8724: ./conftest -configure:8724: $? = 0 -configure:8735: result: yes -configure:8748: checking for sys/types.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for sys/stat.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for stdlib.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for string.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for memory.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for strings.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for inttypes.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for stdint.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8748: checking for unistd.h -configure:8748: xcrun clang -c conftest.c >&5 -configure:8748: $? = 0 -configure:8748: result: yes -configure:8762: checking for dlfcn.h -configure:8762: xcrun clang -c conftest.c >&5 -configure:8762: $? = 0 -configure:8762: result: yes -configure:9029: checking for objdir -configure:9044: result: .libs -configure:9308: checking if xcrun clang supports -fno-rtti -fno-exceptions -configure:9326: xcrun clang -c -fno-rtti -fno-exceptions conftest.c >&5 -configure:9330: $? = 0 -configure:9343: result: yes -configure:9701: checking for xcrun clang option to produce PIC -configure:9708: result: -fno-common -DPIC -configure:9716: checking if xcrun clang PIC flag -fno-common -DPIC works -configure:9734: xcrun clang -c -fno-common -DPIC -DPIC conftest.c >&5 -configure:9738: $? = 0 -configure:9751: result: yes -configure:9780: checking if xcrun clang static flag -static works -configure:9808: result: no -configure:9823: checking if xcrun clang supports -c -o file.o -configure:9844: xcrun clang -c -o out/conftest2.o conftest.c >&5 -configure:9848: $? = 0 -configure:9870: result: yes -configure:9878: checking if xcrun clang supports -c -o file.o -configure:9925: result: yes -configure:9958: checking whether the xcrun clang linker (ld) supports shared libraries -configure:11221: result: yes -configure:11461: checking dynamic linker characteristics -configure:12291: result: darwin18.6.0 dyld -configure:12413: checking how to hardcode library paths into programs -configure:12438: result: immediate -configure:12986: checking whether stripping libraries is possible -configure:13000: result: yes -configure:13026: checking if libtool supports shared libraries -configure:13028: result: yes -configure:13031: checking whether to build shared libraries -configure:13056: result: yes -configure:13059: checking whether to build static libraries -configure:13063: result: no -configure:13086: checking how to run the C++ preprocessor -configure:13113: g++ -E conftest.cpp -configure:13113: $? = 0 -configure:13127: g++ -E conftest.cpp -conftest.cpp:23:10: fatal error: 'ac_nonexistent.h' file not found -#include - ^~~~~~~~~~~~~~~~~~ -1 error generated. -configure:13127: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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. */ -| #include -configure:13152: result: g++ -E -configure:13172: g++ -E conftest.cpp -configure:13172: $? = 0 -configure:13186: g++ -E conftest.cpp -conftest.cpp:23:10: fatal error: 'ac_nonexistent.h' file not found -#include - ^~~~~~~~~~~~~~~~~~ -1 error generated. -configure:13186: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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. */ -| #include -configure:13348: checking for ld used by g++ -configure:13415: result: ld -configure:13422: checking if the linker (ld) is GNU ld -configure:13437: result: no -configure:13492: checking whether the g++ linker (ld) supports shared libraries -configure:14565: result: yes -configure:14601: g++ -c -g -O2 conftest.cpp >&5 -configure:14604: $? = 0 -configure:15085: checking for g++ option to produce PIC -configure:15092: result: -fno-common -DPIC -configure:15100: checking if g++ PIC flag -fno-common -DPIC works -configure:15118: g++ -c -g -O2 -fno-common -DPIC -DPIC conftest.cpp >&5 -configure:15122: $? = 0 -configure:15135: result: yes -configure:15158: checking if g++ static flag -static works -configure:15186: result: no -configure:15198: checking if g++ supports -c -o file.o -configure:15219: g++ -c -g -O2 -o out/conftest2.o conftest.cpp >&5 -configure:15223: $? = 0 -configure:15245: result: yes -configure:15250: checking if g++ supports -c -o file.o -configure:15297: result: yes -configure:15327: checking whether the g++ linker (ld) supports shared libraries -configure:15370: result: yes -configure:15511: checking dynamic linker characteristics -configure:16268: result: darwin18.6.0 dyld -configure:16333: checking how to hardcode library paths into programs -configure:16358: result: immediate -configure:16426: checking size of size_t -configure:16431: xcrun clang -o conftest conftest.c >&5 -configure:16431: $? = 0 -configure:16431: ./conftest -configure:16431: $? = 0 -configure:16445: result: 8 -configure:16456: checking for C compiler vendor -configure:16501: xcrun clang -c conftest.c >&5 -conftest.c:30:9: error: use of undeclared identifier 'thisisanerror' - thisisanerror; - ^ -1 error generated. -configure:16501: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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 SIZEOF_SIZE_T 8 -| /* end confdefs.h. */ -| -| int -| main () -| { -| -| #if !(defined(__ICC) || defined(__ECC) || defined(__INTEL_COMPILER)) -| thisisanerror; -| #endif -| -| ; -| return 0; -| } -configure:16501: xcrun clang -c conftest.c >&5 -conftest.c:30:9: error: use of undeclared identifier 'thisisanerror' - thisisanerror; - ^ -1 error generated. -configure:16501: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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 SIZEOF_SIZE_T 8 -| /* end confdefs.h. */ -| -| int -| main () -| { -| -| #if !(defined(__xlc__) || defined(__xlC__) || defined(__IBMC__) || defined(__IBMCPP__)) -| thisisanerror; -| #endif -| -| ; -| return 0; -| } -configure:16501: xcrun clang -c conftest.c >&5 -conftest.c:30:9: error: use of undeclared identifier 'thisisanerror' - thisisanerror; - ^ -1 error generated. -configure:16501: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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 SIZEOF_SIZE_T 8 -| /* end confdefs.h. */ -| -| int -| main () -| { -| -| #if !(defined(__PATHCC__) || defined(__PATHSCALE__)) -| thisisanerror; -| #endif -| -| ; -| return 0; -| } -configure:16501: xcrun clang -c conftest.c >&5 -configure:16501: $? = 0 -configure:16509: result: clang -configure:17335: : CFLAGS already contains -configure:17338: $? = 0 -configure:17360: checking CFLAGS for maximum warnings -configure:17380: xcrun clang -c -warn all -warn all conftest.c >&5 -clang: error: unknown argument: '-warn' -clang: error: unknown argument: '-warn' -clang: error: no such file or directory: 'all' -clang: error: no such file or directory: 'all' -configure:17380: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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 SIZEOF_SIZE_T 8 -| /* end confdefs.h. */ -| -| int -| main () -| { -| -| ; -| return 0; -| } -configure:17380: xcrun clang -c -pedantic -Wall conftest.c >&5 -configure:17380: $? = 0 -configure:17388: result: -Wall -configure:17404: : CFLAGS="$CFLAGS $ac_cv_cflags_warn_all" -configure:17407: $? = 0 -configure:17437: checking whether to enable maintainer-specific portions of Makefiles -configure:17446: result: no -configure:17462: checking sys/mman.h usability -configure:17462: xcrun clang -c -Wall -fexceptions conftest.c >&5 -configure:17462: $? = 0 -configure:17462: result: yes -configure:17462: checking sys/mman.h presence -configure:17462: xcrun clang -E conftest.c -configure:17462: $? = 0 -configure:17462: result: yes -configure:17462: checking for sys/mman.h -configure:17462: result: yes -configure:17475: checking for mmap -configure:17475: xcrun clang -o conftest -Wall -fexceptions conftest.c >&5 -configure:17475: $? = 0 -configure:17475: result: yes -configure:17475: checking for mkostemp -configure:17475: xcrun clang -o conftest -Wall -fexceptions conftest.c >&5 -configure:17475: $? = 0 -configure:17475: result: yes -configure:17485: checking for sys/mman.h -configure:17485: result: yes -configure:17493: checking for mmap -configure:17493: result: yes -configure:17506: checking whether read-only mmap of a plain file works -configure:17523: result: yes -configure:17525: checking whether mmap from /dev/zero works -configure:17547: result: no -configure:17551: checking for MAP_ANON(YMOUS) -configure:17574: xcrun clang -c -Wall -fexceptions conftest.c >&5 -conftest.c:38:5: warning: unused variable 'n' [-Wunused-variable] -int n = MAP_ANONYMOUS; - ^ -1 warning generated. -configure:17574: $? = 0 -configure:17581: result: yes -configure:17587: checking whether mmap with MAP_ANON(YMOUS) works -configure:17604: result: yes -configure:17647: checking for ANSI C header files -configure:17751: result: yes -configure:17761: checking for memcpy -configure:17761: xcrun clang -o conftest -Wall -fexceptions conftest.c >&5 -conftest.c:53:6: warning: incompatible redeclaration of library function 'memcpy' [-Wincompatible-library-redeclaration] -char memcpy (); - ^ -conftest.c:53:6: note: 'memcpy' is a builtin with type 'void *(void *, const void *, unsigned long)' -1 warning generated. -configure:17761: $? = 0 -configure:17761: result: yes -configure:17770: checking for size_t -configure:17770: xcrun clang -c -Wall -fexceptions conftest.c >&5 -configure:17770: $? = 0 -configure:17770: xcrun clang -c -Wall -fexceptions conftest.c >&5 -conftest.c:67:21: error: expected expression -if (sizeof ((size_t))) - ^ -1 error generated. -configure:17770: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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 SIZEOF_SIZE_T 8 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_MMAP 1 -| #define HAVE_MKOSTEMP 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:17770: result: yes -configure:17783: checking for working alloca.h -configure:17800: xcrun clang -o conftest -Wall -fexceptions conftest.c >&5 -configure:17800: $? = 0 -configure:17808: result: yes -configure:17816: checking for alloca -configure:17853: xcrun clang -o conftest -Wall -fexceptions conftest.c >&5 -configure:17853: $? = 0 -configure:17861: result: yes -configure:17972: checking size of double -configure:17977: xcrun clang -o conftest -Wall -fexceptions conftest.c >&5 -configure:17977: $? = 0 -configure:17977: ./conftest -configure:17977: $? = 0 -configure:17991: result: 8 -configure:18005: checking size of long double -configure:18010: xcrun clang -o conftest -Wall -fexceptions conftest.c >&5 -configure:18010: $? = 0 -configure:18010: ./conftest -configure:18010: $? = 0 -configure:18024: result: 16 -configure:18057: checking whether byte ordering is bigendian -configure:18072: xcrun clang -c -Wall -fexceptions conftest.c >&5 -configure:18072: $? = 0 -configure:18117: xcrun clang -c -Wall -fexceptions conftest.c >&5 -configure:18117: $? = 0 -configure:18135: xcrun clang -c -Wall -fexceptions conftest.c >&5 -conftest.c:43:4: error: use of undeclared identifier 'not' - not big endian - ^ -1 error generated. -configure:18135: $? = 1 -configure: failed program was: -| /* confdefs.h */ -| #define PACKAGE_NAME "libffi" -| #define PACKAGE_TARNAME "libffi" -| #define PACKAGE_VERSION "3.99999" -| #define PACKAGE_STRING "libffi 3.99999" -| #define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -| #define PACKAGE_URL "" -| #define PACKAGE "libffi" -| #define VERSION "3.99999" -| #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 SIZEOF_SIZE_T 8 -| #define HAVE_SYS_MMAN_H 1 -| #define HAVE_MMAP 1 -| #define HAVE_MKOSTEMP 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:18263: result: no -configure:18282: checking assembler .cfi pseudo-op support -configure:18300: xcrun clang -c -Wall -fexceptions conftest.c >&5 -configure:18300: $? = 0 -configure:18308: result: yes -configure:18395: checking assembler supports pc related relocs -configure:18408: result: yes -configure:18454: checking for _ prefix in compiled symbols -configure:18464: xcrun clang -c -Wall -fexceptions conftest.c >&5 -conftest.c:2:12: warning: expression result unused [-Wunused-value] -int main(){nm_test_func;return 0;} - ^~~~~~~~~~~~ -1 warning generated. -configure:18467: $? = 0 -configure:18471: /usr/bin/nm -B 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:18474: $? = 0 -configure:18496: result: yes -configure:18532: checking toolchain supports unwind section type -configure:18561: result: no -configure:18571: checking whether .eh_frame section should be read-only -configure:18593: result: no -configure:18608: checking for __attribute__((visibility("hidden"))) -configure:18617: xcrun clang -Werror -S conftest.c -o conftest.s 1>&5 -configure:18620: $? = 0 -configure:18629: result: no -configure:18768: checking for ld used by xcrun clang -configure:18835: result: ld -configure:18842: checking if the linker (ld) is GNU ld -configure:18857: result: no -configure:19170: versioning on shared library symbols is no -configure:19294: checking that generated files are newer than configure -configure:19300: result: done -configure:19368: creating ./config.status - -## ---------------------- ## -## Running config.status. ## -## ---------------------- ## - -This file was extended by libffi config.status 3.99999, which was -generated by GNU Autoconf 2.69. Invocation command line was - - CONFIG_FILES = - CONFIG_HEADERS = - CONFIG_LINKS = - CONFIG_COMMANDS = - $ ./config.status - -on ip-145-116-155-146.wlan-int.ru.nl - -config.status:1228: creating include/Makefile -config.status:1228: creating include/ffi.h -config.status:1228: creating Makefile -config.status:1228: creating testsuite/Makefile -config.status:1228: creating man/Makefile -config.status:1228: creating doc/Makefile -config.status:1228: creating libffi.pc -config.status:1228: creating fficonfig.h -config.status:1454: linking /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffitarget.h to include/ffitarget.h -config.status:1473: executing buildir commands -config.status:1486: skipping top_srcdir/Makefile - not created -config.status:1473: executing depfiles commands -config.status:1473: executing libtool commands -config.status:1473: executing include commands -config.status:1473: executing src commands - -## ---------------- ## -## Cache variables. ## -## ---------------- ## - -ac_cv_build=x86_64-apple-darwin18.6.0 -ac_cv_c_bigendian=no -ac_cv_c_compiler_gnu=yes -ac_cv_cflags_warn_all=-Wall -ac_cv_cxx_compiler_gnu=yes -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_CXXCPP_set= -ac_cv_env_CXXCPP_value= -ac_cv_env_LT_SYS_LIBRARY_PATH_set= -ac_cv_env_LT_SYS_LIBRARY_PATH_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= -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_mkostemp=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-darwin18.6.0 -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_path_lt_DD=/bin/dd -ac_cv_prog_AWK=awk -ac_cv_prog_CPP='xcrun clang -E' -ac_cv_prog_CXXCPP='g++ -E' -ac_cv_prog_ac_ct_AR=ar -ac_cv_prog_ac_ct_CC='xcrun clang' -ac_cv_prog_ac_ct_CXX=g++ -ac_cv_prog_ac_ct_DSYMUTIL=dsymutil -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_cxx_g=yes -ac_cv_prog_make_make_set=yes -ac_cv_sizeof_double=8 -ac_cv_sizeof_long_double=16 -ac_cv_sizeof_size_t=8 -ac_cv_target=x86_64-apple-darwin18.6.0 -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 -am_cv_CXX_dependencies_compiler_type=none -am_cv_make_support_nested_variables=yes -am_cv_prog_cc_c_o=yes -ax_cv_c_compiler_vendor=clang -gcc_cv_as_cfi_pseudo_op=yes -libffi_cv_as_x86_64_unwind_section_type=no -libffi_cv_as_x86_pcrel=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=ld -lt_cv_path_LDCXX=ld -lt_cv_path_NM='/usr/bin/nm -B' -lt_cv_path_mainfest_tool=no -lt_cv_prog_compiler_c_o=yes -lt_cv_prog_compiler_c_o_CXX=yes -lt_cv_prog_compiler_pic='-fno-common -DPIC' -lt_cv_prog_compiler_pic_CXX='-fno-common -DPIC' -lt_cv_prog_compiler_pic_works=yes -lt_cv_prog_compiler_pic_works_CXX=yes -lt_cv_prog_compiler_rtti_exceptions=yes -lt_cv_prog_compiler_static_works=no -lt_cv_prog_compiler_static_works_CXX=no -lt_cv_prog_gnu_ld=no -lt_cv_prog_gnu_ldcxx=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][BCDEGRST]* .* \(.*\)$/ {"\1", (void *) \&\1},/p'\''' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \(.*\) .*$/ {"\1", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST][BCDEGRST]* .* \(lib.*\)$/ {"\1", (void *) \&\1},/p'\'' -e '\''s/^[BCDEGRST][BCDEGRST]* .* \(.*\)$/ {"lib\1", (void *) \&\1},/p'\''' -lt_cv_sys_global_symbol_to_cdecl='sed -n -e '\''s/^T .* \(.*\)$/extern int \1();/p'\'' -e '\''s/^[BCDEGRST][BCDEGRST]* .* \(.*\)$/extern char \1;/p'\''' -lt_cv_sys_global_symbol_to_import= -lt_cv_sys_max_cmd_len=196608 -lt_cv_sys_symbol_underscore=yes -lt_cv_to_host_file_cmd=func_convert_file_noop -lt_cv_to_tool_file_cmd=func_convert_file_noop -lt_cv_truncate_bin='/bin/dd bs=4096 count=1' - -## ----------------- ## -## Output variables. ## -## ----------------- ## - -ACLOCAL='${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing aclocal-1.15' -ALLOCA='' -AMDEPBACKSLASH='' -AMDEP_FALSE='' -AMDEP_TRUE='#' -AMTAR='$${TAR-tar}' -AM_BACKSLASH='\' -AM_DEFAULT_V='$(AM_DEFAULT_VERBOSITY)' -AM_DEFAULT_VERBOSITY='1' -AM_LTLDFLAGS='' -AM_RUNTESTFLAGS='' -AM_V='$(V)' -AR='ar' -AUTOCONF='${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoconf' -AUTOHEADER='${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoheader' -AUTOMAKE='${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing automake-1.15' -AWK='awk' -BUILD_DOCS_FALSE='' -BUILD_DOCS_TRUE='#' -CC='xcrun clang' -CCAS='xcrun clang' -CCASDEPMODE='depmode=none' -CCASFLAGS='' -CCDEPMODE='depmode=none' -CFLAGS=' -Wall -fexceptions' -CPP='xcrun clang -E' -CPPFLAGS='' -CXX='g++' -CXXCPP='g++ -E' -CXXDEPMODE='depmode=none' -CXXFLAGS='-g -O2' -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' -GREP='/usr/bin/grep' -HAVE_LONG_DOUBLE='1' -HAVE_LONG_DOUBLE_VARIANT='0' -INSTALL_DATA='${INSTALL} -m 644' -INSTALL_PROGRAM='${INSTALL}' -INSTALL_SCRIPT='${INSTALL}' -INSTALL_STRIP_PROGRAM='$(install_sh) -c -s' -LD='ld' -LDFLAGS='' -LIBFFI_BUILD_VERSIONED_SHLIB_FALSE='' -LIBFFI_BUILD_VERSIONED_SHLIB_GNU_FALSE='' -LIBFFI_BUILD_VERSIONED_SHLIB_GNU_TRUE='#' -LIBFFI_BUILD_VERSIONED_SHLIB_SUN_FALSE='' -LIBFFI_BUILD_VERSIONED_SHLIB_SUN_TRUE='#' -LIBFFI_BUILD_VERSIONED_SHLIB_TRUE='#' -LIBOBJS='' -LIBS='' -LIBTOOL='$(SHELL) $(top_builddir)/libtool' -LIPO='lipo' -LN_S='ln -s' -LTLIBOBJS='' -LT_SYS_LIBRARY_PATH='' -MAINT='#' -MAINTAINER_MODE_FALSE='' -MAINTAINER_MODE_TRUE='#' -MAKEINFO='${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo' -MANIFEST_TOOL=':' -MKDIR_P='/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d' -NM='/usr/bin/nm -B' -NMEDIT='nmedit' -OBJDUMP='objdump' -OBJEXT='o' -OPT_LDFLAGS='' -OTOOL64=':' -OTOOL='otool' -PACKAGE='libffi' -PACKAGE_BUGREPORT='http://github.com/libffi/libffi/issues' -PACKAGE_NAME='libffi' -PACKAGE_STRING='libffi 3.99999' -PACKAGE_TARNAME='libffi' -PACKAGE_URL='' -PACKAGE_VERSION='3.99999' -PATH_SEPARATOR=':' -PRTDIAG='' -RANLIB='ranlib' -SECTION_LDFLAGS='' -SED='/usr/bin/sed' -SET_MAKE='' -SHELL='/bin/sh' -STRIP='strip' -TARGET='X86_64' -TARGETDIR='x86' -TARGET_OBJ=' src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo' -TESTSUBDIR_FALSE='#' -TESTSUBDIR_TRUE='' -VERSION='3.99999' -ac_ct_AR='ar' -ac_ct_CC='xcrun clang' -ac_ct_CXX='g++' -ac_ct_DUMPBIN='' -am__EXEEXT_FALSE='' -am__EXEEXT_TRUE='#' -am__fastdepCCAS_FALSE='' -am__fastdepCCAS_TRUE='#' -am__fastdepCC_FALSE='' -am__fastdepCC_TRUE='#' -am__fastdepCXX_FALSE='' -am__fastdepCXX_TRUE='#' -am__include='include' -am__isrc=' -I$(srcdir)' -am__leading_dot='.' -am__nodep='' -am__quote='' -am__tar='$${TAR-tar} chof - "$$tardir"' -am__untar='$${TAR-tar} xf -' -ax_enable_builddir_sed='sed' -bindir='${exec_prefix}/bin' -build='x86_64-apple-darwin18.6.0' -build_alias='' -build_cpu='x86_64' -build_os='darwin18.6.0' -build_vendor='apple' -datadir='${datarootdir}' -datarootdir='${prefix}/share' -docdir='${datarootdir}/doc/${PACKAGE_TARNAME}' -dvidir='${docdir}' -exec_prefix='${prefix}' -host='x86_64-apple-darwin18.6.0' -host_alias='' -host_cpu='x86_64' -host_os='darwin18.6.0' -host_vendor='apple' -htmldir='${docdir}' -includedir='${prefix}/include' -infodir='${datarootdir}/info' -install_sh='${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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='$(MKDIR_P)' -oldincludedir='/usr/include' -pdfdir='${docdir}' -prefix='/usr/local' -program_transform_name='s,x,x,' -psdir='${docdir}' -runstatedir='${localstatedir}/run' -sbindir='${exec_prefix}/sbin' -sharedstatedir='${prefix}/com' -sys_symbol_underscore='yes' -sysconfdir='${prefix}/etc' -target='x86_64-apple-darwin18.6.0' -target_alias='' -target_cpu='x86_64' -target_os='darwin18.6.0' -target_vendor='apple' -toolexecdir='${exec_prefix}/lib/gcc-lib/$(target_alias)' -toolexeclibdir='${exec_prefix}/lib' - -## ----------- ## -## confdefs.h. ## -## ----------- ## - -/* confdefs.h */ -#define PACKAGE_NAME "libffi" -#define PACKAGE_TARNAME "libffi" -#define PACKAGE_VERSION "3.99999" -#define PACKAGE_STRING "libffi 3.99999" -#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" -#define PACKAGE_URL "" -#define PACKAGE "libffi" -#define VERSION "3.99999" -#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 SIZEOF_SIZE_T 8 -#define HAVE_SYS_MMAN_H 1 -#define HAVE_MMAP 1 -#define HAVE_MKOSTEMP 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 HAVE_AS_X86_PCREL 1 -#define SYMBOL_UNDERSCORE 1 -#define FFI_MMAP_EXEC_WRIT 1 -#define EH_FRAME_FLAGS "aw" - -configure: exit 0 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/config.status b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/config.status deleted file mode 100755 index d7426d4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/config.status +++ /dev/null @@ -1,2436 +0,0 @@ -#! /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 -pR'. - ln -s conf$$.file conf$$.dir 2>/dev/null && test ! -f conf$$.exe || - as_ln_s='cp -pR' - elif ln conf$$.file conf$$ 2>/dev/null; then - as_ln_s=ln - else - as_ln_s='cp -pR' - fi -else - as_ln_s='cp -pR' -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 - - -# as_fn_executable_p FILE -# ----------------------- -# Test if FILE is an executable regular file. -as_fn_executable_p () -{ - test -f "$1" && test -x "$1" -} # as_fn_executable_p -as_test_x='test -x' -as_executable_p=as_fn_executable_p - -# 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.99999, which was -generated by GNU Autoconf 2.69. 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 doc/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' '--disable-docs' '--host=' 'host_alias='" -ac_cs_version="\ -libffi config.status 3.99999 -configured by /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure, generated by GNU Autoconf 2.69, - with options \"$ac_cs_config\" - -Copyright (C) 2012 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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18' -srcdir='/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi' -INSTALL='/usr/bin/install -c' -MKDIR_P='/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure' '--disable-static' '--with-pic=yes' '--disable-dependency-tracking' '--disable-docs' '--host=' 'host_alias=' $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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi" # /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -ax_enable_builddir_host="" # / x86_64-apple-darwin18.6.0 -ax_enable_builddir_version="3.99999" # 3.99999 -ax_enable_builddir_package="libffi" # libffi -ax_enable_builddir_auxdir="/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi" # -ax_enable_builddir_sed="sed" # /usr/bin/sed -ax_enable_builddir="." # - -AMDEP_TRUE="#" ac_aux_dir="/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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.6' -macro_revision='2.4.6' -enable_shared='yes' -enable_static='no' -pic_mode='yes' -enable_fast_install='needless' -shared_archive_member_spec='' -SHELL='/bin/sh' -ECHO='printf %s\n' -PATH_SEPARATOR=':' -host_alias='' -host='x86_64-apple-darwin18.6.0' -host_os='darwin18.6.0' -build_alias='' -build='x86_64-apple-darwin18.6.0' -build_os='darwin18.6.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='ld' -NM='/usr/bin/nm -B' -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 $tool_oldlib' -old_postuninstall_cmds='' -old_archive_cmds='$AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $tool_oldlib' -lock_old_archive_extraction='yes' -CC='xcrun clang' -CFLAGS=' -Wall -fexceptions' -compiler='g++' -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][BCDEGRST]* .* \(.*\)$/extern char \1;/p'\''' -lt_cv_sys_global_symbol_to_import='' -lt_cv_sys_global_symbol_to_c_name_address='sed -n -e '\''s/^: \(.*\) .*$/ {"\1", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST][BCDEGRST]* .* \(.*\)$/ {"\1", (void *) \&\1},/p'\''' -lt_cv_sys_global_symbol_to_c_name_address_lib_prefix='sed -n -e '\''s/^: \(.*\) .*$/ {"\1", (void *) 0},/p'\'' -e '\''s/^[BCDEGRST][BCDEGRST]* .* \(lib.*\)$/ {"\1", (void *) \&\1},/p'\'' -e '\''s/^[BCDEGRST][BCDEGRST]* .* \(.*\)$/ {"lib\1", (void *) \&\1},/p'\''' -lt_cv_nm_interface='BSD nm' -nm_file_list_spec='' -lt_sysroot='' -lt_cv_truncate_bin='/bin/dd bs=4096 count=1' -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-undefined ${wl}dynamic_lookup' -no_undefined_flag='' -hardcode_libdir_flag_spec='' -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/10.0.1 /usr/local/lib' -configure_time_dlsearch_path='/usr/local/lib /lib /usr/lib' -configure_time_lt_sys_library_path='' -hardcode_action='immediate' -enable_dlopen='unknown' -enable_dlopen_self='unknown' -enable_dlopen_self_static='unknown' -old_striplib='strip -S' -striplib='strip -x' -compiler_lib_search_dirs='' -predep_objects='' -postdep_objects='' -predeps='' -postdeps='' -compiler_lib_search_path='' -LD_CXX='ld' -reload_flag_CXX=' -r' -reload_cmds_CXX='$LTCC $LTCFLAGS -nostdlib $wl-r -o $output$reload_objs' -old_archive_cmds_CXX='$AR $AR_FLAGS $oldlib$oldobjs~$RANLIB $tool_oldlib' -compiler_CXX='g++' -GCC_CXX='yes' -lt_prog_compiler_no_builtin_flag_CXX=' -fno-builtin' -lt_prog_compiler_pic_CXX=' -fno-common -DPIC' -lt_prog_compiler_wl_CXX='-Wl,' -lt_prog_compiler_static_CXX='' -lt_cv_prog_compiler_c_o_CXX='yes' -archive_cmds_need_lc_CXX='no' -enable_shared_with_static_runtimes_CXX='no' -export_dynamic_flag_spec_CXX='' -whole_archive_flag_spec_CXX='`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_CXX='no' -old_archive_from_new_cmds_CXX='' -old_archive_from_expsyms_cmds_CXX='' -archive_cmds_CXX='$CC -dynamiclib $allow_undefined_flag -o $lib $libobjs $deplibs $compiler_flags -install_name $rpath/$soname $verstring $single_module' -archive_expsym_cmds_CXX='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_CXX='$CC $allow_undefined_flag -o $lib -bundle $libobjs $deplibs $compiler_flags' -module_expsym_cmds_CXX='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_CXX='no' -allow_undefined_flag_CXX='$wl-undefined ${wl}dynamic_lookup' -no_undefined_flag_CXX='' -hardcode_libdir_flag_spec_CXX='' -hardcode_libdir_separator_CXX='' -hardcode_direct_CXX='no' -hardcode_direct_absolute_CXX='no' -hardcode_minus_L_CXX='no' -hardcode_shlibpath_var_CXX='unsupported' -hardcode_automatic_CXX='yes' -inherit_rpath_CXX='no' -link_all_deplibs_CXX='yes' -always_export_symbols_CXX='no' -export_symbols_cmds_CXX='$NM $libobjs $convenience | $global_symbol_pipe | $SED '\''s/.* //'\'' | sort | uniq > $export_symbols' -exclude_expsyms_CXX='_GLOBAL_OFFSET_TABLE_|_GLOBAL__F[ID]_.*' -include_expsyms_CXX='' -prelink_cmds_CXX='' -postlink_cmds_CXX='' -file_list_spec_CXX='' -hardcode_action_CXX='immediate' -compiler_lib_search_dirs_CXX='' -predep_objects_CXX='' -postdep_objects_CXX='' -predeps_CXX='' -postdeps_CXX='' -compiler_lib_search_path_CXX='' - -LTCC='xcrun clang' -LTCFLAGS='' -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 PATH_SEPARATOR 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_import lt_cv_sys_global_symbol_to_c_name_address lt_cv_sys_global_symbol_to_c_name_address_lib_prefix lt_cv_nm_interface nm_file_list_spec lt_cv_truncate_bin 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_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 compiler_lib_search_dirs predep_objects postdep_objects predeps postdeps compiler_lib_search_path LD_CXX reload_flag_CXX compiler_CXX lt_prog_compiler_no_builtin_flag_CXX lt_prog_compiler_pic_CXX lt_prog_compiler_wl_CXX lt_prog_compiler_static_CXX lt_cv_prog_compiler_c_o_CXX export_dynamic_flag_spec_CXX whole_archive_flag_spec_CXX compiler_needs_object_CXX with_gnu_ld_CXX allow_undefined_flag_CXX no_undefined_flag_CXX hardcode_libdir_flag_spec_CXX hardcode_libdir_separator_CXX exclude_expsyms_CXX include_expsyms_CXX file_list_spec_CXX compiler_lib_search_dirs_CXX predep_objects_CXX postdep_objects_CXX predeps_CXX postdeps_CXX compiler_lib_search_path_CXX; do - case `eval \\$ECHO \\""\\$$var"\\"` in - *[\\\`\"\$]*) - eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED \"\$sed_quote_subst\"\`\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - 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 configure_time_dlsearch_path configure_time_lt_sys_library_path reload_cmds_CXX old_archive_cmds_CXX old_archive_from_new_cmds_CXX old_archive_from_expsyms_cmds_CXX archive_cmds_CXX archive_expsym_cmds_CXX module_cmds_CXX module_expsym_cmds_CXX export_symbols_cmds_CXX prelink_cmds_CXX postlink_cmds_CXX; do - case `eval \\$ECHO \\""\\$$var"\\"` in - *[\\\`\"\$]*) - eval "lt_$var=\\\"\`\$ECHO \"\$$var\" | \$SED -e \"\$double_quote_subst\" -e \"\$sed_quote_subst\" -e \"\$delay_variable_subst\"\`\\\"" ## exclude from sc_prohibit_nested_quotes - ;; - *) - eval "lt_$var=\\\"\$$var\\\"" - ;; - esac -done - -ac_aux_dir='/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi' - -# See if we are running on zsh, and set the options that 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.99999' - 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" ;; - "doc/Makefile") CONFIG_FILES="$CONFIG_FILES doc/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["LIBFFI_BUILD_VERSIONED_SHLIB_SUN_FALSE"]="" -S["LIBFFI_BUILD_VERSIONED_SHLIB_SUN_TRUE"]="#" -S["LIBFFI_BUILD_VERSIONED_SHLIB_GNU_FALSE"]="" -S["LIBFFI_BUILD_VERSIONED_SHLIB_GNU_TRUE"]="#" -S["LIBFFI_BUILD_VERSIONED_SHLIB_FALSE"]="" -S["LIBFFI_BUILD_VERSIONED_SHLIB_TRUE"]="#" -S["OPT_LDFLAGS"]="" -S["SECTION_LDFLAGS"]="" -S["toolexeclibdir"]="${exec_prefix}/lib" -S["toolexecdir"]="${exec_prefix}/lib/gcc-lib/$(target_alias)" -S["FFI_DEBUG_FALSE"]="" -S["FFI_DEBUG_TRUE"]="#" -S["TARGET_OBJ"]=" src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo" -S["TARGETDIR"]="x86" -S["TARGET"]="X86_64" -S["BUILD_DOCS_FALSE"]="" -S["BUILD_DOCS_TRUE"]="#" -S["FFI_EXEC_TRAMPOLINE_TABLE"]="0" -S["FFI_EXEC_TRAMPOLINE_TABLE_FALSE"]="" -S["FFI_EXEC_TRAMPOLINE_TABLE_TRUE"]="#" -S["sys_symbol_underscore"]="yes" -S["HAVE_LONG_DOUBLE_VARIANT"]="0" -S["HAVE_LONG_DOUBLE"]="1" -S["ALLOCA"]="" -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["CXXCPP"]="g++ -E" -S["CPP"]="xcrun clang -E" -S["LT_SYS_LIBRARY_PATH"]="" -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"]="/usr/bin/nm -B" -S["ac_ct_DUMPBIN"]="" -S["DUMPBIN"]="" -S["LD"]="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"]="" -S["CCAS"]="xcrun clang" -S["am__fastdepCXX_FALSE"]="" -S["am__fastdepCXX_TRUE"]="#" -S["CXXDEPMODE"]="depmode=none" -S["ac_ct_CXX"]="g++" -S["CXXFLAGS"]="-g -O2" -S["CXX"]="g++" -S["am__fastdepCC_FALSE"]="" -S["am__fastdepCC_TRUE"]="#" -S["CCDEPMODE"]="depmode=none" -S["am__nodep"]="" -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"]="xcrun clang" -S["CPPFLAGS"]="" -S["LDFLAGS"]="" -S["CFLAGS"]=" -Wall -fexceptions" -S["CC"]="xcrun clang" -S["AM_BACKSLASH"]="\\" -S["AM_DEFAULT_VERBOSITY"]="1" -S["AM_DEFAULT_V"]="$(AM_DEFAULT_VERBOSITY)" -S["AM_V"]="$(V)" -S["am__untar"]="$${TAR-tar} xf -" -S["am__tar"]="$${TAR-tar} chof - \"$$tardir\"" -S["AMTAR"]="$${TAR-tar}" -S["am__leading_dot"]="." -S["SET_MAKE"]="" -S["AWK"]="awk" -S["mkdir_p"]="$(MKDIR_P)" -S["MKDIR_P"]="/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d" -S["INSTALL_STRIP_PROGRAM"]="$(install_sh) -c -s" -S["STRIP"]="strip" -S["install_sh"]="${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh" -S["MAKEINFO"]="${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo" -S["AUTOHEADER"]="${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoheader" -S["AUTOMAKE"]="${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing automake-1.15" -S["AUTOCONF"]="${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoconf" -S["ACLOCAL"]="${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing aclocal-1.15" -S["VERSION"]="3.99999" -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"]="darwin18.6.0" -S["target_vendor"]="apple" -S["target_cpu"]="x86_64" -S["target"]="x86_64-apple-darwin18.6.0" -S["host_os"]="darwin18.6.0" -S["host_vendor"]="apple" -S["host_cpu"]="x86_64" -S["host"]="x86_64-apple-darwin18.6.0" -S["build_os"]="darwin18.6.0" -S["build_vendor"]="apple" -S["build_cpu"]="x86_64" -S["build"]="x86_64-apple-darwin18.6.0" -S["target_alias"]="" -S["host_alias"]="" -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["runstatedir"]="${localstatedir}/run" -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://github.com/libffi/libffi/issues" -S["PACKAGE_STRING"]="libffi 3.99999" -S["PACKAGE_VERSION"]="3.99999" -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.99999\"" -D["PACKAGE_STRING"]=" \"libffi 3.99999\"" -D["PACKAGE_BUGREPORT"]=" \"http://github.com/libffi/libffi/issues\"" -D["PACKAGE_URL"]=" \"\"" -D["PACKAGE"]=" \"libffi\"" -D["VERSION"]=" \"3.99999\"" -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["SIZEOF_SIZE_T"]=" 8" -D["HAVE_SYS_MMAN_H"]=" 1" -D["HAVE_MMAP"]=" 1" -D["HAVE_MKOSTEMP"]=" 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["HAVE_AS_X86_PCREL"]=" 1" -D["SYMBOL_UNDERSCORE"]=" 1" -D["FFI_MMAP_EXEC_WRIT"]=" 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" -eq "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" -eq "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" -eq "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"" || { - # Older Autoconf 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"` - # 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'`; 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 that 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 -# Generated automatically by $as_me ($PACKAGE) $VERSION -# NOTE: Changes made to this file will be lost: look at ltmain.sh. - -# Provide generalized library-building support services. -# Written by Gordon Matzigkeit, 1996 - -# Copyright (C) 2014 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 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 this program. If not, see . - - -# The names of the tagged configurations supported by this script. -available_tags='CXX ' - -# Configured defaults for sys_lib_dlsearch_path munging. -: \${LT_SYS_LIBRARY_PATH="$configure_time_lt_sys_library_path"} - -# ### 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 - -# Shared archive member basename,for filename based shared library versioning on AIX. -shared_archive_member_spec=$shared_archive_member_spec - -# Shell to use when invoking shell scripts. -SHELL=$lt_SHELL - -# An echo program that protects backslashes. -ECHO=$lt_ECHO - -# The PATH separator for the build system. -PATH_SEPARATOR=$lt_PATH_SEPARATOR - -# 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 into a list of symbols to manually relocate. -global_symbol_to_import=$lt_lt_cv_sys_global_symbol_to_import - -# 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 - -# The name lister interface. -nm_interface=$lt_lt_cv_nm_interface - -# 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 where our libraries should be installed. -lt_sysroot=$lt_sysroot - -# Command to truncate a binary pipe. -lt_truncate_bin=$lt_lt_cv_truncate_bin - -# 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 - -# Detected run-time system search path for libraries. -sys_lib_dlsearch_path_spec=$lt_configure_time_dlsearch_path - -# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. -configure_time_lt_sys_library_path=$lt_configure_time_lt_sys_library_path - -# 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 - -# 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 - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects -postdep_objects=$lt_postdep_objects -predeps=$lt_predeps -postdeps=$lt_postdeps - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path - -# ### END LIBTOOL CONFIG - -_LT_EOF - - cat <<'_LT_EOF' >> "$cfgfile" - -# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE - -# func_munge_path_list VARIABLE PATH -# ----------------------------------- -# VARIABLE is name of variable containing _space_ separated list of -# directories to be munged by the contents of PATH, which is string -# having a format: -# "DIR[:DIR]:" -# string "DIR[ DIR]" will be prepended to VARIABLE -# ":DIR[:DIR]" -# string "DIR[ DIR]" will be appended to VARIABLE -# "DIRP[:DIRP]::[DIRA:]DIRA" -# string "DIRP[ DIRP]" will be prepended to VARIABLE and string -# "DIRA[ DIRA]" will be appended to VARIABLE -# "DIR[:DIR]" -# VARIABLE will be replaced by "DIR[ DIR]" -func_munge_path_list () -{ - case x$2 in - x) - ;; - *:) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" - ;; - x:*) - eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" - ;; - *::*) - eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" - eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" - ;; - *) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" - ;; - esac -} - - -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -func_cc_basename () -{ - for cc_temp in $*""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac - done - func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -} - - -# ### END FUNCTIONS SHARED WITH CONFIGURE - -_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 set != "${COLLECT_NAMES+set}"; 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) - - mv -f "$cfgfile" "$ofile" || - (rm -f "$ofile" && cp "$cfgfile" "$ofile" && rm -f "$cfgfile") - chmod +x "$ofile" - - - cat <<_LT_EOF >> "$ofile" - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD=$lt_LD_CXX - -# How to create reloadable object files. -reload_flag=$lt_reload_flag_CXX -reload_cmds=$lt_reload_cmds_CXX - -# Commands used to build an old-style archive. -old_archive_cmds=$lt_old_archive_cmds_CXX - -# A language specific compiler. -CC=$lt_compiler_CXX - -# Is the compiler the GNU compiler? -with_gcc=$GCC_CXX - -# Compiler flag to turn off builtin functions. -no_builtin_flag=$lt_lt_prog_compiler_no_builtin_flag_CXX - -# Additional compiler flags for building library objects. -pic_flag=$lt_lt_prog_compiler_pic_CXX - -# How to pass a linker flag through the compiler. -wl=$lt_lt_prog_compiler_wl_CXX - -# Compiler flag to prevent dynamic linking. -link_static_flag=$lt_lt_prog_compiler_static_CXX - -# Does compiler simultaneously support -c and -o options? -compiler_c_o=$lt_lt_cv_prog_compiler_c_o_CXX - -# Whether or not to add -lc for building shared libraries. -build_libtool_need_lc=$archive_cmds_need_lc_CXX - -# Whether or not to disallow shared libs when runtime libs are static. -allow_libtool_libs_with_static_runtimes=$enable_shared_with_static_runtimes_CXX - -# Compiler flag to allow reflexive dlopens. -export_dynamic_flag_spec=$lt_export_dynamic_flag_spec_CXX - -# Compiler flag to generate shared objects directly from archives. -whole_archive_flag_spec=$lt_whole_archive_flag_spec_CXX - -# Whether the compiler copes with passing no objects directly. -compiler_needs_object=$lt_compiler_needs_object_CXX - -# Create an old-style archive from a shared archive. -old_archive_from_new_cmds=$lt_old_archive_from_new_cmds_CXX - -# Create a temporary old-style archive to link instead of a shared archive. -old_archive_from_expsyms_cmds=$lt_old_archive_from_expsyms_cmds_CXX - -# Commands used to build a shared archive. -archive_cmds=$lt_archive_cmds_CXX -archive_expsym_cmds=$lt_archive_expsym_cmds_CXX - -# Commands used to build a loadable module if different from building -# a shared archive. -module_cmds=$lt_module_cmds_CXX -module_expsym_cmds=$lt_module_expsym_cmds_CXX - -# Whether we are building with GNU ld or not. -with_gnu_ld=$lt_with_gnu_ld_CXX - -# Flag that allows shared libraries with undefined symbols to be built. -allow_undefined_flag=$lt_allow_undefined_flag_CXX - -# Flag that enforces no undefined symbols. -no_undefined_flag=$lt_no_undefined_flag_CXX - -# 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_CXX - -# Whether we need a single "-rpath" flag with a separated argument. -hardcode_libdir_separator=$lt_hardcode_libdir_separator_CXX - -# Set to "yes" if using DIR/libNAME\$shared_ext during linking hardcodes -# DIR into the resulting binary. -hardcode_direct=$hardcode_direct_CXX - -# 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_CXX - -# Set to "yes" if using the -LDIR flag during linking hardcodes DIR -# into the resulting binary. -hardcode_minus_L=$hardcode_minus_L_CXX - -# Set to "yes" if using SHLIBPATH_VAR=DIR during linking hardcodes DIR -# into the resulting binary. -hardcode_shlibpath_var=$hardcode_shlibpath_var_CXX - -# 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_CXX - -# Set to yes if linker adds runtime paths of dependent libraries -# to runtime path list. -inherit_rpath=$inherit_rpath_CXX - -# Whether libtool must link a program against all its dependency libraries. -link_all_deplibs=$link_all_deplibs_CXX - -# Set to "yes" if exported symbols are required. -always_export_symbols=$always_export_symbols_CXX - -# The commands to list exported symbols. -export_symbols_cmds=$lt_export_symbols_cmds_CXX - -# Symbols that should not be listed in the preloaded symbols. -exclude_expsyms=$lt_exclude_expsyms_CXX - -# Symbols that must always be exported. -include_expsyms=$lt_include_expsyms_CXX - -# Commands necessary for linking programs (against libraries) with templates. -prelink_cmds=$lt_prelink_cmds_CXX - -# Commands necessary for finishing linking programs. -postlink_cmds=$lt_postlink_cmds_CXX - -# Specify filename containing input files. -file_list_spec=$lt_file_list_spec_CXX - -# How to hardcode a shared library path into an executable. -hardcode_action=$hardcode_action_CXX - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs=$lt_compiler_lib_search_dirs_CXX - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects=$lt_predep_objects_CXX -postdep_objects=$lt_postdep_objects_CXX -predeps=$lt_predeps_CXX -postdeps=$lt_postdeps_CXX - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path=$lt_compiler_lib_search_path_CXX - -# ### END LIBTOOL TAG CONFIG: CXX -_LT_EOF - - ;; - "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.25/ext/ffi_c/libffi-universal-darwin18/fficonfig.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/fficonfig.h deleted file mode 100644 index ffa9c28..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/fficonfig.h +++ /dev/null @@ -1,211 +0,0 @@ -/* 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 */ - -/* Define this if you want to enable pax emulated trampolines */ -/* #undef FFI_MMAP_EXEC_EMUTRAMP_PAX */ - -/* Cannot use malloc on this target, so, we revert to alternative means */ -#define FFI_MMAP_EXEC_WRIT 1 - -/* Define this if you do not want support for the raw API. */ -/* #undef FFI_NO_RAW_API */ - -/* Define this if 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 .cfi_* directives. */ -#define HAVE_AS_CFI_PSEUDO_OP 1 - -/* Define if your assembler supports .register. */ -/* #undef HAVE_AS_REGISTER_PSEUDO_OP */ - -/* Define if the compiler uses zarch features. */ -/* #undef HAVE_AS_S390_ZARCH */ - -/* Define if your assembler and linker support unaligned PC relative relocs. - */ -/* #undef HAVE_AS_SPARC_UA_PCREL */ - -/* Define if your assembler supports unwind section type. */ -/* #undef HAVE_AS_X86_64_UNWIND_SECTION_TYPE */ - -/* Define if your assembler supports PC relative relocs. */ -#define HAVE_AS_X86_PCREL 1 - -/* 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 if you support more than one size of the long double type */ -/* #undef HAVE_LONG_DOUBLE_VARIANT */ - -/* 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 `mkostemp' function. */ -#define HAVE_MKOSTEMP 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 1 if GNU symbol versioning is used for libatomic. */ -/* #undef LIBFFI_GNU_SYMBOL_VERSIONING */ - -/* Define to the sub-directory where libtool stores uninstalled libraries. */ -#define LT_OBJDIR ".libs/" - -/* Name of package */ -#define PACKAGE "libffi" - -/* Define to the address where bug reports for this package should be sent. */ -#define PACKAGE_BUGREPORT "http://github.com/libffi/libffi/issues" - -/* 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.99999" - -/* 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.99999" - -/* 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 - -/* The size of `size_t', as computed by sizeof. */ -#define SIZEOF_SIZE_T 8 - -/* 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 if symbols are underscored. */ -#define SYMBOL_UNDERSCORE 1 - -/* Define this if you are using Purify and want to suppress spurious messages. - */ -/* #undef USING_PURIFY */ - -/* Version number of package */ -#define VERSION "3.99999" - -/* 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.25/ext/ffi_c/libffi-universal-darwin18/include/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/Makefile deleted file mode 100644 index 2db8ea5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/Makefile +++ /dev/null @@ -1,604 +0,0 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. -# include/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994-2014 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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -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-darwin18.6.0 -host_triplet = x86_64-apple-darwin18.6.0 -target_triplet = x86_64-apple-darwin18.6.0 -subdir = include -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.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) -DIST_COMMON = $(srcdir)/Makefile.am $(noinst_HEADERS) \ - $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/fficonfig.h -CONFIG_CLEAN_FILES = ffi.h ffitarget.h -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_$(V)) -am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -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__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -am__installdirs = "$(DESTDIR)$(includedir)" -HEADERS = $(nodist_include_HEADERS) $(noinst_HEADERS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -# Read a list of newline-separated strings from the standard input, -# and print each of them once, without duplicates. Input order is -# *not* preserved. -am__uniquify_input = $(AWK) '\ - BEGIN { nonempty = 0; } \ - { items[$$0] = 1; nonempty = 1; } \ - END { if (nonempty) { for (i in items) print i; }; } \ -' -# Make sure the list of sources is unique. This is necessary because, -# e.g., the same source file might be shared among _SOURCES variables -# for different programs/libraries. -am__define_uniq_tagged_files = \ - list='$(am__tagged_files)'; \ - unique=`for i in $$list; do \ - if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ - done | $(am__uniquify_input)` -ETAGS = etags -CTAGS = ctags -am__DIST_COMMON = $(srcdir)/Makefile.in $(srcdir)/ffi.h.in -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing aclocal-1.15 -ALLOCA = -AMTAR = $${TAR-tar} -AM_DEFAULT_VERBOSITY = 1 -AM_LTLDFLAGS = -AM_RUNTESTFLAGS = -AR = ar -AUTOCONF = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoconf -AUTOHEADER = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoheader -AUTOMAKE = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing automake-1.15 -AWK = awk -CC = xcrun clang -CCAS = xcrun clang -CCASDEPMODE = depmode=none -CCASFLAGS = -CCDEPMODE = depmode=none -CFLAGS = -Wall -fexceptions -CPP = xcrun clang -E -CPPFLAGS = -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=none -CXXFLAGS = -g -O2 -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 -HAVE_LONG_DOUBLE_VARIANT = 0 -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -LD = ld -LDFLAGS = -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LIPO = lipo -LN_S = ln -s -LTLIBOBJS = -LT_SYS_LIBRARY_PATH = -MAINT = # -MAKEINFO = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo -MANIFEST_TOOL = : -MKDIR_P = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d -NM = /usr/bin/nm -B -NMEDIT = nmedit -OBJDUMP = objdump -OBJEXT = o -OPT_LDFLAGS = -OTOOL = otool -OTOOL64 = : -PACKAGE = libffi -PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues -PACKAGE_NAME = libffi -PACKAGE_STRING = libffi 3.99999 -PACKAGE_TARNAME = libffi -PACKAGE_URL = -PACKAGE_VERSION = 3.99999 -PATH_SEPARATOR = : -PRTDIAG = -RANLIB = ranlib -SECTION_LDFLAGS = -SED = /usr/bin/sed -SET_MAKE = -SHELL = /bin/sh -STRIP = strip -TARGET = X86_64 -TARGETDIR = x86 -TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -VERSION = 3.99999 -abs_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include -abs_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -abs_top_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18 -abs_top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -ac_ct_AR = ar -ac_ct_CC = xcrun clang -ac_ct_CXX = g++ -ac_ct_DUMPBIN = -am__include = include -am__leading_dot = . -am__quote = -am__tar = $${TAR-tar} chof - "$$tardir" -am__untar = $${TAR-tar} xf - -ax_enable_builddir_sed = sed -bindir = ${exec_prefix}/bin -build = x86_64-apple-darwin18.6.0 -build_alias = -build_cpu = x86_64 -build_os = darwin18.6.0 -build_vendor = apple -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host = x86_64-apple-darwin18.6.0 -host_alias = -host_cpu = x86_64 -host_os = darwin18.6.0 -host_vendor = apple -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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 = $(MKDIR_P) -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr/local -program_transform_name = s,x,x, -psdir = ${docdir} -runstatedir = ${localstatedir}/run -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include -sys_symbol_underscore = yes -sysconfdir = ${prefix}/etc -target = x86_64-apple-darwin18.6.0 -target_alias = -target_cpu = x86_64 -target_os = darwin18.6.0 -target_vendor = apple -toolexecdir = ${exec_prefix}/lib/gcc-lib/$(target_alias) -toolexeclibdir = ${exec_prefix}/lib -top_build_prefix = ../ -top_builddir = .. -top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -AUTOMAKE_OPTIONS = foreign -DISTCLEANFILES = ffitarget.h -noinst_HEADERS = ffi_common.h ffi_cfi.h -EXTRA_DIST = ffi.h.in -nodist_include_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 -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_includeHEADERS: $(nodist_include_HEADERS) - @$(NORMAL_INSTALL) - @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ - if test -n "$$list"; then \ - echo " $(MKDIR_P) '$(DESTDIR)$(includedir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(includedir)" || exit 1; \ - fi; \ - 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)$(includedir)'"; \ - $(INSTALL_HEADER) $$files "$(DESTDIR)$(includedir)" || exit $$?; \ - done - -uninstall-nodist_includeHEADERS: - @$(NORMAL_UNINSTALL) - @list='$(nodist_include_HEADERS)'; test -n "$(includedir)" || list=; \ - files=`for p in $$list; do echo $$p; done | sed -e 's|^.*/||'`; \ - dir='$(DESTDIR)$(includedir)'; $(am__uninstall_files_from_dir) - -ID: $(am__tagged_files) - $(am__define_uniq_tagged_files); mkid -fID $$unique -tags: tags-am -TAGS: tags - -tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - set x; \ - here=`pwd`; \ - $(am__define_uniq_tagged_files); \ - 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-am - -CTAGS: ctags -ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) - $(am__define_uniq_tagged_files); \ - 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" -cscopelist: cscopelist-am - -cscopelist-am: $(am__tagged_files) - list='$(am__tagged_files)'; \ - case "$(srcdir)" in \ - [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ - *) sdir=$(subdir)/$(srcdir) ;; \ - esac; \ - for i in $$list; do \ - if test -f "$$i"; then \ - echo "$(subdir)/$$i"; \ - else \ - echo "$$sdir/$$i"; \ - fi; \ - done >> $(top_builddir)/cscope.files - -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)$(includedir)"; 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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -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_includeHEADERS - -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_includeHEADERS - -.MAKE: install-am install-strip - -.PHONY: CTAGS GTAGS TAGS all all-am check check-am clean clean-generic \ - clean-libtool cscopelist-am ctags ctags-am 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_includeHEADERS 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 tags-am uninstall \ - uninstall-am uninstall-nodist_includeHEADERS - -.PRECIOUS: Makefile - - -# 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.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h deleted file mode 100644 index 91cd8d8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffi.h +++ /dev/null @@ -1,511 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi 3.99999 - Copyright (c) 2011, 2014 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. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - Most of the API is documented in doc/libffi.texi. - - The raw API is designed to bypass some of the argument packing and - unpacking on architectures for which it can be avoided. Routines - are provided to emulate the raw API if the underlying platform - doesn't allow faster implementation. - - More details on the raw 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_64 -#define X86_64 -#endif - -/* ---- System configuration information --------------------------------- */ - -#include - -#ifndef LIBFFI_ASM - -#if defined(_MSC_VER) && !defined(__clang__) -#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; - -/* Need minimal decorations for DLLs to work on Windows. GCC has - autoimport and autoexport. Always mark externally visible symbols - as dllimport for MSVC clients, even if it means an extra indirection - when using the static version of the library. - Besides, as a workaround, they can define FFI_BUILDING if they - *know* they are going to link with the static library. */ -#if defined _MSC_VER -# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ -# define FFI_API __declspec(dllexport) -# elif !defined FFI_BUILDING /* Importing libffi.DLL */ -# define FFI_API __declspec(dllimport) -# else /* Building/linking static library */ -# define FFI_API -# endif -#else -# define FFI_API -#endif - -/* The externally visible type declarations also need the MSVC DLL - decorations, or they will not be exported from the object file. */ -#if defined LIBFFI_HIDE_BASIC_TYPES -# define FFI_EXTERN FFI_API -#else -# define FFI_EXTERN extern FFI_API -#endif - -#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. */ -FFI_EXTERN ffi_type ffi_type_void; -FFI_EXTERN ffi_type ffi_type_uint8; -FFI_EXTERN ffi_type ffi_type_sint8; -FFI_EXTERN ffi_type ffi_type_uint16; -FFI_EXTERN ffi_type ffi_type_sint16; -FFI_EXTERN ffi_type ffi_type_uint32; -FFI_EXTERN ffi_type ffi_type_sint32; -FFI_EXTERN ffi_type ffi_type_uint64; -FFI_EXTERN ffi_type ffi_type_sint64; -FFI_EXTERN ffi_type ffi_type_float; -FFI_EXTERN ffi_type ffi_type_double; -FFI_EXTERN ffi_type ffi_type_pointer; - -#if 1 -FFI_EXTERN ffi_type ffi_type_longdouble; -#else -#define ffi_type_longdouble ffi_type_double -#endif - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -FFI_EXTERN ffi_type ffi_type_complex_float; -FFI_EXTERN ffi_type ffi_type_complex_double; -#if 1 -FFI_EXTERN ffi_type ffi_type_complex_longdouble; -#else -#define ffi_type_complex_longdouble ffi_type_complex_double -#endif -#endif -#endif /* LIBFFI_HIDE_BASIC_TYPES */ - -typedef enum { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -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 - - -FFI_API -void ffi_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_raw *avalue); - -FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -FFI_API 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. */ - -FFI_API -void ffi_java_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_java_raw *avalue); - -FFI_API -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -FFI_API -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -FFI_API -size_t ffi_java_raw_size (ffi_cif *cif); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -#ifdef _MSC_VER -__declspec(align(8)) -#endif -typedef struct { -#if 0 - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void *user_data; -} ffi_closure -#ifdef __GNUC__ - __attribute__((aligned (8))) -#endif - ; - -#ifndef __GNUC__ -# ifdef __sgi -# pragma pack 0 -# endif -#endif - -FFI_API void *ffi_closure_alloc (size_t size, void **code); -FFI_API void ffi_closure_free (void *); - -FFI_API ffi_status -ffi_prep_closure (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data) -#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) - __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) -#elif defined(__GNUC__) && __GNUC__ >= 3 - __attribute__((deprecated)) -#endif - ; - -FFI_API 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 { -#if 0 - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - 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 { -#if 0 - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - - 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 translation, 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_API ffi_status -ffi_prep_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -FFI_API 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_API 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_API 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 */ - -#if FFI_GO_CLOSURES - -typedef struct { - void *tramp; - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); -} ffi_go_closure; - -FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*)); - -FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure); - -#endif /* FFI_GO_CLOSURES */ - -/* ---- Public interface definition -------------------------------------- */ - -FFI_API -ffi_status ffi_prep_cif(ffi_cif *cif, - ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue); - -FFI_API -ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, - size_t *offsets); - -/* 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 -#define FFI_TYPE_COMPLEX 15 - -/* This should always refer to the last type code (for sanity checks). */ -#define FFI_TYPE_LAST FFI_TYPE_COMPLEX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffitarget.h deleted file mode 120000 index 125c624..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/include/ffitarget.h +++ /dev/null @@ -1 +0,0 @@ -/Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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.25/ext/ffi_c/libffi-universal-darwin18/libffi.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi.la deleted file mode 100644 index 2e6fec8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi.la +++ /dev/null @@ -1,41 +0,0 @@ -# libffi.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# The name that we can dlopen(3). -dlname='libffi.7.dylib' - -# Names of this library. -library_names='libffi.7.dylib libffi.dylib' - -# The name of the static archive. -old_library='' - -# Linker flags that cannot 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=8 -age=1 -revision=0 - -# 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.25/ext/ffi_c/libffi-universal-darwin18/libffi.pc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi.pc deleted file mode 100644 index fdb0f19..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi.pc +++ /dev/null @@ -1,11 +0,0 @@ -prefix=/usr/local -exec_prefix=${prefix} -libdir=${exec_prefix}/lib -toolexeclibdir=${exec_prefix}/lib -includedir=${prefix}/include - -Name: libffi -Description: Library supporting Foreign Function Interfaces -Version: 3.99999 -Libs: -L${toolexeclibdir} -lffi -Cflags: -I${includedir} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi_convenience.la b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi_convenience.la deleted file mode 100644 index 63be902..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libffi_convenience.la +++ /dev/null @@ -1,41 +0,0 @@ -# libffi_convenience.la - a libtool library file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# 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 cannot 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.25/ext/ffi_c/libffi-universal-darwin18/libtool b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libtool deleted file mode 100755 index c3a5962..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/libtool +++ /dev/null @@ -1,11813 +0,0 @@ -#! /bin/sh -# Generated automatically by config.status (libffi) 3.99999 -# NOTE: Changes made to this file will be lost: look at ltmain.sh. - -# Provide generalized library-building support services. -# Written by Gordon Matzigkeit, 1996 - -# Copyright (C) 2014 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 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 this program. If not, see . - - -# The names of the tagged configurations supported by this script. -available_tags='CXX ' - -# Configured defaults for sys_lib_dlsearch_path munging. -: ${LT_SYS_LIBRARY_PATH=""} - -# ### BEGIN LIBTOOL CONFIG - -# Which release of libtool.m4 was used? -macro_version=2.4.6 -macro_revision=2.4.6 - -# 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 - -# Shared archive member basename,for filename based shared library versioning on AIX. -shared_archive_member_spec= - -# Shell to use when invoking shell scripts. -SHELL="/bin/sh" - -# An echo program that protects backslashes. -ECHO="printf %s\\n" - -# The PATH separator for the build system. -PATH_SEPARATOR=":" - -# The host system. -host_alias= -host=x86_64-apple-darwin18.6.0 -host_os=darwin18.6.0 - -# The build system. -build_alias= -build=x86_64-apple-darwin18.6.0 -build_os=darwin18.6.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="/usr/bin/nm -B" - -# 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 \$tool_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=" -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][BCDEGRST]* .* \\(.*\\)\$/extern char \\1;/p'" - -# Transform the output of nm into a list of symbols to manually relocate. -global_symbol_to_import="" - -# 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][BCDEGRST]* .* \\(.*\\)\$/ {\"\\1\", (void *) \\&\\1},/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][BCDEGRST]* .* \\(lib.*\\)\$/ {\"\\1\", (void *) \\&\\1},/p' -e 's/^[BCDEGRST][BCDEGRST]* .* \\(.*\\)\$/ {\"lib\\1\", (void *) \\&\\1},/p'" - -# The name lister interface. -nm_interface="BSD nm" - -# Specify filename containing input files for $NM. -nm_file_list_spec="" - -# The root where to search for dependent libraries,and where our libraries should be installed. -lt_sysroot= - -# Command to truncate a binary pipe. -lt_truncate_bin="/bin/dd bs=4096 count=1" - -# 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/10.0.1 /usr/local/lib" - -# Detected run-time system search path for libraries. -sys_lib_dlsearch_path_spec="/usr/local/lib /lib /usr/lib" - -# Explicit LT_SYS_LIBRARY_PATH set during ./configure time. -configure_time_lt_sys_library_path="" - -# 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="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 \$tool_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-undefined \${wl}dynamic_lookup" - -# 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="" - -# 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 - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs="" - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects="" -postdep_objects="" -predeps="" -postdeps="" - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path="" - -# ### END LIBTOOL CONFIG - - -# ### BEGIN FUNCTIONS SHARED WITH CONFIGURE - -# func_munge_path_list VARIABLE PATH -# ----------------------------------- -# VARIABLE is name of variable containing _space_ separated list of -# directories to be munged by the contents of PATH, which is string -# having a format: -# "DIR[:DIR]:" -# string "DIR[ DIR]" will be prepended to VARIABLE -# ":DIR[:DIR]" -# string "DIR[ DIR]" will be appended to VARIABLE -# "DIRP[:DIRP]::[DIRA:]DIRA" -# string "DIRP[ DIRP]" will be prepended to VARIABLE and string -# "DIRA[ DIRA]" will be appended to VARIABLE -# "DIR[:DIR]" -# VARIABLE will be replaced by "DIR[ DIR]" -func_munge_path_list () -{ - case x$2 in - x) - ;; - *:) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'` \$$1\" - ;; - x:*) - eval $1=\"\$$1 `$ECHO $2 | $SED 's/:/ /g'`\" - ;; - *::*) - eval $1=\"\$$1\ `$ECHO $2 | $SED -e 's/.*:://' -e 's/:/ /g'`\" - eval $1=\"`$ECHO $2 | $SED -e 's/::.*//' -e 's/:/ /g'`\ \$$1\" - ;; - *) - eval $1=\"`$ECHO $2 | $SED 's/:/ /g'`\" - ;; - esac -} - - -# Calculate cc_basename. Skip known compiler wrappers and cross-prefix. -func_cc_basename () -{ - for cc_temp in $*""; do - case $cc_temp in - compile | *[\\/]compile | ccache | *[\\/]ccache ) ;; - distcc | *[\\/]distcc | purify | *[\\/]purify ) ;; - \-*) ;; - *) break;; - esac - done - func_cc_basename_result=`$ECHO "$cc_temp" | $SED "s%.*/%%; s%^$host_alias-%%"` -} - - -# ### END FUNCTIONS SHARED WITH CONFIGURE - -#! /bin/sh -## DO NOT EDIT - This file generated from ./build-aux/ltmain.in -## by inline-source v2014-01-03.01 - -# libtool (GNU libtool) 2.4.6 -# Provide generalized library-building support services. -# Written by Gordon Matzigkeit , 1996 - -# Copyright (C) 1996-2015 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 this program. If not, see . - - -PROGRAM=libtool -PACKAGE=libtool -VERSION="2.4.6 Debian-2.4.6-2" -package_revision=2.4.6 - - -## ------ ## -## Usage. ## -## ------ ## - -# Run './libtool --help' for help with using this script from the -# command line. - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# After configure completes, it has a better idea of some of the -# shell tools we need than the defaults used by the functions shared -# with bootstrap, so set those here where they can still be over- -# ridden by the user, but otherwise take precedence. - -: ${AUTOCONF="autoconf"} -: ${AUTOMAKE="automake"} - - -## -------------------------- ## -## Source external libraries. ## -## -------------------------- ## - -# Much of our low-level functionality needs to be sourced from external -# libraries, which are installed to $pkgauxdir. - -# Set a version string for this script. -scriptversion=2015-01-20.17; # UTC - -# General shell script boiler plate, and helper functions. -# Written by Gary V. Vaughan, 2004 - -# Copyright (C) 2004-2015 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. - -# 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. - -# 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. - -# This program is distributed in the hope that it will be useful, -# but WITHOUT ANY WARRANTY; without even the implied warranty of -# MERCHANTABILITY or FITNES 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 . - -# Please report bugs or propose patches to gary@gnu.org. - - -## ------ ## -## Usage. ## -## ------ ## - -# Evaluate this file near the top of your script to gain access to -# the functions and variables defined here: -# -# . `echo "$0" | ${SED-sed} 's|[^/]*$||'`/build-aux/funclib.sh -# -# If you need to override any of the default environment variable -# settings, do that before evaluating this file. - - -## -------------------- ## -## Shell normalisation. ## -## -------------------- ## - -# Some shells need a little help to be as Bourne compatible as possible. -# Before doing anything else, make sure all that help has been provided! - -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 - -# NLS nuisances: We save the old values in case they are required later. -_G_user_locale= -_G_safe_locale= -for _G_var in LANG LANGUAGE LC_ALL LC_CTYPE LC_COLLATE LC_MESSAGES -do - eval "if test set = \"\${$_G_var+set}\"; then - save_$_G_var=\$$_G_var - $_G_var=C - export $_G_var - _G_user_locale=\"$_G_var=\\\$save_\$_G_var; \$_G_user_locale\" - _G_safe_locale=\"$_G_var=C; \$_G_safe_locale\" - fi" -done - -# CDPATH. -(unset CDPATH) >/dev/null 2>&1 && unset CDPATH - -# Make sure IFS has a sensible default -sp=' ' -nl=' -' -IFS="$sp $nl" - -# There are apparently some retarded systems that use ';' as a PATH separator! -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 - - - -## ------------------------- ## -## Locate command utilities. ## -## ------------------------- ## - - -# func_executable_p FILE -# ---------------------- -# Check that FILE is an executable regular file. -func_executable_p () -{ - test -f "$1" && test -x "$1" -} - - -# func_path_progs PROGS_LIST CHECK_FUNC [PATH] -# -------------------------------------------- -# Search for either a program that responds to --version with output -# containing "GNU", or else returned by CHECK_FUNC otherwise, by -# trying all the directories in PATH with each of the elements of -# PROGS_LIST. -# -# CHECK_FUNC should accept the path to a candidate program, and -# set $func_check_prog_result if it truncates its output less than -# $_G_path_prog_max characters. -func_path_progs () -{ - _G_progs_list=$1 - _G_check_func=$2 - _G_PATH=${3-"$PATH"} - - _G_path_prog_max=0 - _G_path_prog_found=false - _G_save_IFS=$IFS; IFS=${PATH_SEPARATOR-:} - for _G_dir in $_G_PATH; do - IFS=$_G_save_IFS - test -z "$_G_dir" && _G_dir=. - for _G_prog_name in $_G_progs_list; do - for _exeext in '' .EXE; do - _G_path_prog=$_G_dir/$_G_prog_name$_exeext - func_executable_p "$_G_path_prog" || continue - case `"$_G_path_prog" --version 2>&1` in - *GNU*) func_path_progs_result=$_G_path_prog _G_path_prog_found=: ;; - *) $_G_check_func $_G_path_prog - func_path_progs_result=$func_check_prog_result - ;; - esac - $_G_path_prog_found && break 3 - done - done - done - IFS=$_G_save_IFS - test -z "$func_path_progs_result" && { - echo "no acceptable sed could be found in \$PATH" >&2 - exit 1 - } -} - - -# We want to be able to use the functions in this file before configure -# has figured out where the best binaries are kept, which means we have -# to search for them ourselves - except when the results are already set -# where we skip the searches. - -# Unless the user overrides by setting SED, search the path for either GNU -# sed, or the sed that truncates its output the least. -test -z "$SED" && { - _G_sed_script=s/aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa/bbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb/ - for _G_i in 1 2 3 4 5 6 7; do - _G_sed_script=$_G_sed_script$nl$_G_sed_script - done - echo "$_G_sed_script" 2>/dev/null | sed 99q >conftest.sed - _G_sed_script= - - func_check_prog_sed () - { - _G_path_prog=$1 - - _G_count=0 - printf 0123456789 >conftest.in - while : - do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo '' >> conftest.nl - "$_G_path_prog" -f conftest.sed conftest.out 2>/dev/null || break - diff conftest.out conftest.nl >/dev/null 2>&1 || break - _G_count=`expr $_G_count + 1` - if test "$_G_count" -gt "$_G_path_prog_max"; then - # Best one so far, save it but keep looking for a better one - func_check_prog_result=$_G_path_prog - _G_path_prog_max=$_G_count - fi - # 10*(2^10) chars as input seems more than enough - test 10 -lt "$_G_count" && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out - } - - func_path_progs "sed gsed" func_check_prog_sed $PATH:/usr/xpg4/bin - rm -f conftest.sed - SED=$func_path_progs_result -} - - -# Unless the user overrides by setting GREP, search the path for either GNU -# grep, or the grep that truncates its output the least. -test -z "$GREP" && { - func_check_prog_grep () - { - _G_path_prog=$1 - - _G_count=0 - _G_path_prog_max=0 - printf 0123456789 >conftest.in - while : - do - cat conftest.in conftest.in >conftest.tmp - mv conftest.tmp conftest.in - cp conftest.in conftest.nl - echo 'GREP' >> conftest.nl - "$_G_path_prog" -e 'GREP$' -e '-(cannot match)-' conftest.out 2>/dev/null || break - diff conftest.out conftest.nl >/dev/null 2>&1 || break - _G_count=`expr $_G_count + 1` - if test "$_G_count" -gt "$_G_path_prog_max"; then - # Best one so far, save it but keep looking for a better one - func_check_prog_result=$_G_path_prog - _G_path_prog_max=$_G_count - fi - # 10*(2^10) chars as input seems more than enough - test 10 -lt "$_G_count" && break - done - rm -f conftest.in conftest.tmp conftest.nl conftest.out - } - - func_path_progs "grep ggrep" func_check_prog_grep $PATH:/usr/xpg4/bin - GREP=$func_path_progs_result -} - - -## ------------------------------- ## -## User overridable command paths. ## -## ------------------------------- ## - -# All uppercase variable names are used for environment variables. These -# variables can be overridden by the user before calling a script that -# uses them if a suitable command of that name is not already available -# in the command search PATH. - -: ${CP="cp -f"} -: ${ECHO="printf %s\n"} -: ${EGREP="$GREP -E"} -: ${FGREP="$GREP -F"} -: ${LN_S="ln -s"} -: ${MAKE="make"} -: ${MKDIR="mkdir"} -: ${MV="mv -f"} -: ${RM="rm -f"} -: ${SHELL="${CONFIG_SHELL-/bin/sh}"} - - -## -------------------- ## -## Useful sed snippets. ## -## -------------------- ## - -sed_dirname='s|/[^/]*$||' -sed_basename='s|^.*/||' - -# Sed substitution that helps us do robust quoting. It backslashifies -# metacharacters that are still active within double-quoted strings. -sed_quote_subst='s|\([`"$\\]\)|\\\1|g' - -# Same as above, but do not quote variable references. -sed_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 -# that contains forward slashes, into one that contains -# (escaped) backslashes. A very naive implementation. -sed_naive_backslashify='s|\\\\*|\\|g;s|/|\\|g;s|\\|\\\\|g' - -# Re-'\' parameter expansions in output of sed_double_quote_subst that -# were '\'-ed in input to the same. If an odd number of '\' preceded a -# '$' in input to sed_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 '$'. -_G_bs='\\' -_G_bs2='\\\\' -_G_bs4='\\\\\\\\' -_G_dollar='\$' -sed_double_backslash="\ - s/$_G_bs4/&\\ -/g - s/^$_G_bs2$_G_dollar/$_G_bs&/ - s/\\([^$_G_bs]\\)$_G_bs2$_G_dollar/\\1$_G_bs2$_G_bs$_G_dollar/g - s/\n//g" - - -## ----------------- ## -## Global variables. ## -## ----------------- ## - -# Except for the global variables explicitly listed below, the following -# functions in the '^func_' namespace, and the '^require_' namespace -# variables initialised in the 'Resource management' section, sourcing -# this file will not pollute your global namespace with anything -# else. There's no portable way to scope variables in Bourne shell -# though, so actually running these functions will sometimes place -# results into a variable named after the function, and often use -# temporary variables in the '^_G_' namespace. If you are careful to -# avoid using those namespaces casually in your sourcing script, things -# should continue to work as you expect. And, of course, you can freely -# overwrite any of the functions or variables defined here before -# calling anything to customize them. - -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. - -# Allow overriding, eg assuming that you follow the convention of -# putting '$debug_cmd' at the start of all your functions, you can get -# bash to show function call trace with: -# -# debug_cmd='eval echo "${FUNCNAME[0]} $*" >&2' bash your-script-name -debug_cmd=${debug_cmd-":"} -exit_cmd=: - -# By convention, finish your script with: -# -# exit $exit_status -# -# so that you can set exit_status to non-zero if you want to indicate -# something went wrong during execution without actually bailing out at -# the point of failure. -exit_status=$EXIT_SUCCESS - -# 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 - -# The name of this program. -progname=`$ECHO "$progpath" |$SED "$sed_basename"` - -# Make sure we have an absolute progpath for reexecution: -case $progpath in - [\\/]*|[A-Za-z]:\\*) ;; - *[\\/]*) - progdir=`$ECHO "$progpath" |$SED "$sed_dirname"` - progdir=`cd "$progdir" && pwd` - progpath=$progdir/$progname - ;; - *) - _G_IFS=$IFS - IFS=${PATH_SEPARATOR-:} - for progdir in $PATH; do - IFS=$_G_IFS - test -x "$progdir/$progname" && break - done - IFS=$_G_IFS - test -n "$progdir" || progdir=`pwd` - progpath=$progdir/$progname - ;; -esac - - -## ----------------- ## -## Standard options. ## -## ----------------- ## - -# The following options affect the operation of the functions defined -# below, and should be set appropriately depending on run-time para- -# meters passed on the command line. - -opt_dry_run=false -opt_quiet=false -opt_verbose=false - -# Categories 'all' and 'none' are always available. Append any others -# you will pass as the first argument to func_warning from your own -# code. -warning_categories= - -# By default, display warnings according to 'opt_warning_types'. Set -# 'warning_func' to ':' to elide all warnings, or func_fatal_error to -# treat the next displayed warning as a fatal error. -warning_func=func_warn_and_continue - -# Set to 'all' to display all warnings, 'none' to suppress all -# warnings, or a space delimited list of some subset of -# 'warning_categories' to display only the listed warnings. -opt_warning_types=all - - -## -------------------- ## -## Resource management. ## -## -------------------- ## - -# This section contains definitions for functions that each ensure a -# particular resource (a file, or a non-empty configuration variable for -# example) is available, and if appropriate to extract default values -# from pertinent package files. Call them using their associated -# 'require_*' variable to ensure that they are executed, at most, once. -# -# It's entirely deliberate that calling these functions can set -# variables that don't obey the namespace limitations obeyed by the rest -# of this file, in order that that they be as useful as possible to -# callers. - - -# require_term_colors -# ------------------- -# Allow display of bold text on terminals that support it. -require_term_colors=func_require_term_colors -func_require_term_colors () -{ - $debug_cmd - - test -t 1 && { - # COLORTERM and USE_ANSI_COLORS environment variables take - # precedence, because most terminfo databases neglect to describe - # whether color sequences are supported. - test -n "${COLORTERM+set}" && : ${USE_ANSI_COLORS="1"} - - if test 1 = "$USE_ANSI_COLORS"; then - # Standard ANSI escape sequences - tc_reset='' - tc_bold=''; tc_standout='' - tc_red=''; tc_green='' - tc_blue=''; tc_cyan='' - else - # Otherwise trust the terminfo database after all. - test -n "`tput sgr0 2>/dev/null`" && { - tc_reset=`tput sgr0` - test -n "`tput bold 2>/dev/null`" && tc_bold=`tput bold` - tc_standout=$tc_bold - test -n "`tput smso 2>/dev/null`" && tc_standout=`tput smso` - test -n "`tput setaf 1 2>/dev/null`" && tc_red=`tput setaf 1` - test -n "`tput setaf 2 2>/dev/null`" && tc_green=`tput setaf 2` - test -n "`tput setaf 4 2>/dev/null`" && tc_blue=`tput setaf 4` - test -n "`tput setaf 5 2>/dev/null`" && tc_cyan=`tput setaf 5` - } - fi - } - - require_term_colors=: -} - - -## ----------------- ## -## Function library. ## -## ----------------- ## - -# This section contains a variety of useful functions to call in your -# scripts. Take note of the portable wrappers for features provided by -# some modern shells, which will fall back to slower equivalents on -# less featureful shells. - - -# func_append VAR VALUE -# --------------------- -# Append VALUE onto the existing contents of VAR. - - # We should try to minimise forks, especially on Windows where they are - # unreasonably slow, so skip the feature probes when bash or zsh are - # being used: - if test set = "${BASH_VERSION+set}${ZSH_VERSION+set}"; then - : ${_G_HAVE_ARITH_OP="yes"} - : ${_G_HAVE_XSI_OPS="yes"} - # The += operator was introduced in bash 3.1 - case $BASH_VERSION in - [12].* | 3.0 | 3.0*) ;; - *) - : ${_G_HAVE_PLUSEQ_OP="yes"} - ;; - esac - fi - - # _G_HAVE_PLUSEQ_OP - # Can be empty, in which case the shell is probed, "yes" if += is - # useable or anything else if it does not work. - test -z "$_G_HAVE_PLUSEQ_OP" \ - && (eval 'x=a; x+=" b"; test "a b" = "$x"') 2>/dev/null \ - && _G_HAVE_PLUSEQ_OP=yes - -if test yes = "$_G_HAVE_PLUSEQ_OP" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_append () - { - $debug_cmd - - eval "$1+=\$2" - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_append () - { - $debug_cmd - - eval "$1=\$$1\$2" - } -fi - - -# func_append_quoted VAR VALUE -# ---------------------------- -# Quote VALUE and append to the end of shell variable VAR, separated -# by a space. -if test yes = "$_G_HAVE_PLUSEQ_OP"; then - eval 'func_append_quoted () - { - $debug_cmd - - func_quote_for_eval "$2" - eval "$1+=\\ \$func_quote_for_eval_result" - }' -else - func_append_quoted () - { - $debug_cmd - - func_quote_for_eval "$2" - eval "$1=\$$1\\ \$func_quote_for_eval_result" - } -fi - - -# func_append_uniq VAR VALUE -# -------------------------- -# Append unique VALUE onto the existing contents of VAR, assuming -# entries are delimited by the first character of VALUE. For example: -# -# func_append_uniq options " --another-option option-argument" -# -# will only append to $options if " --another-option option-argument " -# is not already present somewhere in $options already (note spaces at -# each end implied by leading space in second argument). -func_append_uniq () -{ - $debug_cmd - - eval _G_current_value='`$ECHO $'$1'`' - _G_delim=`expr "$2" : '\(.\)'` - - case $_G_delim$_G_current_value$_G_delim in - *"$2$_G_delim"*) ;; - *) func_append "$@" ;; - esac -} - - -# func_arith TERM... -# ------------------ -# Set func_arith_result to the result of evaluating TERMs. - test -z "$_G_HAVE_ARITH_OP" \ - && (eval 'test 2 = $(( 1 + 1 ))') 2>/dev/null \ - && _G_HAVE_ARITH_OP=yes - -if test yes = "$_G_HAVE_ARITH_OP"; then - eval 'func_arith () - { - $debug_cmd - - func_arith_result=$(( $* )) - }' -else - func_arith () - { - $debug_cmd - - func_arith_result=`expr "$@"` - } -fi - - -# func_basename FILE -# ------------------ -# Set func_basename_result to FILE with everything up to and including -# the last / stripped. -if test yes = "$_G_HAVE_XSI_OPS"; then - # If this shell supports suffix pattern removal, then use it to avoid - # forking. Hide the definitions single quotes in case the shell chokes - # on unsupported syntax... - _b='func_basename_result=${1##*/}' - _d='case $1 in - */*) func_dirname_result=${1%/*}$2 ;; - * ) func_dirname_result=$3 ;; - esac' - -else - # ...otherwise fall back to using sed. - _b='func_basename_result=`$ECHO "$1" |$SED "$sed_basename"`' - _d='func_dirname_result=`$ECHO "$1" |$SED "$sed_dirname"` - if test "X$func_dirname_result" = "X$1"; then - func_dirname_result=$3 - else - func_append func_dirname_result "$2" - fi' -fi - -eval 'func_basename () -{ - $debug_cmd - - '"$_b"' -}' - - -# func_dirname FILE APPEND NONDIR_REPLACEMENT -# ------------------------------------------- -# Compute the dirname of FILE. If nonempty, add APPEND to the result, -# otherwise set result to NONDIR_REPLACEMENT. -eval 'func_dirname () -{ - $debug_cmd - - '"$_d"' -}' - - -# 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" -# For efficiency, we do not delegate to the functions above but instead -# duplicate the functionality here. -eval 'func_dirname_and_basename () -{ - $debug_cmd - - '"$_b"' - '"$_d"' -}' - - -# func_echo ARG... -# ---------------- -# Echo program name prefixed message. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $ECHO "$progname: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_echo_all ARG... -# -------------------- -# Invoke $ECHO with all args, space-separated. -func_echo_all () -{ - $ECHO "$*" -} - - -# func_echo_infix_1 INFIX ARG... -# ------------------------------ -# Echo program name, followed by INFIX on the first line, with any -# additional lines not showing INFIX. -func_echo_infix_1 () -{ - $debug_cmd - - $require_term_colors - - _G_infix=$1; shift - _G_indent=$_G_infix - _G_prefix="$progname: $_G_infix: " - _G_message=$* - - # Strip color escape sequences before counting printable length - for _G_tc in "$tc_reset" "$tc_bold" "$tc_standout" "$tc_red" "$tc_green" "$tc_blue" "$tc_cyan" - do - test -n "$_G_tc" && { - _G_esc_tc=`$ECHO "$_G_tc" | $SED "$sed_make_literal_regex"` - _G_indent=`$ECHO "$_G_indent" | $SED "s|$_G_esc_tc||g"` - } - done - _G_indent="$progname: "`echo "$_G_indent" | $SED 's|.| |g'`" " ## exclude from sc_prohibit_nested_quotes - - func_echo_infix_1_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_infix_1_IFS - $ECHO "$_G_prefix$tc_bold$_G_line$tc_reset" >&2 - _G_prefix=$_G_indent - done - IFS=$func_echo_infix_1_IFS -} - - -# func_error ARG... -# ----------------- -# Echo program name prefixed message to standard error. -func_error () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 " $tc_standout${tc_red}error$tc_reset" "$*" >&2 -} - - -# func_fatal_error ARG... -# ----------------------- -# Echo program name prefixed message to standard error, and exit. -func_fatal_error () -{ - $debug_cmd - - func_error "$*" - exit $EXIT_FAILURE -} - - -# func_grep EXPRESSION FILENAME -# ----------------------------- -# Check whether EXPRESSION matches any line of FILENAME, without output. -func_grep () -{ - $debug_cmd - - $GREP "$1" "$2" >/dev/null 2>&1 -} - - -# func_len STRING -# --------------- -# Set func_len_result to the length of STRING. STRING may not -# start with a hyphen. - test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_len () - { - $debug_cmd - - func_len_result=${#1} - }' -else - func_len () - { - $debug_cmd - - func_len_result=`expr "$1" : ".*" 2>/dev/null || echo $max_cmd_len` - } -fi - - -# func_mkdir_p DIRECTORY-PATH -# --------------------------- -# Make sure the entire path to DIRECTORY-PATH is available. -func_mkdir_p () -{ - $debug_cmd - - _G_directory_path=$1 - _G_dir_list= - - if test -n "$_G_directory_path" && test : != "$opt_dry_run"; then - - # Protect directory names starting with '-' - case $_G_directory_path in - -*) _G_directory_path=./$_G_directory_path ;; - esac - - # While some portion of DIR does not yet exist... - while test ! -d "$_G_directory_path"; do - # ...make a list in topmost first order. Use a colon delimited - # list incase some portion of path contains whitespace. - _G_dir_list=$_G_directory_path:$_G_dir_list - - # If the last portion added has no slash in it, the list is done - case $_G_directory_path in */*) ;; *) break ;; esac - - # ...otherwise throw away the child directory and loop - _G_directory_path=`$ECHO "$_G_directory_path" | $SED -e "$sed_dirname"` - done - _G_dir_list=`$ECHO "$_G_dir_list" | $SED 's|:*$||'` - - func_mkdir_p_IFS=$IFS; IFS=: - for _G_dir in $_G_dir_list; do - IFS=$func_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 "$_G_dir" 2>/dev/null || : - done - IFS=$func_mkdir_p_IFS - - # Bail out if we (or some other process) failed to create a directory. - test -d "$_G_directory_path" || \ - func_fatal_error "Failed to create '$1'" - fi -} - - -# func_mktempdir [BASENAME] -# ------------------------- -# Make a temporary directory that won't clash with other running -# libtool processes, and avoids race conditions if possible. If -# given, BASENAME is the basename for that directory. -func_mktempdir () -{ - $debug_cmd - - _G_template=${TMPDIR-/tmp}/${1-$progname} - - if test : = "$opt_dry_run"; then - # Return a directory name, but don't create it in dry-run mode - _G_tmpdir=$_G_template-$$ - else - - # If mktemp works, use that first and foremost - _G_tmpdir=`mktemp -d "$_G_template-XXXXXXXX" 2>/dev/null` - - if test ! -d "$_G_tmpdir"; then - # Failing that, at least try and use $RANDOM to avoid a race - _G_tmpdir=$_G_template-${RANDOM-0}$$ - - func_mktempdir_umask=`umask` - umask 0077 - $MKDIR "$_G_tmpdir" - umask $func_mktempdir_umask - fi - - # If we're not in dry-run mode, bomb out on failure - test -d "$_G_tmpdir" || \ - func_fatal_error "cannot create temporary directory '$_G_tmpdir'" - fi - - $ECHO "$_G_tmpdir" -} - - -# 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. -func_normal_abspath () -{ - $debug_cmd - - # These SED scripts presuppose an absolute path with a trailing slash. - _G_pathcar='s|^/\([^/]*\).*$|\1|' - _G_pathcdr='s|^/[^/]*||' - _G_removedotparts=':dotsl - s|/\./|/|g - t dotsl - s|/\.$|/|' - _G_collapseslashes='s|/\{1,\}|/|g' - _G_finalslash='s|/*$|/|' - - # 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 "$_G_removedotparts" -e "$_G_collapseslashes" -e "$_G_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 "$_G_pathcar"` - func_normal_abspath_tpath=`$ECHO "$func_normal_abspath_tpath" | $SED \ - -e "$_G_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_append 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_notquiet ARG... -# -------------------- -# Echo program name prefixed message only when not in quiet mode. -func_notquiet () -{ - $debug_cmd - - $opt_quiet || 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_relative_path SRCDIR DSTDIR -# -------------------------------- -# Set func_relative_path_result to the relative path from SRCDIR to DSTDIR. -func_relative_path () -{ - $debug_cmd - - 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 -z "$func_relative_path_tlibdir"; 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 -n "$func_stripname_result"; then - func_append func_relative_path_result "/$func_stripname_result" - fi - - # Normalisation. If bindir is libdir, return '.' else relative path. - if test -n "$func_relative_path_result"; then - func_stripname './' '' "$func_relative_path_result" - func_relative_path_result=$func_stripname_result - fi - - test -n "$func_relative_path_result" || func_relative_path_result=. - - : -} - - -# func_quote_for_eval ARG... -# -------------------------- -# Aesthetically quote ARGs to be evaled later. -# This function returns two values: -# i) func_quote_for_eval_result -# double-quoted, suitable for a subsequent eval -# ii) func_quote_for_eval_unquoted_result -# has all characters that are still active within double -# quotes backslashified. -func_quote_for_eval () -{ - $debug_cmd - - func_quote_for_eval_unquoted_result= - func_quote_for_eval_result= - while test 0 -lt $#; do - case $1 in - *[\\\`\"\$]*) - _G_unquoted_arg=`printf '%s\n' "$1" |$SED "$sed_quote_subst"` ;; - *) - _G_unquoted_arg=$1 ;; - esac - if test -n "$func_quote_for_eval_unquoted_result"; then - func_append func_quote_for_eval_unquoted_result " $_G_unquoted_arg" - else - func_append func_quote_for_eval_unquoted_result "$_G_unquoted_arg" - fi - - case $_G_unquoted_arg in - # Double-quote args containing shell metacharacters to delay - # word splitting, command substitution and variable expansion - # for a subsequent eval. - # Many Bourne shells cannot handle close brackets correctly - # in scan sets, so we specify it separately. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - _G_quoted_arg=\"$_G_unquoted_arg\" - ;; - *) - _G_quoted_arg=$_G_unquoted_arg - ;; - esac - - if test -n "$func_quote_for_eval_result"; then - func_append func_quote_for_eval_result " $_G_quoted_arg" - else - func_append func_quote_for_eval_result "$_G_quoted_arg" - fi - shift - done -} - - -# 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 () -{ - $debug_cmd - - case $1 in - *[\\\`\"]*) - _G_arg=`$ECHO "$1" | $SED \ - -e "$sed_double_quote_subst" -e "$sed_double_backslash"` ;; - *) - _G_arg=$1 ;; - esac - - case $_G_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. - *[\[\~\#\^\&\*\(\)\{\}\|\;\<\>\?\'\ \ ]*|*]*|"") - _G_arg=\"$_G_arg\" - ;; - esac - - func_quote_for_expand_result=$_G_arg -} - - -# func_stripname PREFIX SUFFIX NAME -# --------------------------------- -# strip PREFIX and SUFFIX from NAME, and store in func_stripname_result. -# 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). -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_stripname () - { - $debug_cmd - - # pdksh 5.2.14 does not do ${X%$Y} correctly if both X and Y are - # positional parameters, so assign one to ordinary variable first. - func_stripname_result=$3 - func_stripname_result=${func_stripname_result#"$1"} - func_stripname_result=${func_stripname_result%"$2"} - }' -else - func_stripname () - { - $debug_cmd - - case $2 in - .*) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%\\\\$2\$%%"`;; - *) func_stripname_result=`$ECHO "$3" | $SED -e "s%^$1%%" -e "s%$2\$%%"`;; - esac - } -fi - - -# func_show_eval CMD [FAIL_EXP] -# ----------------------------- -# Unless opt_quiet 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 () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - func_quote_for_expand "$_G_cmd" - eval "func_notquiet $func_quote_for_expand_result" - - $opt_dry_run || { - eval "$_G_cmd" - _G_status=$? - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - fi - } -} - - -# func_show_eval_locale CMD [FAIL_EXP] -# ------------------------------------ -# Unless opt_quiet 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 () -{ - $debug_cmd - - _G_cmd=$1 - _G_fail_exp=${2-':'} - - $opt_quiet || { - func_quote_for_expand "$_G_cmd" - eval "func_echo $func_quote_for_expand_result" - } - - $opt_dry_run || { - eval "$_G_user_locale - $_G_cmd" - _G_status=$? - eval "$_G_safe_locale" - if test 0 -ne "$_G_status"; then - eval "(exit $_G_status); $_G_fail_exp" - 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 () -{ - $debug_cmd - - case $1 in - [0-9]* | *[!a-zA-Z0-9_]*) - func_tr_sh_result=`$ECHO "$1" | $SED -e 's/^\([0-9]\)/_\1/' -e 's/[^a-zA-Z0-9_]/_/g'` - ;; - * ) - func_tr_sh_result=$1 - ;; - esac -} - - -# func_verbose ARG... -# ------------------- -# Echo program name prefixed message in verbose mode only. -func_verbose () -{ - $debug_cmd - - $opt_verbose && func_echo "$*" - - : -} - - -# func_warn_and_continue ARG... -# ----------------------------- -# Echo program name prefixed warning message to standard error. -func_warn_and_continue () -{ - $debug_cmd - - $require_term_colors - - func_echo_infix_1 "${tc_red}warning$tc_reset" "$*" >&2 -} - - -# func_warning CATEGORY ARG... -# ---------------------------- -# Echo program name prefixed warning message to standard error. Warning -# messages can be filtered according to CATEGORY, where this function -# elides messages where CATEGORY is not listed in the global variable -# 'opt_warning_types'. -func_warning () -{ - $debug_cmd - - # CATEGORY must be in the warning_categories list! - case " $warning_categories " in - *" $1 "*) ;; - *) func_internal_error "invalid warning category '$1'" ;; - esac - - _G_category=$1 - shift - - case " $opt_warning_types " in - *" $_G_category "*) $warning_func ${1+"$@"} ;; - esac -} - - -# func_sort_ver VER1 VER2 -# ----------------------- -# 'sort -V' is not generally available. -# Note this deviates from the version comparison in automake -# in that it treats 1.5 < 1.5.0, and treats 1.4.4a < 1.4-p3a -# but this should suffice as we won't be specifying old -# version formats or redundant trailing .0 in bootstrap.conf. -# If we did want full compatibility then we should probably -# use m4_version_compare from autoconf. -func_sort_ver () -{ - $debug_cmd - - printf '%s\n%s\n' "$1" "$2" \ - | sort -t. -k 1,1n -k 2,2n -k 3,3n -k 4,4n -k 5,5n -k 6,6n -k 7,7n -k 8,8n -k 9,9n -} - -# func_lt_ver PREV CURR -# --------------------- -# Return true if PREV and CURR are in the correct order according to -# func_sort_ver, otherwise false. Use it like this: -# -# func_lt_ver "$prev_ver" "$proposed_ver" || func_fatal_error "..." -func_lt_ver () -{ - $debug_cmd - - test "x$1" = x`func_sort_ver "$1" "$2" | $SED 1q` -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: -#! /bin/sh - -# Set a version string for this script. -scriptversion=2014-01-07.03; # UTC - -# A portable, pluggable option parser for Bourne shell. -# Written by Gary V. Vaughan, 2010 - -# Copyright (C) 2010-2015 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. - -# 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 . - -# Please report bugs or propose patches to gary@gnu.org. - - -## ------ ## -## Usage. ## -## ------ ## - -# This file is a library for parsing options in your shell scripts along -# with assorted other useful supporting features that you can make use -# of too. -# -# For the simplest scripts you might need only: -# -# #!/bin/sh -# . relative/path/to/funclib.sh -# . relative/path/to/options-parser -# scriptversion=1.0 -# func_options ${1+"$@"} -# eval set dummy "$func_options_result"; shift -# ...rest of your script... -# -# In order for the '--version' option to work, you will need to have a -# suitably formatted comment like the one at the top of this file -# starting with '# Written by ' and ending with '# warranty; '. -# -# For '-h' and '--help' to work, you will also need a one line -# description of your script's purpose in a comment directly above the -# '# Written by ' line, like the one at the top of this file. -# -# The default options also support '--debug', which will turn on shell -# execution tracing (see the comment above debug_cmd below for another -# use), and '--verbose' and the func_verbose function to allow your script -# to display verbose messages only when your user has specified -# '--verbose'. -# -# After sourcing this file, you can plug processing for additional -# options by amending the variables from the 'Configuration' section -# below, and following the instructions in the 'Option parsing' -# section further down. - -## -------------- ## -## Configuration. ## -## -------------- ## - -# You should override these variables in your script after sourcing this -# file so that they reflect the customisations you have added to the -# option parser. - -# The usage line for option parsing errors and the start of '-h' and -# '--help' output messages. You can embed shell variables for delayed -# expansion at the time the message is displayed, but you will need to -# quote other shell meta-characters carefully to prevent them being -# expanded when the contents are evaled. -usage='$progpath [OPTION]...' - -# Short help message in response to '-h' and '--help'. Add to this or -# override it after sourcing this library to reflect the full set of -# options your script accepts. -usage_message="\ - --debug enable verbose shell tracing - -W, --warnings=CATEGORY - report the warnings falling in CATEGORY [all] - -v, --verbose verbosely report processing - --version print version information and exit - -h, --help print short or long help message and exit -" - -# Additional text appended to 'usage_message' in response to '--help'. -long_help_message=" -Warning categories include: - 'all' show all warnings - 'none' turn off all the warnings - 'error' warnings are treated as fatal errors" - -# Help message printed before fatal option parsing errors. -fatal_help="Try '\$progname --help' for more information." - - - -## ------------------------- ## -## Hook function management. ## -## ------------------------- ## - -# This section contains functions for adding, removing, and running hooks -# to the main code. A hook is just a named list of of function, that can -# be run in order later on. - -# func_hookable FUNC_NAME -# ----------------------- -# Declare that FUNC_NAME will run hooks added with -# 'func_add_hook FUNC_NAME ...'. -func_hookable () -{ - $debug_cmd - - func_append hookable_fns " $1" -} - - -# func_add_hook FUNC_NAME HOOK_FUNC -# --------------------------------- -# Request that FUNC_NAME call HOOK_FUNC before it returns. FUNC_NAME must -# first have been declared "hookable" by a call to 'func_hookable'. -func_add_hook () -{ - $debug_cmd - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not accept hook functions." ;; - esac - - eval func_append ${1}_hooks '" $2"' -} - - -# func_remove_hook FUNC_NAME HOOK_FUNC -# ------------------------------------ -# Remove HOOK_FUNC from the list of functions called by FUNC_NAME. -func_remove_hook () -{ - $debug_cmd - - eval ${1}_hooks='`$ECHO "\$'$1'_hooks" |$SED "s| '$2'||"`' -} - - -# func_run_hooks FUNC_NAME [ARG]... -# --------------------------------- -# Run all hook functions registered to FUNC_NAME. -# It is assumed that the list of hook functions contains nothing more -# than a whitespace-delimited list of legal shell function names, and -# no effort is wasted trying to catch shell meta-characters or preserve -# whitespace. -func_run_hooks () -{ - $debug_cmd - - case " $hookable_fns " in - *" $1 "*) ;; - *) func_fatal_error "'$1' does not support hook funcions.n" ;; - esac - - eval _G_hook_fns=\$$1_hooks; shift - - for _G_hook in $_G_hook_fns; do - eval $_G_hook '"$@"' - - # store returned options list back into positional - # parameters for next 'cmd' execution. - eval _G_hook_result=\$${_G_hook}_result - eval set dummy "$_G_hook_result"; shift - done - - func_quote_for_eval ${1+"$@"} - func_run_hooks_result=$func_quote_for_eval_result -} - - - -## --------------- ## -## Option parsing. ## -## --------------- ## - -# In order to add your own option parsing hooks, you must accept the -# full positional parameter list in your hook function, remove any -# options that you action, and then pass back the remaining unprocessed -# options in '_result', escaped suitably for -# 'eval'. Like this: -# -# my_options_prep () -# { -# $debug_cmd -# -# # Extend the existing usage message. -# usage_message=$usage_message' -# -s, --silent don'\''t print informational messages -# ' -# -# func_quote_for_eval ${1+"$@"} -# my_options_prep_result=$func_quote_for_eval_result -# } -# func_add_hook func_options_prep my_options_prep -# -# -# my_silent_option () -# { -# $debug_cmd -# -# # Note that for efficiency, we parse as many options as we can -# # recognise in a loop before passing the remainder back to the -# # caller on the first unrecognised argument we encounter. -# while test $# -gt 0; do -# opt=$1; shift -# case $opt in -# --silent|-s) opt_silent=: ;; -# # Separate non-argument short options: -# -s*) func_split_short_opt "$_G_opt" -# set dummy "$func_split_short_opt_name" \ -# "-$func_split_short_opt_arg" ${1+"$@"} -# shift -# ;; -# *) set dummy "$_G_opt" "$*"; shift; break ;; -# esac -# done -# -# func_quote_for_eval ${1+"$@"} -# my_silent_option_result=$func_quote_for_eval_result -# } -# func_add_hook func_parse_options my_silent_option -# -# -# my_option_validation () -# { -# $debug_cmd -# -# $opt_silent && $opt_verbose && func_fatal_help "\ -# '--silent' and '--verbose' options are mutually exclusive." -# -# func_quote_for_eval ${1+"$@"} -# my_option_validation_result=$func_quote_for_eval_result -# } -# func_add_hook func_validate_options my_option_validation -# -# You'll alse need to manually amend $usage_message to reflect the extra -# options you parse. It's preferable to append if you can, so that -# multiple option parsing hooks can be added safely. - - -# func_options [ARG]... -# --------------------- -# All the functions called inside func_options are hookable. See the -# individual implementations for details. -func_hookable func_options -func_options () -{ - $debug_cmd - - func_options_prep ${1+"$@"} - eval func_parse_options \ - ${func_options_prep_result+"$func_options_prep_result"} - eval func_validate_options \ - ${func_parse_options_result+"$func_parse_options_result"} - - eval func_run_hooks func_options \ - ${func_validate_options_result+"$func_validate_options_result"} - - # save modified positional parameters for caller - func_options_result=$func_run_hooks_result -} - - -# func_options_prep [ARG]... -# -------------------------- -# All initialisations required before starting the option parse loop. -# Note that when calling hook functions, we pass through the list of -# positional parameters. If a hook function modifies that list, and -# needs to propogate that back to rest of this script, then the complete -# modified list must be put in 'func_run_hooks_result' before -# returning. -func_hookable func_options_prep -func_options_prep () -{ - $debug_cmd - - # Option defaults: - opt_verbose=false - opt_warning_types= - - func_run_hooks func_options_prep ${1+"$@"} - - # save modified positional parameters for caller - func_options_prep_result=$func_run_hooks_result -} - - -# func_parse_options [ARG]... -# --------------------------- -# The main option parsing loop. -func_hookable func_parse_options -func_parse_options () -{ - $debug_cmd - - func_parse_options_result= - - # this just eases exit handling - while test $# -gt 0; do - # Defer to hook functions for initial option parsing, so they - # get priority in the event of reusing an option name. - func_run_hooks func_parse_options ${1+"$@"} - - # Adjust func_parse_options positional parameters to match - eval set dummy "$func_run_hooks_result"; shift - - # Break out of the loop if we already parsed every option. - test $# -gt 0 || break - - _G_opt=$1 - shift - case $_G_opt in - --debug|-x) debug_cmd='set -x' - func_echo "enabling shell trace mode" - $debug_cmd - ;; - - --no-warnings|--no-warning|--no-warn) - set dummy --warnings none ${1+"$@"} - shift - ;; - - --warnings|--warning|-W) - test $# = 0 && func_missing_arg $_G_opt && break - case " $warning_categories $1" in - *" $1 "*) - # trailing space prevents matching last $1 above - func_append_uniq opt_warning_types " $1" - ;; - *all) - opt_warning_types=$warning_categories - ;; - *none) - opt_warning_types=none - warning_func=: - ;; - *error) - opt_warning_types=$warning_categories - warning_func=func_fatal_error - ;; - *) - func_fatal_error \ - "unsupported warning category: '$1'" - ;; - esac - shift - ;; - - --verbose|-v) opt_verbose=: ;; - --version) func_version ;; - -\?|-h) func_usage ;; - --help) func_help ;; - - # Separate optargs to long options (plugins may need this): - --*=*) func_split_equals "$_G_opt" - set dummy "$func_split_equals_lhs" \ - "$func_split_equals_rhs" ${1+"$@"} - shift - ;; - - # Separate optargs to short options: - -W*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - # Separate non-argument short options: - -\?*|-h*|-v*|-x*) - func_split_short_opt "$_G_opt" - set dummy "$func_split_short_opt_name" \ - "-$func_split_short_opt_arg" ${1+"$@"} - shift - ;; - - --) break ;; - -*) func_fatal_help "unrecognised option: '$_G_opt'" ;; - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; - esac - done - - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - func_parse_options_result=$func_quote_for_eval_result -} - - -# func_validate_options [ARG]... -# ------------------------------ -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -func_hookable func_validate_options -func_validate_options () -{ - $debug_cmd - - # Display all warnings if -W was not given. - test -n "$opt_warning_types" || opt_warning_types=" $warning_categories" - - func_run_hooks func_validate_options ${1+"$@"} - - # Bail if the options were screwed! - $exit_cmd $EXIT_FAILURE - - # save modified positional parameters for caller - func_validate_options_result=$func_run_hooks_result -} - - - -## ----------------- ## -## Helper functions. ## -## ----------------- ## - -# This section contains the helper functions used by the rest of the -# hookable option parser framework in ascii-betical order. - - -# func_fatal_help ARG... -# ---------------------- -# Echo program name prefixed message to standard error, followed by -# a help hint, and exit. -func_fatal_help () -{ - $debug_cmd - - eval \$ECHO \""Usage: $usage"\" - eval \$ECHO \""$fatal_help"\" - func_error ${1+"$@"} - exit $EXIT_FAILURE -} - - -# func_help -# --------- -# Echo long help message to standard output and exit. -func_help () -{ - $debug_cmd - - func_usage_message - $ECHO "$long_help_message" - exit 0 -} - - -# func_missing_arg ARGNAME -# ------------------------ -# Echo program name prefixed message to standard error and set global -# exit_cmd. -func_missing_arg () -{ - $debug_cmd - - func_error "Missing argument for '$1'." - exit_cmd=exit -} - - -# func_split_equals STRING -# ------------------------ -# Set func_split_equals_lhs and func_split_equals_rhs shell variables after -# splitting STRING at the '=' sign. -test -z "$_G_HAVE_XSI_OPS" \ - && (eval 'x=a/b/c; - test 5aa/bb/cc = "${#x}${x%%/*}${x%/*}${x#*/}${x##*/}"') 2>/dev/null \ - && _G_HAVE_XSI_OPS=yes - -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=${1%%=*} - func_split_equals_rhs=${1#*=} - test "x$func_split_equals_lhs" = "x$1" \ - && func_split_equals_rhs= - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_equals () - { - $debug_cmd - - func_split_equals_lhs=`expr "x$1" : 'x\([^=]*\)'` - func_split_equals_rhs= - test "x$func_split_equals_lhs" = "x$1" \ - || func_split_equals_rhs=`expr "x$1" : 'x[^=]*=\(.*\)$'` - } -fi #func_split_equals - - -# 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. -if test yes = "$_G_HAVE_XSI_OPS" -then - # This is an XSI compatible shell, allowing a faster implementation... - eval 'func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_arg=${1#??} - func_split_short_opt_name=${1%"$func_split_short_opt_arg"} - }' -else - # ...otherwise fall back to using expr, which is often a shell builtin. - func_split_short_opt () - { - $debug_cmd - - func_split_short_opt_name=`expr "x$1" : 'x-\(.\)'` - func_split_short_opt_arg=`expr "x$1" : 'x-.\(.*\)$'` - } -fi #func_split_short_opt - - -# func_usage -# ---------- -# Echo short help message to standard output and exit. -func_usage () -{ - $debug_cmd - - func_usage_message - $ECHO "Run '$progname --help |${PAGER-more}' for full usage" - exit 0 -} - - -# func_usage_message -# ------------------ -# Echo short help message to standard output. -func_usage_message () -{ - $debug_cmd - - eval \$ECHO \""Usage: $usage"\" - echo - $SED -n 's|^# || - /^Written by/{ - x;p;x - } - h - /^Written by/q' < "$progpath" - echo - eval \$ECHO \""$usage_message"\" -} - - -# func_version -# ------------ -# Echo version message to standard output and exit. -func_version () -{ - $debug_cmd - - printf '%s\n' "$progname $scriptversion" - $SED -n ' - /(C)/!b go - :more - /\./!{ - N - s|\n# | | - b more - } - :go - /^# Written by /,/# warranty; / { - s|^# || - s|^# *$|| - s|\((C)\)[ 0-9,-]*[ ,-]\([1-9][0-9]* \)|\1 \2| - p - } - /^# Written by / { - s|^# || - p - } - /^warranty; /q' < "$progpath" - - exit $? -} - - -# Local variables: -# mode: shell-script -# sh-indentation: 2 -# eval: (add-hook 'before-save-hook 'time-stamp) -# time-stamp-pattern: "10/scriptversion=%:y-%02m-%02d.%02H; # UTC" -# time-stamp-time-zone: "UTC" -# End: - -# Set a version string. -scriptversion='(GNU libtool) 2.4.6' - - -# func_echo ARG... -# ---------------- -# Libtool also displays the current mode in messages, so override -# funclib.sh func_echo with this custom definition. -func_echo () -{ - $debug_cmd - - _G_message=$* - - func_echo_IFS=$IFS - IFS=$nl - for _G_line in $_G_message; do - IFS=$func_echo_IFS - $ECHO "$progname${opt_mode+: $opt_mode}: $_G_line" - done - IFS=$func_echo_IFS -} - - -# func_warning ARG... -# ------------------- -# Libtool warnings are not categorized, so override funclib.sh -# func_warning with this simpler definition. -func_warning () -{ - $debug_cmd - - $warning_func ${1+"$@"} -} - - -## ---------------- ## -## Options parsing. ## -## ---------------- ## - -# Hook in the functions to make sure our own options are parsed during -# the option parsing loop. - -usage='$progpath [OPTION]... [MODE-ARG]...' - -# Short help message in response to '-h'. -usage_message="Options: - --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 - --no-warnings equivalent to '-Wnone' - --preserve-dup-deps don't remove duplicate dependency libraries - --quiet, --silent don't print informational messages - --tag=TAG use configuration variables from tag TAG - -v, --verbose print more informational messages than default - --version print version information - -W, --warnings=CATEGORY report the warnings falling in CATEGORY [all] - -h, --help, --help-all print short, long, or detailed help message -" - -# Additional text appended to 'usage_message' in response to '--help'. -func_help () -{ - $debug_cmd - - func_usage_message - $ECHO "$long_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) - version: $progname $scriptversion Debian-2.4.6-2 - automake: `($AUTOMAKE --version) 2>/dev/null |$SED 1q` - autoconf: `($AUTOCONF --version) 2>/dev/null |$SED 1q` - -Report bugs to . -GNU libtool home page: . -General help using GNU software: ." - exit 0 -} - - -# func_lo2o OBJECT-NAME -# --------------------- -# Transform OBJECT-NAME from a '.lo' suffix to the platform specific -# object suffix. - -lo2o=s/\\.lo\$/.$objext/ -o2lo=s/\\.$objext\$/.lo/ - -if test yes = "$_G_HAVE_XSI_OPS"; then - eval 'func_lo2o () - { - case $1 in - *.lo) func_lo2o_result=${1%.lo}.$objext ;; - * ) func_lo2o_result=$1 ;; - esac - }' - - # func_xform LIBOBJ-OR-SOURCE - # --------------------------- - # Transform LIBOBJ-OR-SOURCE from a '.o' or '.c' (or otherwise) - # suffix to a '.lo' libtool-object suffix. - eval 'func_xform () - { - func_xform_result=${1%.*}.lo - }' -else - # ...otherwise fall back to using sed. - func_lo2o () - { - func_lo2o_result=`$ECHO "$1" | $SED "$lo2o"` - } - - func_xform () - { - func_xform_result=`$ECHO "$1" | $SED 's|\.[^.]*$|.lo|'` - } -fi - - -# func_fatal_configuration ARG... -# ------------------------------- -# Echo program name prefixed message to standard error, followed by -# a configuration failure hint, and exit. -func_fatal_configuration () -{ - func__fatal_error ${1+"$@"} \ - "See the $PACKAGE documentation for more information." \ - "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 yes = "$build_libtool_libs"; then - echo "enable shared libraries" - else - echo "disable shared libraries" - fi - if test yes = "$build_old_libs"; 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 -} - - -# libtool_options_prep [ARG]... -# ----------------------------- -# Preparation for options parsed by libtool. -libtool_options_prep () -{ - $debug_mode - - # Option defaults: - opt_config=false - opt_dlopen= - opt_dry_run=false - opt_help=false - opt_mode= - opt_preserve_dup_deps=false - opt_quiet=false - - nonopt= - preserve_args= - - # 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 - - # Pass back the list of options. - func_quote_for_eval ${1+"$@"} - libtool_options_prep_result=$func_quote_for_eval_result -} -func_add_hook func_options_prep libtool_options_prep - - -# libtool_parse_options [ARG]... -# --------------------------------- -# Provide handling for libtool specific options. -libtool_parse_options () -{ - $debug_cmd - - # Perform our own loop to consume as many options as possible in - # each iteration. - while test $# -gt 0; do - _G_opt=$1 - shift - case $_G_opt in - --dry-run|--dryrun|-n) - opt_dry_run=: - ;; - - --config) func_config ;; - - --dlopen|-dlopen) - opt_dlopen="${opt_dlopen+$opt_dlopen -}$1" - shift - ;; - - --preserve-dup-deps) - opt_preserve_dup_deps=: ;; - - --features) func_features ;; - - --finish) set dummy --mode finish ${1+"$@"}; shift ;; - - --help) opt_help=: ;; - - --help-all) opt_help=': help-all' ;; - - --mode) test $# = 0 && func_missing_arg $_G_opt && break - opt_mode=$1 - case $1 in - # Valid mode arguments: - clean|compile|execute|finish|install|link|relink|uninstall) ;; - - # Catch anything else as an error - *) func_error "invalid argument for $_G_opt" - exit_cmd=exit - break - ;; - esac - shift - ;; - - --no-silent|--no-quiet) - opt_quiet=false - func_append preserve_args " $_G_opt" - ;; - - --no-warnings|--no-warning|--no-warn) - opt_warning=false - func_append preserve_args " $_G_opt" - ;; - - --no-verbose) - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --silent|--quiet) - opt_quiet=: - opt_verbose=false - func_append preserve_args " $_G_opt" - ;; - - --tag) test $# = 0 && func_missing_arg $_G_opt && break - opt_tag=$1 - func_append preserve_args " $_G_opt $1" - func_enable_tag "$1" - shift - ;; - - --verbose|-v) opt_quiet=false - opt_verbose=: - func_append preserve_args " $_G_opt" - ;; - - # An option not handled by this hook function: - *) set dummy "$_G_opt" ${1+"$@"}; shift; break ;; - esac - done - - - # save modified positional parameters for caller - func_quote_for_eval ${1+"$@"} - libtool_parse_options_result=$func_quote_for_eval_result -} -func_add_hook func_parse_options libtool_parse_options - - - -# libtool_validate_options [ARG]... -# --------------------------------- -# Perform any sanity checks on option settings and/or unconsumed -# arguments. -libtool_validate_options () -{ - # save first non-option argument - if test 0 -lt $#; then - nonopt=$1 - shift - fi - - # preserve --debug - test : = "$debug_cmd" || func_append preserve_args " --debug" - - case $host in - # Solaris2 added to fix http://debbugs.gnu.org/cgi/bugreport.cgi?bug=16452 - # see also: http://gcc.gnu.org/bugzilla/show_bug.cgi?id=59788 - *cygwin* | *mingw* | *pw32* | *cegcc* | *solaris2* | *os2*) - # 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 - - test yes != "$build_libtool_libs" \ - && test yes != "$build_old_libs" \ - && func_fatal_configuration "not configured to build any kind of library" - - # Darwin sucks - eval std_shrext=\"$shrext_cmds\" - - # Only execute mode is allowed to have -dlopen flags. - if test -n "$opt_dlopen" && test execute != "$opt_mode"; 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." - } - - # Pass back the unparsed argument list - func_quote_for_eval ${1+"$@"} - libtool_validate_options_result=$func_quote_for_eval_result -} -func_add_hook func_validate_options libtool_validate_options - - -# Process options as early as possible so that --help and --version -# can return quickly. -func_options ${1+"$@"} -eval set dummy "$func_options_result"; shift - - - -## ----------- ## -## Main. ## -## ----------- ## - -magic='%%%MAGIC variable%%%' -magic_exe='%%%MAGIC EXE variable%%%' - -# Global variables. -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= - - -# A function that is used when there is no print builtin or printf. -func_fallback_echo () -{ - eval 'cat <<_LTECHO_EOF -$1 -_LTECHO_EOF' -} - -# func_generated_by_libtool -# True iff stdin has been generated by Libtool. This function is only -# a basic sanity check; it will hardly flush out determined imposters. -func_generated_by_libtool_p () -{ - $GREP "^# Generated by .*$PACKAGE" > /dev/null 2>&1 -} - -# 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 | func_generated_by_libtool_p -} - -# 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 yes = "$lalib_p" -} - -# 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 () -{ - test -f "$1" && - $lt_truncate_bin < "$1" 2>/dev/null | func_generated_by_libtool_p -} - -# 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 () -{ - $debug_cmd - - save_ifs=$IFS; IFS='~' - for cmd in $1; do - IFS=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 yes = "$build_libtool_libs"; then - write_lobj=\'$2\' - else - write_lobj=none - fi - - if test yes = "$build_old_libs"; 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 "$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 () -{ - $debug_cmd - - # 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - # awkward: cmd appends spaces to result - func_convert_core_msys_to_w32_result=`( cmd //c echo "$1" ) 2>/dev/null | - $SED -e 's/[ ]*$//' -e "$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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - $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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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_dll_def_p FILE -# True iff FILE is a Windows DLL '.def' file. -# Keep in sync with _LT_DLL_DEF_P in libtool.m4 -func_dll_def_p () -{ - $debug_cmd - - func_dll_def_p_tmp=`$SED -n \ - -e 's/^[ ]*//' \ - -e '/^\(;.*\)*$/d' \ - -e 's/^\(EXPORTS\|LIBRARY\)\([ ].*\)*$/DEF/p' \ - -e q \ - "$1"` - test DEF = "$func_dll_def_p_tmp" -} - - -# func_mode_compile arg... -func_mode_compile () -{ - $debug_cmd - - # 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 | *.go | *.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 yes = "$build_libtool_libs" \ - || func_fatal_configuration "cannot 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 yes = "$build_old_libs"; 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 no = "$pic_mode" && test pass_all != "$deplibs_check_method"; 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 no = "$compiler_c_o"; 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 yes = "$need_locks"; 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 warn = "$need_locks"; 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 yes = "$build_libtool_libs"; then - # Without this assignment, base_compile gets emptied. - fbsd_hideous_sh_bug=$base_compile - - if test no != "$pic_mode"; 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 warn = "$need_locks" && - 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 yes = "$suppress_opt"; then - suppress_output=' >/dev/null 2>&1' - fi - fi - - # Only build a position-dependent object if we build old libraries. - if test yes = "$build_old_libs"; then - if test yes != "$pic_mode"; then - # Don't build PIC code - command="$base_compile $qsrcfile$pie_flag" - else - command="$base_compile $qsrcfile $pic_flag" - fi - if test yes = "$compiler_c_o"; 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 warn = "$need_locks" && - 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 no != "$need_locks"; then - removelist=$lockfile - $RM "$lockfile" - fi - } - - exit $EXIT_SUCCESS -} - -$opt_help || { - test compile = "$opt_mode" && 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 - -os2dllname NAME force a short DLL name on OS/2 (no effect on other OSes) - -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 () -{ - $debug_cmd - - # 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 $opt_dry_run; then - # 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 - else - 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 - fi -} - -test execute = "$opt_mode" && func_mode_execute ${1+"$@"} - - -# func_mode_finish arg... -func_mode_finish () -{ - $debug_cmd - - 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_quiet && 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 finish = "$opt_mode" && func_mode_finish ${1+"$@"} - - -# func_mode_install arg... -func_mode_install () -{ - $debug_cmd - - # There may be an optional sh(1) argument at the beginning of - # install_prog (especially on Windows NT). - if test "$SHELL" = "$nonopt" || test /bin/sh = "$nonopt" || - # 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=false - 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=: ;; - -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-m = "X$prev" && 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=: - if $isdir; 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 - ;; - os2*) - 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 yes = "$build_old_libs"; 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=: - 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'` - if test -n "$libdir" && test ! -f "$libfile"; then - func_warning "'$lib' has not been installed in '$libdir'" - finalize=false - fi - done - - relink_command= - func_source "$wrapper" - - outputname= - if test no = "$fast_install" && test -n "$relink_command"; then - $opt_dry_run || { - if $finalize; 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_quiet || { - 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_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - - func_show_eval "$install_prog \$file \$oldlib" 'exit $?' - - if test -n "$stripme" && test -n "$old_striplib"; then - func_show_eval "$old_striplib $tool_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 install = "$opt_mode" && 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 () -{ - $debug_cmd - - my_outputname=$1 - my_originator=$2 - my_pic_p=${3-false} - my_prefix=`$ECHO "$my_originator" | $SED 's%[^a-zA-Z0-9]%_%g'` - my_dlsyms= - - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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) $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 can'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 - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* External symbol declarations for the compiler. */\ -" - - if test yes = "$dlself"; 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 - - func_show_eval '$RM "${nlist}I"' - if test -n "$global_symbol_to_import"; then - eval "$global_symbol_to_import"' < "$nlist"S > "$nlist"I' - 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[];\ -" - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ -static void lt_syminit(void) -{ - LT_DLSYM_CONST lt_dlsymlist *symbol = lt_${my_prefix}_LTX_preloaded_symbols; - for (; symbol->name; ++symbol) - {" - $SED 's/.*/ if (STREQ (symbol->name, \"&\")) symbol->address = (void *) \&&;/' < "$nlist"I >> "$output_objdir/$my_dlsyms" - echo >> "$output_objdir/$my_dlsyms" "\ - } -}" - fi - echo >> "$output_objdir/$my_dlsyms" "\ -LT_DLSYM_CONST lt_dlsymlist -lt_${my_prefix}_LTX_preloaded_symbols[] = -{ {\"$my_originator\", (void *) 0}," - - if test -s "$nlist"I; then - echo >> "$output_objdir/$my_dlsyms" "\ - {\"@INIT@\", (void *) <_syminit}," - fi - - 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" ;; - *) - $my_pic_p && pic_flag_for_symtable=" $pic_flag" - ;; - 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" "${nlist}I"' - - # 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_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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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_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 () -{ - $debug_cmd - - 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 - case $nm_interface in - "MS dumpbin") - if func_cygming_ms_implib_p "$1" || - func_cygming_gnu_implib_p "$1" - then - win32_nmres=import - else - win32_nmres= - fi - ;; - *) - 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 - } - }'` - ;; - esac - 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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - 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 that possess that section. Heuristic: eliminate - # all those that 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_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 () -{ - $debug_cmd - - 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 () -{ - $debug_cmd - - f_ex_an_ar_dir=$1; shift - f_ex_an_ar_oldlib=$1 - if test yes = "$lock_old_archive_extraction"; 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 yes = "$lock_old_archive_extraction"; 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 () -{ - $debug_cmd - - 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` - func_basename "$darwin_archive" - darwin_base_archive=$func_basename_result - 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 "$sed_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 where 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) $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/ that is used only on -# windows platforms, and (c) all begin with the string "--lt-" -# (application programs are unlikely to have options that 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) $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 () -{ - case \" \$* \" in - *\\ --lt-*) - for lt_wr_arg - do - case \$lt_wr_arg in - --lt-*) ;; - *) set x \"\$@\" \"\$lt_wr_arg\"; shift;; - esac - shift - done ;; - esac - 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 yes = "$fast_install"; 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 yes = "$shlibpath_overrides_runpath" && 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 - -#define STREQ(s1, s2) (strcmp ((s1), (s2)) == 0) - -/* 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_platform || defined ... */ -#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 -#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 (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]; - size_t 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 = (size_t) (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 (STREQ (str, pat)) - *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 - size_t 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) - { - size_t orig_value_len = strlen (orig_value); - size_t 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 #' */ - size_t len = strlen (new_value); - while ((len > 0) && IS_PATH_SEPARATOR (new_value[len-1])) - { - new_value[--len] = '\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 -n -e ' -s/^\(.\{79\}\)\(..*\)/\1\ -\2/ -h -s/\([\\"]\)/\\\1/g -s/$/\\n/ -s/\([^\n]*\).*/ fputs ("\1", f);/p -g -D' - 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 () -{ - $debug_cmd - - case `eval $file_magic_cmd \"\$1\" 2>/dev/null | $SED -e 10q` in - *import*) : ;; - *) false ;; - esac -} - -# func_suncc_cstd_abi -# !!ONLY CALL THIS FOR SUN CC AFTER $compile_command IS FULLY EXPANDED!! -# Several compiler flags select an ABI that is incompatible with the -# Cstd library. Avoid specifying it if any are in CXXFLAGS. -func_suncc_cstd_abi () -{ - $debug_cmd - - case " $compile_command " in - *" -compat=g "*|*\ -std=c++[0-9][0-9]\ *|*" -library=stdcxx4 "*|*" -library=stlport4 "*) - suncc_use_cstd_abi=no - ;; - *) - suncc_use_cstd_abi=yes - ;; - esac -} - -# func_mode_link arg... -func_mode_link () -{ - $debug_cmd - - 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 - # what 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 that 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= - os2dllname= - non_pic_objects= - precious_files_regex= - prefer_static_libs=no - preload=false - 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 yes != "$build_libtool_libs" \ - && func_fatal_configuration "cannot build a shared library" - build_old_libs=no - break - ;; - -all-static | -static | -static-libtool-libs) - case $arg in - -all-static) - if test yes = "$build_libtool_libs" && 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) - $preload || { - # Add the symbol object into the linking commands. - func_append compile_command " @SYMFILE@" - func_append finalize_command " @SYMFILE@" - preload=: - } - case $arg in - *.la | *.lo) ;; # We handle these cases below. - force) - if test no = "$dlself"; then - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - self) - if test dlprefiles = "$prev"; then - dlself=yes - elif test dlfiles = "$prev" && test yes != "$dlopen_self"; then - dlself=yes - else - dlself=needless - export_dynamic=yes - fi - prev= - continue - ;; - *) - if test dlfiles = "$prev"; 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 - ;; - mllvm) - # Clang does not use LLVM to link, so we can simply discard any - # '-mllvm $arg' options when doing the link step. - 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 none = "$pic_object" && - test none = "$non_pic_object"; 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 none != "$pic_object"; then - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; 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 none != "$non_pic_object"; 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 none = "$pic_object"; 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 - ;; - os2dllname) - os2dllname=$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 rpath = "$prev"; 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-export-symbols = "X$arg"; 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-lc = "X$arg" || test X-lm = "X$arg"; 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-lc = "X$arg" && continue - ;; - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) - # Do not include libc due to us having libc/libc_r. - test X-lc = "X$arg" && 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-lc = "X$arg" && continue - ;; - *-*-sysv4.2uw2* | *-*-sysv5* | *-*-unixware* | *-*-OpenUNIX*) - # Compiler inserts libc in the correct place for threads to work - test X-lc = "X$arg" && continue - ;; - esac - elif test X-lc_r = "X$arg"; then - case $host in - *-*-openbsd* | *-*-freebsd* | *-*-dragonfly* | *-*-bitrig*) - # Do not include libc_r directly, use -pthread flag. - continue - ;; - esac - fi - func_append deplibs " $arg" - continue - ;; - - -mllvm) - prev=mllvm - 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|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - 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 - ;; - - -os2dllname) - prev=os2dllname - 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 - # -fstack-protector* stack protector flags for GCC - # @file GCC response files - # -tp=* Portland pgcc target processor selection - # --sysroot=* for sysroot support - # -O*, -g*, -flto*, -fwhopr*, -fuse-linker-plugin GCC link-time optimization - # -specs=* GCC specs files - # -stdlib=* select c++ std lib with clang - # -fsanitize=* Clang/GCC memory and address sanitizer - -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*|-g*|-flto*|-fwhopr*|-fuse-linker-plugin|-fstack-protector*|-stdlib=*| \ - -specs=*|-fsanitize=*) - 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 - ;; - - -Z*) - if test os2 = "`expr $host : '.*\(os2\)'`"; then - # OS/2 uses -Zxxx to specify OS/2-specific options - compiler_flags="$compiler_flags $arg" - func_append compile_command " $arg" - func_append finalize_command " $arg" - case $arg in - -Zlinker | -Zstack) - prev=xcompiler - ;; - esac - continue - else - # Otherwise treat like 'Some other compiler flag' below - func_quote_for_eval "$arg" - arg=$func_quote_for_eval_result - fi - ;; - - # 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 none = "$pic_object" && - test none = "$non_pic_object"; then - func_fatal_error "cannot find name of object for '$arg'" - fi - - # Extract subdirectory from the argument. - func_dirname "$arg" "/" "" - xdir=$func_dirname_result - - test none = "$pic_object" || { - # Prepend the subdirectory the object is found in. - pic_object=$xdir$pic_object - - if test dlfiles = "$prev"; then - if test yes = "$build_libtool_libs" && test yes = "$dlopen_support"; 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 dlprefiles = "$prev"; then - # Preload the old-style object. - func_append dlprefiles " $pic_object" - prev= - fi - - # A PIC object. - func_append libobjs " $pic_object" - arg=$pic_object - } - - # Non-PIC object. - if test none != "$non_pic_object"; 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 none = "$pic_object"; 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 dlfiles = "$prev"; then - # This library was specified with -dlopen. - func_append dlfiles " $func_resolve_sysroot_result" - prev= - elif test dlprefiles = "$prev"; 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 yes = "$export_dynamic" && 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\" - - # Definition is injected by LT_CONFIG during libtool generation. - func_munge_path_list sys_lib_dlsearch_path "$LT_SYS_LIBRARY_PATH" - - 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 lib = "$linkmode"; 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=false - 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 lib,link = "$linkmode,$pass"; 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 lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass"; then - libs=$deplibs - deplibs= - fi - if test prog = "$linkmode"; then - case $pass in - dlopen) libs=$dlfiles ;; - dlpreopen) libs=$dlprefiles ;; - link) - libs="$deplibs %DEPLIBS%" - test "X$link_all_deplibs" != Xno && libs="$libs $dependency_libs" - ;; - esac - fi - if test lib,dlpreopen = "$linkmode,$pass"; 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 dlopen = "$pass"; then - # Collect dlpreopened libraries - save_deplibs=$deplibs - deplibs= - fi - - for deplib in $libs; do - lib= - found=false - case $deplib in - -mt|-mthreads|-kthread|-Kthread|-pthread|-pthreads|--thread-safe \ - |-threads|-fopenmp|-openmp|-mp|-xopenmp|-omp|-qsmp=*) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - func_append compiler_flags " $deplib" - if test lib = "$linkmode"; then - case "$new_inherited_linker_flags " in - *" $deplib "*) ;; - * ) func_append new_inherited_linker_flags " $deplib" ;; - esac - fi - fi - continue - ;; - -l*) - if test lib != "$linkmode" && test prog != "$linkmode"; then - func_warning "'-l' is ignored for archives/objects" - continue - fi - func_stripname '-l' '' "$deplib" - name=$func_stripname_result - if test lib = "$linkmode"; 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 .la = "$search_ext"; then - found=: - else - found=false - fi - break 2 - fi - done - done - if $found; then - # 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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=false - func_dirname "$lib" "" "." - ladir=$func_dirname_result - lib=$ladir/$old_library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - fi - ;; - *) ;; - esac - fi - else - # deplib doesn't seem to be a libtool library - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - test lib = "$linkmode" && newdependency_libs="$deplib $newdependency_libs" - fi - continue - fi - ;; # -l - *.ltframework) - if test prog,link = "$linkmode,$pass"; then - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - else - deplibs="$deplib $deplibs" - if test lib = "$linkmode"; 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 conv = "$pass" && 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 conv = "$pass"; then - deplibs="$deplib $deplibs" - continue - fi - if test scan = "$pass"; 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 link = "$pass"; 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 conv = "$pass"; 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=false - 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=: - fi - ;; - pass_all) - valid_a_lib=: - ;; - esac - if $valid_a_lib; then - echo - $ECHO "*** Warning: Linking the shared library $output against the" - $ECHO "*** static library $deplib is not portable!" - deplibs="$deplib $deplibs" - else - 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." - fi - ;; - esac - continue - ;; - prog) - if test link != "$pass"; then - deplibs="$deplib $deplibs" - else - compile_deplibs="$deplib $compile_deplibs" - finalize_deplibs="$deplib $finalize_deplibs" - fi - continue - ;; - esac # linkmode - ;; # *.$libext - *.lo | *.$objext) - if test conv = "$pass"; then - deplibs="$deplib $deplibs" - elif test prog = "$linkmode"; then - if test dlpreopen = "$pass" || test yes != "$dlopen_support" || test no = "$build_libtool_libs"; 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=: - continue - ;; - esac # case $deplib - - $found || test -f "$lib" \ - || func_fatal_error "cannot find the library '$lib' or unhandled argument '$deplib'" - - # 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 lib,link = "$linkmode,$pass" || - test prog,scan = "$linkmode,$pass" || - { test prog != "$linkmode" && test lib != "$linkmode"; }; then - test -n "$dlopen" && func_append dlfiles " $dlopen" - test -n "$dlpreopen" && func_append dlprefiles " $dlpreopen" - fi - - if test conv = "$pass"; 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" - 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 - elif test prog != "$linkmode" && test lib != "$linkmode"; then - func_fatal_error "'$lib' is not a convenience library" - fi - continue - fi # $pass = conv - - - # Get the name of the library we link against. - linklib= - if test -n "$old_library" && - { test yes = "$prefer_static_libs" || - test built,no = "$prefer_static_libs,$installed"; }; 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 dlopen = "$pass"; then - test -z "$libdir" \ - && func_fatal_error "cannot -dlopen a convenience library: '$lib'" - if test -z "$dlname" || - test yes != "$dlopen_support" || - test no = "$build_libtool_libs" - 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 yes = "$installed"; 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 yes = "$hardcode_automatic" && 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 dlpreopen = "$pass"; then - if test -z "$libdir" && test prog = "$linkmode"; 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 lib = "$linkmode"; then - deplibs="$dir/$old_library $deplibs" - elif test prog,link = "$linkmode,$pass"; 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 prog = "$linkmode" && test link != "$pass"; then - func_append newlib_search_path " $ladir" - deplibs="$lib $deplibs" - - linkalldeplibs=false - if test no != "$link_all_deplibs" || test -z "$library_names" || - test no = "$build_libtool_libs"; then - linkalldeplibs=: - 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 $linkalldeplibs; 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 prog,link = "$linkmode,$pass"; then - if test -n "$library_names" && - { { test no = "$prefer_static_libs" || - test built,yes = "$prefer_static_libs,$installed"; } || - 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 $alldeplibs && - { test pass_all = "$deplibs_check_method" || - { test yes = "$build_libtool_libs" && - 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 built = "$use_static_libs" && test yes = "$installed"; then - use_static_libs=no - fi - if test -n "$library_names" && - { test no = "$use_static_libs" || test -z "$old_library"; }; then - case $host in - *cygwin* | *mingw* | *cegcc* | *os2*) - # No point in relinking DLLs because paths are not encoded - func_append notinst_deplibs " $lib" - need_relink=no - ;; - *) - if test no = "$installed"; 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 yes = "$shouldnotlink" && test link = "$pass"; then - echo - if test prog = "$linkmode"; 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 lib = "$linkmode" && - test yes = "$hardcode_into_libs"; 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* | *os2*) - 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 prog = "$linkmode" || test relink != "$opt_mode"; then - add_shlibpath= - add_dir= - add= - lib_linked=yes - case $hardcode_action in - immediate | unsupported) - if test no = "$hardcode_direct"; 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 cannot - # 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 no = "$hardcode_minus_L"; then - case $host in - *-*-sunos*) add_shlibpath=$dir ;; - esac - add_dir=-L$dir - add=-l$name - elif test no = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - relink) - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$dir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$absdir - # 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 yes = "$hardcode_shlibpath_var"; then - add_shlibpath=$dir - add=-l$name - else - lib_linked=no - fi - ;; - *) lib_linked=no ;; - esac - - if test yes != "$lib_linked"; 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 prog = "$linkmode"; 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 yes != "$hardcode_direct" && - test yes != "$hardcode_minus_L" && - test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - fi - fi - fi - - if test prog = "$linkmode" || test relink = "$opt_mode"; then - add_shlibpath= - add_dir= - add= - # Finalize command for both is simple: just hardcode it. - if test yes = "$hardcode_direct" && - test no = "$hardcode_direct_absolute"; then - add=$libdir/$linklib - elif test yes = "$hardcode_minus_L"; then - add_dir=-L$libdir - add=-l$name - elif test yes = "$hardcode_shlibpath_var"; then - case :$finalize_shlibpath: in - *":$libdir:"*) ;; - *) func_append finalize_shlibpath "$libdir:" ;; - esac - add=-l$name - elif test yes = "$hardcode_automatic"; 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 prog = "$linkmode"; 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 prog = "$linkmode"; 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 unsupported != "$hardcode_direct"; 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 yes = "$build_libtool_libs"; then - # Not a shared library - if test pass_all != "$deplibs_check_method"; 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 cannot 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 yes = "$module"; 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 no = "$build_old_libs"; 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 lib = "$linkmode"; then - if test -n "$dependency_libs" && - { test yes != "$hardcode_into_libs" || - test yes = "$build_old_libs" || - test yes = "$link_static"; }; 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 no = "$link_static" && 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 no != "$link_all_deplibs"; 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 link = "$pass"; then - if test prog = "$linkmode"; 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 dlpreopen = "$pass"; then - # Link the dlpreopened libraries before other libraries - for deplib in $save_deplibs; do - deplibs="$deplib $deplibs" - done - fi - if test dlopen != "$pass"; then - test conv = "$pass" || { - # 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= - } - - if test prog,link = "$linkmode,$pass"; then - vars="compile_deplibs finalize_deplibs" - else - vars=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 - - # Add Sun CC postdeps if required: - test CXX = "$tagname" && { - case $host_os in - linux*) - case `$CC -V 2>&1 | sed 5q` in - *Sun\ C*) # Sun C++ 5.9 - func_suncc_cstd_abi - - if test no != "$suncc_use_cstd_abi"; then - func_append postdeps ' -library=Cstd -library=Crun' - fi - ;; - esac - ;; - - solaris*) - func_cc_basename "$CC" - case $func_cc_basename_result in - CC* | sunCC*) - func_suncc_cstd_abi - - if test no != "$suncc_use_cstd_abi"; then - func_append postdeps ' -library=Cstd -library=Crun' - fi - ;; - esac - ;; - esac - } - - # 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 prog = "$linkmode"; then - dlfiles=$newdlfiles - fi - if test prog = "$linkmode" || test lib = "$linkmode"; then - dlprefiles=$newdlprefiles - fi - - case $linkmode in - oldlib) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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 no = "$module" \ - && func_fatal_help "libtool library '$output' must begin with 'lib'" - - if test no != "$need_lib_prefix"; 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 pass_all != "$deplibs_check_method"; 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 no = "$dlself" \ - || func_warning "'-dlopen self' is ignored for libtool libraries" - - set dummy $rpath - shift - test 1 -lt "$#" \ - && func_warning "ignoring multiple '-rpath's for a libtool library" - - install_libdir=$1 - - oldlibs= - if test -z "$rpath"; then - if test yes = "$build_libtool_libs"; 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 - # that has an extra 1 added just for fun - # - case $version_type in - # correct linux to gnu/linux during the next big refactor - darwin|freebsd-elf|linux|osf|windows|none) - func_arith $number_major + $number_minor - current=$func_arith_result - age=$number_minor - revision=$number_revision - ;; - freebsd-aout|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 - ;; - *) - func_fatal_configuration "$modename: unknown library version type '$version_type'" - ;; - 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" - # On Darwin other compilers - case $CC in - nagfor*) - verstring="$wl-compatibility_version $wl$minor_current $wl-current_version $wl$minor_current.$revision" - ;; - *) - verstring="-compatibility_version $minor_current -current_version $minor_current.$revision" - ;; - esac - ;; - - freebsd-aout) - major=.$current - versuffix=.$current.$revision - ;; - - freebsd-elf) - func_arith $current - $age - major=.$func_arith_result - versuffix=$major.$age.$revision - ;; - - irix | nonstopux) - if test no = "$lt_irix_increment"; 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 0 -ne "$loop"; 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) # correct to gnu/linux during the next big refactor - 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 0 -ne "$loop"; 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 - ;; - - sco) - major=.$current - versuffix=.$current - ;; - - sunos) - major=.$current - versuffix=.$current.$revision - ;; - - windows) - # Use '-' rather than '.', since we only want one - # extension on DOS 8.3 file systems. - 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 no = "$need_version"; then - versuffix= - else - versuffix=.0.0 - fi - fi - - # Remove version info from name if versioning should be avoided - if test yes,no = "$avoid_version,$need_version"; then - major= - versuffix= - verstring= - fi - - # Check to see if the archive will have undefined symbols. - if test yes = "$allow_undefined"; then - if test unsupported = "$allow_undefined_flag"; then - if test yes = "$build_old_libs"; then - func_warning "undefined symbols not allowed in $host shared libraries; building static only" - build_libtool_libs=no - else - func_fatal_error "can't build $host shared library unless -no-undefined is specified" - fi - fi - else - # Don't allow undefined symbols. - allow_undefined_flag=$no_undefined_flag - fi - - fi - - func_generate_dlsyms "$libname" "$libname" : - func_append libobjs " $symfileobj" - test " " = "$libobjs" && libobjs= - - if test relink != "$opt_mode"; 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 -n "$precious_files_regex"; 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 yes = "$build_old_libs" && test convenience != "$build_libtool_libs"; 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 yes != "$hardcode_into_libs" || test yes = "$build_old_libs"; 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 yes = "$build_libtool_libs"; 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 yes = "$build_libtool_need_lc"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 yes = "$allow_libtool_libs_with_static_runtimes"; 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 none = "$deplibs_check_method"; 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 yes = "$droppeddeps"; then - if test yes = "$module"; 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 no = "$build_old_libs"; 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 no = "$allow_undefined"; 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 no = "$build_old_libs"; 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 yes = "$build_libtool_libs"; then - # Remove $wl instances when linking with ld. - # FIXME: should test the right _cmds variable. - case $archive_cmds in - *\$LD\ *) wl= ;; - esac - if test yes = "$hardcode_into_libs"; then - # Hardcode the library paths - hardcode_libdirs= - dep_rpath= - rpath=$finalize_rpath - test relink = "$opt_mode" || 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_append 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 "dep_rpath=\"$hardcode_libdir_flag_spec\"" - 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 relink = "$opt_mode" || 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 - func_dll_def_p "$export_symbols" || { - # 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 - ;; - esac - - # Prepare the list of exported symbols - if test -z "$export_symbols"; then - if test yes = "$always_export_symbols" || 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 yes = "$try_normal_branch" \ - && { 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 : != "$skipped_export"; 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 : != "$skipped_export" && 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 yes = "$compiler_needs_object" && - 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 yes = "$thread_safe" && 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 relink = "$opt_mode"; 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 yes = "$module" && 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 : != "$skipped_export" && - 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 : != "$skipped_export" && test yes = "$with_gnu_ld"; 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 : != "$skipped_export" && test -n "$file_list_spec"; then - output=$output_objdir/$output_la.lnk - func_verbose "creating linker input file list: $output" - : > $output - set x $save_libobjs - shift - firstobj= - if test yes = "$compiler_needs_object"; 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 -z "$objlist" || - 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 1 -eq "$k"; 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 - - ${skipped_export-false} && { - 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 - } - - 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_quiet || { - 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 relink = "$opt_mode"; 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 - - ${skipped_export-false} && { - 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 - } - - 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 yes = "$module" && 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=$sp$nl - eval cmd=\"$cmd\" - IFS=$save_ifs - $opt_quiet || { - 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 relink = "$opt_mode"; 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 relink = "$opt_mode"; 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 yes = "$module" || test yes = "$export_dynamic"; then - # On all known operating systems, these are identical. - dlname=$soname - fi - fi - ;; - - obj) - if test -n "$dlfiles$dlprefiles" || test no != "$dlself"; 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= - # if reload_cmds runs $LD directly, get rid of -Wl from - # whole_archive_flag_spec and hope we can get by with turning comma - # into space. - case $reload_cmds in - *\$LD[\ \$]*) wl= ;; - esac - if test -n "$convenience"; then - if test -n "$whole_archive_flag_spec"; then - eval tmp_whole_archive_flags=\"$whole_archive_flag_spec\" - test -n "$wl" || tmp_whole_archive_flags=`$ECHO "$tmp_whole_archive_flags" | $SED 's|,| |g'` - reload_conv_objs=$reload_objs\ $tmp_whole_archive_flags - 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 yes = "$build_libtool_libs" || 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 - - 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 - - test yes = "$build_libtool_libs" || { - 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 - } - - if test -n "$pic_flag" || test default != "$pic_mode"; 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" - - $preload \ - && test unknown,unknown,unknown = "$dlopen_support,$dlopen_self,$dlopen_self_static" \ - && 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 CXX = "$tagname"; 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 yes = "$build_old_libs"; 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@" false - - # template prelinking step - if test -n "$prelink_cmds"; then - func_execute_cmds "$prelink_cmds" 'exit $?' - fi - - wrappers_required=: - case $host in - *cegcc* | *mingw32ce*) - # Disable wrappers for cegcc and mingw32ce hosts, we are cross compiling anyway. - wrappers_required=false - ;; - *cygwin* | *mingw* ) - test yes = "$build_libtool_libs" || wrappers_required=false - ;; - *) - if test no = "$need_relink" || test yes != "$build_libtool_libs"; then - wrappers_required=false - fi - ;; - esac - $wrappers_required || { - # 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 - } - - 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 yes = "$no_install"; 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 - - case $hardcode_action,$fast_install in - relink,*) - # 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" - ;; - *,yes) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command=`$ECHO "$compile_var$compile_command$compile_rpath" | $SED 's%@OUTPUT@%\$progdir/\$file%g'` - ;; - *,no) - link_command=$compile_var$compile_command$compile_rpath - relink_command=$finalize_var$finalize_command$finalize_rpath - ;; - *,needless) - link_command=$finalize_var$compile_command$finalize_rpath - relink_command= - ;; - esac - - # 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 - - case $build_libtool_libs in - convenience) - oldobjs="$libobjs_save $symfileobj" - addlibs=$convenience - build_libtool_libs=no - ;; - module) - oldobjs=$libobjs_save - addlibs=$old_convenience - build_libtool_libs=no - ;; - *) - oldobjs="$old_deplibs $non_pic_objects" - $preload && test -f "$symfileobj" \ - && func_append oldobjs " $symfileobj" - addlibs=$old_convenience - ;; - esac - - 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 yes = "$build_libtool_libs"; 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 - func_to_tool_file "$oldlib" func_convert_file_msys_to_w32 - tool_oldlib=$func_to_tool_file_result - 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 -z "$oldobjs"; 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 yes = "$build_old_libs" && 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 yes = "$hardcode_automatic"; then - relink_command= - fi - - # Only create the output if not a dry run. - $opt_dry_run || { - for installed in no yes; do - if test yes = "$installed"; 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 - func_resolve_sysroot "$deplib" - eval libdir=`$SED -n -e 's/^libdir=\(.*\)$/\1/p' $func_resolve_sysroot_result` - 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 -n "$bindir"; 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) $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 cannot 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 no,yes = "$installed,$need_relink"; 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 -} - -if test link = "$opt_mode" || test relink = "$opt_mode"; then - func_mode_link ${1+"$@"} -fi - - -# func_mode_uninstall arg... -func_mode_uninstall () -{ - $debug_cmd - - RM=$nonopt - files= - rmforce=false - 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=: ;; - -*) 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 . = "$dir"; then - odir=$objdir - else - odir=$dir/$objdir - fi - func_basename "$file" - name=$func_basename_result - test uninstall = "$opt_mode" && odir=$dir - - # Remember odir for removal later, being careful to avoid duplicates - if test clean = "$opt_mode"; 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 $rmforce; 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" '$rmforce || exit_status=1' - fi - - if test -n "$old_library"; then - # Do each command in the old_postuninstall commands. - func_execute_cmds "$old_postuninstall_cmds" '$rmforce || 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 none != "$pic_object"; 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 none != "$non_pic_object"; then - func_append rmfiles " $dir/$non_pic_object" - fi - fi - ;; - - *) - if test clean = "$opt_mode"; 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 yes = "$fast_install" && 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 -} - -if test uninstall = "$opt_mode" || test clean = "$opt_mode"; then - func_mode_uninstall ${1+"$@"} -fi - -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 -# where 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: - -# ### BEGIN LIBTOOL TAG CONFIG: CXX - -# The linker used to build libraries. -LD="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 \$tool_oldlib" - -# A language specific compiler. -CC="g++" - -# Is the compiler the GNU compiler? -with_gcc=yes - -# Compiler flag to turn off builtin functions. -no_builtin_flag=" -fno-builtin" - -# 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-undefined \${wl}dynamic_lookup" - -# 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="" - -# 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 - -# The directories searched by this compiler when creating a shared library. -compiler_lib_search_dirs="" - -# Dependencies to place before and after the objects being linked to -# create a shared library. -predep_objects="" -postdep_objects="" -predeps="" -postdeps="" - -# The library search path used internally by the compiler when linking -# a shared library. -compiler_lib_search_path="" - -# ### END LIBTOOL TAG CONFIG: CXX diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/local.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/local.exp deleted file mode 100644 index 4889cba..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/local.exp +++ /dev/null @@ -1,2 +0,0 @@ -set CC_FOR_TARGET "xcrun clang" -set CXX_FOR_TARGET "g++" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/man/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/man/Makefile deleted file mode 100644 index d8eec37..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/man/Makefile +++ /dev/null @@ -1,558 +0,0 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. -# man/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994-2014 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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -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-darwin18.6.0 -host_triplet = x86_64-apple-darwin18.6.0 -target_triplet = x86_64-apple-darwin18.6.0 -subdir = man -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.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) -DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/fficonfig.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_$(V)) -am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -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__uninstall_files_from_dir = { \ - test -z "$$files" \ - || { test ! -d "$$dir" && test ! -f "$$dir" && test ! -r "$$dir"; } \ - || { echo " ( cd '$$dir' && rm -f" $$files ")"; \ - $(am__cd) "$$dir" && rm -f $$files; }; \ - } -man3dir = $(mandir)/man3 -am__installdirs = "$(DESTDIR)$(man3dir)" -NROFF = nroff -MANS = $(man_MANS) -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -am__DIST_COMMON = $(srcdir)/Makefile.in -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing aclocal-1.15 -ALLOCA = -AMTAR = $${TAR-tar} -AM_DEFAULT_VERBOSITY = 1 -AM_LTLDFLAGS = -AM_RUNTESTFLAGS = -AR = ar -AUTOCONF = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoconf -AUTOHEADER = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoheader -AUTOMAKE = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing automake-1.15 -AWK = awk -CC = xcrun clang -CCAS = xcrun clang -CCASDEPMODE = depmode=none -CCASFLAGS = -CCDEPMODE = depmode=none -CFLAGS = -Wall -fexceptions -CPP = xcrun clang -E -CPPFLAGS = -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=none -CXXFLAGS = -g -O2 -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 -HAVE_LONG_DOUBLE_VARIANT = 0 -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -LD = ld -LDFLAGS = -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LIPO = lipo -LN_S = ln -s -LTLIBOBJS = -LT_SYS_LIBRARY_PATH = -MAINT = # -MAKEINFO = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo -MANIFEST_TOOL = : -MKDIR_P = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d -NM = /usr/bin/nm -B -NMEDIT = nmedit -OBJDUMP = objdump -OBJEXT = o -OPT_LDFLAGS = -OTOOL = otool -OTOOL64 = : -PACKAGE = libffi -PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues -PACKAGE_NAME = libffi -PACKAGE_STRING = libffi 3.99999 -PACKAGE_TARNAME = libffi -PACKAGE_URL = -PACKAGE_VERSION = 3.99999 -PATH_SEPARATOR = : -PRTDIAG = -RANLIB = ranlib -SECTION_LDFLAGS = -SED = /usr/bin/sed -SET_MAKE = -SHELL = /bin/sh -STRIP = strip -TARGET = X86_64 -TARGETDIR = x86 -TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -VERSION = 3.99999 -abs_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/man -abs_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man -abs_top_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18 -abs_top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -ac_ct_AR = ar -ac_ct_CC = xcrun clang -ac_ct_CXX = g++ -ac_ct_DUMPBIN = -am__include = include -am__leading_dot = . -am__quote = -am__tar = $${TAR-tar} chof - "$$tardir" -am__untar = $${TAR-tar} xf - -ax_enable_builddir_sed = sed -bindir = ${exec_prefix}/bin -build = x86_64-apple-darwin18.6.0 -build_alias = -build_cpu = x86_64 -build_os = darwin18.6.0 -build_vendor = apple -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host = x86_64-apple-darwin18.6.0 -host_alias = -host_cpu = x86_64 -host_os = darwin18.6.0 -host_vendor = apple -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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 = $(MKDIR_P) -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr/local -program_transform_name = s,x,x, -psdir = ${docdir} -runstatedir = ${localstatedir}/run -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man -sys_symbol_underscore = yes -sysconfdir = ${prefix}/etc -target = x86_64-apple-darwin18.6.0 -target_alias = -target_cpu = x86_64 -target_os = darwin18.6.0 -target_vendor = apple -toolexecdir = ${exec_prefix}/lib/gcc-lib/$(target_alias) -toolexeclibdir = ${exec_prefix}/lib -top_build_prefix = ../ -top_builddir = .. -top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -AUTOMAKE_OPTIONS = foreign -EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 -man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.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 -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) - @list1=''; \ - list2='$(man_MANS)'; \ - test -n "$(man3dir)" \ - && test -n "`echo $$list1$$list2`" \ - || exit 0; \ - echo " $(MKDIR_P) '$(DESTDIR)$(man3dir)'"; \ - $(MKDIR_P) "$(DESTDIR)$(man3dir)" || exit 1; \ - { for i in $$list1; do echo "$$i"; done; \ - if test -n "$$list2"; then \ - for i in $$list2; do echo "$$i"; done \ - | sed -n '/\.3[a-z]*$$/p'; \ - fi; \ - } | 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,.,'`; \ - dir='$(DESTDIR)$(man3dir)'; $(am__uninstall_files_from_dir) -tags TAGS: - -ctags CTAGS: - -cscope cscopelist: - - -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 $(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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -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 \ - cscopelist-am ctags-am 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 tags-am uninstall uninstall-am uninstall-man \ - uninstall-man3 - -.PRECIOUS: Makefile - - -# 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.25/ext/ffi_c/libffi-universal-darwin18/src/.deps/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/.deps/.dirstamp deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/.dirstamp deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/closures.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/closures.lo deleted file mode 100644 index 613cbdf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/closures.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/closures.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# 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.25/ext/ffi_c/libffi-universal-darwin18/src/java_raw_api.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/java_raw_api.lo deleted file mode 100644 index 0b99622..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/java_raw_api.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/java_raw_api.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# 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.25/ext/ffi_c/libffi-universal-darwin18/src/prep_cif.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/prep_cif.lo deleted file mode 100644 index 1ab7932..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/prep_cif.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/prep_cif.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# 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.25/ext/ffi_c/libffi-universal-darwin18/src/raw_api.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/raw_api.lo deleted file mode 100644 index e7e6231..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/raw_api.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/raw_api.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# 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.25/ext/ffi_c/libffi-universal-darwin18/src/types.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/types.lo deleted file mode 100644 index 40b7aec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/types.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/types.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# 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.25/ext/ffi_c/libffi-universal-darwin18/src/x86/.deps/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/.deps/.dirstamp deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/.dirstamp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/.dirstamp deleted file mode 100644 index e69de29..0000000 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffi64.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffi64.lo deleted file mode 100644 index 94ca203..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffi64.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/x86/ffi64.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# 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.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffiw64.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffiw64.lo deleted file mode 100644 index fa1b571..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/ffiw64.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/x86/ffiw64.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# Name of the PIC object. -pic_object='.libs/ffiw64.o' - -# Name of the non-PIC object -non_pic_object=none - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/unix64.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/unix64.lo deleted file mode 100644 index b0e5eb1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/unix64.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/x86/unix64.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# Name of the PIC object. -pic_object='.libs/unix64.o' - -# Name of the non-PIC object -non_pic_object=none - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/win64.lo b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/win64.lo deleted file mode 100644 index 79f901c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/src/x86/win64.lo +++ /dev/null @@ -1,12 +0,0 @@ -# src/x86/win64.lo - a libtool object file -# Generated by libtool (GNU libtool) 2.4.6 Debian-2.4.6-2 -# -# Please DO NOT delete this file! -# It is necessary for linking the library. - -# Name of the PIC object. -pic_object='.libs/win64.o' - -# Name of the non-PIC object -non_pic_object=none - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/stamp-h1 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/stamp-h1 deleted file mode 100644 index e43c201..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/stamp-h1 +++ /dev/null @@ -1 +0,0 @@ -timestamp for fficonfig.h diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/testsuite/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/testsuite/Makefile deleted file mode 100644 index e409f92..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/testsuite/Makefile +++ /dev/null @@ -1,608 +0,0 @@ -# Makefile.in generated by automake 1.15 from Makefile.am. -# testsuite/Makefile. Generated from Makefile.in by configure. - -# Copyright (C) 1994-2014 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/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite -am__is_gnu_make = { \ - if test -z '$(MAKELEVEL)'; then \ - false; \ - elif test -n '$(MAKE_HOST)'; then \ - true; \ - elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ - true; \ - else \ - false; \ - fi; \ -} -am__make_running_with_option = \ - case $${target_option-} in \ - ?) ;; \ - *) echo "am__make_running_with_option: internal error: invalid" \ - "target option '$${target_option-}' specified" >&2; \ - exit 1;; \ - esac; \ - has_opt=no; \ - sane_makeflags=$$MAKEFLAGS; \ - if $(am__is_gnu_make); then \ - sane_makeflags=$$MFLAGS; \ - else \ - case $$MAKEFLAGS in \ - *\\[\ \ ]*) \ - bs=\\; \ - sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ - | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ - esac; \ - fi; \ - skip_next=no; \ - strip_trailopt () \ - { \ - flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ - }; \ - for flg in $$sane_makeflags; do \ - test $$skip_next = yes && { skip_next=no; continue; }; \ - case $$flg in \ - *=*|--*) continue;; \ - -*I) strip_trailopt 'I'; skip_next=yes;; \ - -*I?*) strip_trailopt 'I';; \ - -*O) strip_trailopt 'O'; skip_next=yes;; \ - -*O?*) strip_trailopt 'O';; \ - -*l) strip_trailopt 'l'; skip_next=yes;; \ - -*l?*) strip_trailopt 'l';; \ - -[dEDm]) skip_next=yes;; \ - -[JT]) skip_next=yes;; \ - esac; \ - case $$flg in \ - *$$target_option*) has_opt=yes; break;; \ - esac; \ - done; \ - test $$has_opt = yes -am__make_dryrun = (target_option=n; $(am__make_running_with_option)) -am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) -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-darwin18.6.0 -host_triplet = x86_64-apple-darwin18.6.0 -target_triplet = x86_64-apple-darwin18.6.0 -subdir = testsuite -ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 -am__aclocal_m4_deps = $(top_srcdir)/m4/asmcfi.m4 \ - $(top_srcdir)/m4/ax_append_flag.m4 \ - $(top_srcdir)/m4/ax_cc_maxopt.m4 \ - $(top_srcdir)/m4/ax_cflags_warn_all.m4 \ - $(top_srcdir)/m4/ax_check_compile_flag.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) -DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) -mkinstalldirs = $(install_sh) -d -CONFIG_HEADER = $(top_builddir)/fficonfig.h -CONFIG_CLEAN_FILES = -CONFIG_CLEAN_VPATH_FILES = -AM_V_P = $(am__v_P_$(V)) -am__v_P_ = $(am__v_P_$(AM_DEFAULT_VERBOSITY)) -am__v_P_0 = false -am__v_P_1 = : -AM_V_GEN = $(am__v_GEN_$(V)) -am__v_GEN_ = $(am__v_GEN_$(AM_DEFAULT_VERBOSITY)) -am__v_GEN_0 = @echo " GEN " $@; -am__v_GEN_1 = -AM_V_at = $(am__v_at_$(V)) -am__v_at_ = $(am__v_at_$(AM_DEFAULT_VERBOSITY)) -am__v_at_0 = @ -am__v_at_1 = -SOURCES = -DIST_SOURCES = -am__can_run_installinfo = \ - case $$AM_UPDATE_INFO_DIR in \ - n|no|NO) false;; \ - *) (install-info --version) >/dev/null 2>&1;; \ - esac -am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) -DEJATOOL = $(PACKAGE) -RUNTESTDEFAULTFLAGS = --tool $$tool --srcdir $$srcdir -EXPECT = expect -RUNTEST = runtest -am__DIST_COMMON = $(srcdir)/Makefile.in -DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) -ACLOCAL = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing aclocal-1.15 -ALLOCA = -AMTAR = $${TAR-tar} -AM_DEFAULT_VERBOSITY = 1 -AM_LTLDFLAGS = -AM_RUNTESTFLAGS = -AR = ar -AUTOCONF = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoconf -AUTOHEADER = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing autoheader -AUTOMAKE = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing automake-1.15 -AWK = awk -CC = xcrun clang -CCAS = xcrun clang -CCASDEPMODE = depmode=none -CCASFLAGS = -CCDEPMODE = depmode=none -CFLAGS = -Wall -fexceptions -CPP = xcrun clang -E -CPPFLAGS = -CXX = g++ -CXXCPP = g++ -E -CXXDEPMODE = depmode=none -CXXFLAGS = -g -O2 -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 -HAVE_LONG_DOUBLE_VARIANT = 0 -INSTALL = /usr/bin/install -c -INSTALL_DATA = ${INSTALL} -m 644 -INSTALL_PROGRAM = ${INSTALL} -INSTALL_SCRIPT = ${INSTALL} -INSTALL_STRIP_PROGRAM = $(install_sh) -c -s -LD = ld -LDFLAGS = -LIBOBJS = -LIBS = -LIBTOOL = $(SHELL) $(top_builddir)/libtool -LIPO = lipo -LN_S = ln -s -LTLIBOBJS = -LT_SYS_LIBRARY_PATH = -MAINT = # -MAKEINFO = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/missing makeinfo -MANIFEST_TOOL = : -MKDIR_P = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/install-sh -c -d -NM = /usr/bin/nm -B -NMEDIT = nmedit -OBJDUMP = objdump -OBJEXT = o -OPT_LDFLAGS = -OTOOL = otool -OTOOL64 = : -PACKAGE = libffi -PACKAGE_BUGREPORT = http://github.com/libffi/libffi/issues -PACKAGE_NAME = libffi -PACKAGE_STRING = libffi 3.99999 -PACKAGE_TARNAME = libffi -PACKAGE_URL = -PACKAGE_VERSION = 3.99999 -PATH_SEPARATOR = : -PRTDIAG = -RANLIB = ranlib -SECTION_LDFLAGS = -SED = /usr/bin/sed -SET_MAKE = -SHELL = /bin/sh -STRIP = strip -TARGET = X86_64 -TARGETDIR = x86 -TARGET_OBJ = src/x86/ffi64.lo src/x86/unix64.lo src/x86/ffiw64.lo src/x86/win64.lo -VERSION = 3.99999 -abs_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18/testsuite -abs_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite -abs_top_builddir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi-universal-darwin18 -abs_top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -ac_ct_AR = ar -ac_ct_CC = xcrun clang -ac_ct_CXX = g++ -ac_ct_DUMPBIN = -am__include = include -am__leading_dot = . -am__quote = -am__tar = $${TAR-tar} chof - "$$tardir" -am__untar = $${TAR-tar} xf - -ax_enable_builddir_sed = sed -bindir = ${exec_prefix}/bin -build = x86_64-apple-darwin18.6.0 -build_alias = -build_cpu = x86_64 -build_os = darwin18.6.0 -build_vendor = apple -builddir = . -datadir = ${datarootdir} -datarootdir = ${prefix}/share -docdir = ${datarootdir}/doc/${PACKAGE_TARNAME} -dvidir = ${docdir} -exec_prefix = ${prefix} -host = x86_64-apple-darwin18.6.0 -host_alias = -host_cpu = x86_64 -host_os = darwin18.6.0 -host_vendor = apple -htmldir = ${docdir} -includedir = ${prefix}/include -infodir = ${datarootdir}/info -install_sh = ${SHELL} /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/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 = $(MKDIR_P) -oldincludedir = /usr/include -pdfdir = ${docdir} -prefix = /usr/local -program_transform_name = s,x,x, -psdir = ${docdir} -runstatedir = ${localstatedir}/run -sbindir = ${exec_prefix}/sbin -sharedstatedir = ${prefix}/com -srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite -sys_symbol_underscore = yes -sysconfdir = ${prefix}/etc -target = x86_64-apple-darwin18.6.0 -target_alias = -target_cpu = x86_64 -target_os = darwin18.6.0 -target_vendor = apple -toolexecdir = ${exec_prefix}/lib/gcc-lib/$(target_alias) -toolexeclibdir = ${exec_prefix}/lib -top_build_prefix = ../ -top_builddir = .. -top_srcdir = /Users/hanna/Documents/GitHub/irma-website/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi -AUTOMAKE_OPTIONS = foreign dejagnu -EXTRA_DEJAGNU_SITE_CONFIG = ../local.exp -CLEANFILES = *.exe core* *.log *.sum -EXTRA_DIST = config/default.exp libffi.call/cls_19byte.c \ -libffi.call/cls_align_longdouble_split.c \ -libffi.call/closure_loc_fn0.c libffi.call/cls_schar.c \ -libffi.call/closure_fn1.c \ -libffi.call/return_ul.c libffi.call/cls_align_double.c \ -libffi.call/return_fl2.c libffi.call/cls_1_1byte.c \ -libffi.call/cls_64byte.c libffi.call/nested_struct7.c \ -libffi.call/cls_align_sint32.c libffi.call/nested_struct2.c \ -libffi.call/ffitest.h libffi.call/nested_struct4.c \ -libffi.call/cls_multi_ushort.c libffi.call/struct3.c \ -libffi.call/cls_3byte1.c libffi.call/cls_16byte.c \ -libffi.call/struct8.c libffi.call/nested_struct8.c \ -libffi.call/cls_multi_sshort.c libffi.call/cls_3byte2.c \ -libffi.call/cls_pointer.c \ -libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ -libffi.call/cls_9byte2.c libffi.call/cls_multi_schar.c \ -libffi.call/stret_medium2.c libffi.call/cls_5_1_byte.c \ -libffi.call/call.exp libffi.call/cls_double.c \ -libffi.call/cls_align_sint16.c libffi.call/cls_uint.c \ -libffi.call/return_ll1.c libffi.call/nested_struct3.c \ -libffi.call/cls_20byte1.c libffi.call/closure_fn4.c \ -libffi.call/cls_uchar.c libffi.call/struct2.c libffi.call/cls_7byte.c \ -libffi.call/strlen.c libffi.call/many.c libffi.call/testclosure.c \ -libffi.call/return_fl.c libffi.call/struct5.c \ -libffi.call/cls_12byte.c libffi.call/cls_multi_sshortchar.c \ -libffi.call/cls_align_longdouble_split2.c libffi.call/return_dbl2.c \ -libffi.call/return_fl3.c libffi.call/stret_medium.c \ -libffi.call/nested_struct6.c libffi.call/closure_fn3.c \ -libffi.call/float3.c libffi.call/many2.c \ -libffi.call/closure_simple.c libffi.call/cls_align_uint16.c \ -libffi.call/cls_9byte1.c libffi.call/closure_fn6.c \ -libffi.call/cls_double_va.c libffi.call/cls_align_pointer.c \ -libffi.call/cls_align_longdouble.c libffi.call/closure_fn2.c \ -libffi.call/cls_sshort.c \ -libffi.call/nested_struct.c libffi.call/cls_20byte.c \ -libffi.call/cls_longdouble.c libffi.call/cls_multi_uchar.c \ -libffi.call/return_uc.c \ -libffi.call/cls_18byte.c libffi.call/cls_8byte.c \ -libffi.call/promotion.c \ -libffi.call/return_dbl.c libffi.call/cls_24byte.c \ -libffi.call/struct4.c libffi.call/cls_6byte.c \ -libffi.call/cls_align_uint32.c libffi.call/float.c \ -libffi.call/float1.c libffi.call/float_va.c libffi.call/negint.c \ -libffi.call/return_dbl1.c libffi.call/cls_3_1byte.c \ -libffi.call/cls_align_float.c libffi.call/return_fl1.c \ -libffi.call/nested_struct10.c libffi.call/nested_struct5.c \ -libffi.call/cls_align_sint64.c \ -libffi.call/stret_large2.c libffi.call/return_sl.c \ -libffi.call/closure_fn0.c libffi.call/cls_5byte.c \ -libffi.call/cls_2byte.c libffi.call/float2.c \ -libffi.call/cls_dbls_struct.c libffi.call/cls_sint.c \ -libffi.call/stret_large.c libffi.call/cls_ulonglong.c \ -libffi.call/cls_ushort.c libffi.call/nested_struct1.c \ -libffi.call/err_bad_abi.c libffi.call/cls_longdouble_va.c \ -libffi.call/cls_float.c libffi.call/cls_pointer_stack.c \ -libffi.call/pyobjc-tc.c libffi.call/cls_multi_ushortchar.c \ -libffi.call/struct1.c libffi.call/nested_struct9.c \ -libffi.call/huge_struct.c libffi.call/problem1.c \ -libffi.call/float4.c \ -libffi.call/return_ldl.c \ -libffi.call/closure_fn5.c \ -libffi.call/struct6.c libffi.call/return_ll.c libffi.call/struct9.c \ -libffi.call/return_sc.c libffi.call/struct7.c \ -libffi.call/cls_align_uint64.c libffi.call/cls_4byte.c \ -libffi.call/cls_6_1_byte.c \ -libffi.call/cls_7_1_byte.c libffi.call/unwindtest.cc \ -libffi.call/unwindtest_ffi_call.cc \ -lib/wrapper.exp lib/target-libpath.exp \ -lib/libffi.exp libffi.call/cls_struct_va1.c \ -libffi.call/cls_uchar_va.c libffi.call/cls_uint_va.c \ -libffi.call/cls_ulong_va.c libffi.call/cls_ushort_va.c \ -libffi.call/nested_struct11.c libffi.call/uninitialized.c \ -libffi.call/va_1.c libffi.call/va_struct1.c libffi.call/va_struct2.c \ -libffi.call/va_struct3.c \ -libffi.call/strlen2.c \ -libffi.call/strlen3.c \ -libffi.call/strlen4.c \ -libffi.call/cls_3float.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 -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: - -ctags CTAGS: - -cscope cscopelist: - - -check-DEJAGNU: site.exp - srcdir='$(srcdir)'; export srcdir; \ - EXPECT=$(EXPECT); export EXPECT; \ - 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 $(EXTRA_DEJAGNU_SITE_CONFIG) - @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 - @list='$(EXTRA_DEJAGNU_SITE_CONFIG)'; for f in $$list; do \ - echo "## Begin content included from file $$f. Do not modify. ##" \ - && cat `test -f "$$f" || echo '$(srcdir)/'`$$f \ - && echo "## End content included from file $$f. ##" \ - || exit 1; \ - done >> site.tmp - @echo "## End of auto-generated content; you can edit from here. ##" >> site.tmp - @if test -f site.exp; then \ - sed -e '1,/^## End of auto-generated content.*##/d' site.exp >> site.tmp; \ - fi - @-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: - if test -z '$(STRIP)'; then \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - install; \ - else \ - $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ - install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ - "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ - fi -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 cscopelist-am ctags-am 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 tags-am uninstall \ - uninstall-am - -.PRECIOUS: Makefile - - -# 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.25/ext/ffi_c/libffi.bsd.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.bsd.mk deleted file mode 100644 index ab66256..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.bsd.mk +++ /dev/null @@ -1,40 +0,0 @@ -# -*- makefile -*- -# -# Makefile for BSD systems -# - -LOCAL_LIBS += ${LIBFFI} -lpthread - -LIBFFI_CFLAGS = ${FFI_MMAP_EXEC} -pthread -LIBFFI_BUILD_DIR = ${.CURDIR}/libffi-${arch} -INCFLAGS := -I${LIBFFI_BUILD_DIR}/include -I${INCFLAGS} - -.if ${srcdir} == "." - LIBFFI_SRC_DIR := ${.CURDIR}/libffi -.else - LIBFFI_SRC_DIR := ${srcdir}/libffi -.endif - - -LIBFFI = ${LIBFFI_BUILD_DIR}/.libs/libffi_convenience.a -LIBFFI_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh -LIBFFI_CONFIGURE = ${LIBFFI_SRC_DIR}/configure --disable-static \ - --with-pic=yes --disable-dependency-tracking --disable-docs - -$(OBJS): ${LIBFFI} - -$(LIBFFI): - @mkdir -p ${LIBFFI_BUILD_DIR} - @if [ ! -f $(LIBFFI_SRC_DIR)/configure ]; then \ - echo "Running autoreconf for libffi"; \ - cd "$(LIBFFI_SRC_DIR)" && \ - /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ - fi - @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.25/ext/ffi_c/libffi.darwin.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.darwin.mk deleted file mode 100644 index 59e51fc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.darwin.mk +++ /dev/null @@ -1,105 +0,0 @@ -# -*- 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_SRC_DIR)"/configure ]; then \ - echo "Running autoreconf for libffi"; \ - cd "$(LIBFFI_SRC_DIR)" && \ - /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ - fi - @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 "$(LIBFFI_SRC_DIR)"/configure ]; then \ - echo "Running autoreconf for libffi"; \ - cd "$(LIBFFI_SRC_DIR)" && \ - /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ - fi); \ - (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.25/ext/ffi_c/libffi.gnu.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.gnu.mk deleted file mode 100644 index 473b8fb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.gnu.mk +++ /dev/null @@ -1,32 +0,0 @@ -# -*- makefile -*- -# -# Common definitions for all systems that use GNU make -# - - -# Tack the extra deps onto the autogenerated variables -LOCAL_LIBS += $(LIBFFI) -BUILD_DIR = $(shell pwd) -LIBFFI_CFLAGS = $(FFI_MMAP_EXEC) -LIBFFI_BUILD_DIR = $(BUILD_DIR)/libffi-$(arch) -INCFLAGS := -I"$(LIBFFI_BUILD_DIR)"/include $(INCFLAGS) - -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_AUTOGEN = ${LIBFFI_SRC_DIR}/autogen.sh -LIBFFI_CONFIGURE = "$(LIBFFI_SRC_DIR)"/configure --disable-static \ - --with-pic=yes --disable-dependency-tracking --disable-docs - -$(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.25/ext/ffi_c/libffi.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.mk deleted file mode 100644 index 3b58227..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.mk +++ /dev/null @@ -1,18 +0,0 @@ -# -*- makefile -*- - -include ${srcdir}/libffi.gnu.mk - -$(LIBFFI): - @mkdir -p "$(LIBFFI_BUILD_DIR)" "$@(D)" - @if [ ! -f "$(LIBFFI_SRC_DIR)"/configure ]; then \ - echo "Running autoreconf for libffi"; \ - cd "$(LIBFFI_SRC_DIR)" && \ - /bin/sh $(LIBFFI_AUTOGEN) > /dev/null; \ - fi - @if [ ! -f "$(LIBFFI_BUILD_DIR)"/Makefile ]; then \ - echo "Configuring libffi"; \ - cd "$(LIBFFI_BUILD_DIR)" && \ - env CFLAGS="$(LIBFFI_CFLAGS)" GREP_OPTIONS="" \ - 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.25/ext/ffi_c/libffi.vc.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.vc.mk deleted file mode 100644 index 8cd4603..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.vc.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -*- makefile -*- -# -# Makefile for msvc -# - -# Tack the extra deps onto the autogenerated variables -INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS) -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.25/ext/ffi_c/libffi.vc64.mk b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.vc64.mk deleted file mode 100644 index 6f3dbbc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi.vc64.mk +++ /dev/null @@ -1,26 +0,0 @@ -# -*- makefile -*- -# -# Makefile for msvc -# - -# Tack the extra deps onto the autogenerated variables -INCFLAGS = -I$(LIBFFI_BUILD_DIR)/include -I$(LIBFFI_BUILD_DIR)/src/x86 $(INCFLAGS) -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.25/ext/ffi_c/libffi/.appveyor.yml b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.appveyor.yml deleted file mode 100644 index 5a4f096..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.appveyor.yml +++ /dev/null @@ -1,50 +0,0 @@ -shallow_clone: true - -# We're currently only testing 64-bit libffi built with Microsoft's -# tools. -# This matrix should be expanded to include at least: -# 32- and 64-bit gcc/cygwin -# 32- and 64-bit gcc/mingw -# 32- and 64-bit clang/mingw -# and perhaps more. - -image: Visual Studio 2013 -platform: - - x64 - -environment: - global: - CYG_ROOT: C:/cygwin - CYG_CACHE: C:/cygwin/var/cache/setup - CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/ - matrix: - - VSVER: 12 - -install: - - ps: >- - If ($env:Platform -Match "x86") { - $env:VCVARS_PLATFORM="x86" - $env:BUILD="x86-pc-cygwin" - $env:HOST="x86-pc-windows" - } Else { - $env:VCVARS_PLATFORM="amd64" - $env:BUILD="x86_64-w64-cygwin" - $env:HOST="x86_64-w64-cygwin" - } - - 'appveyor DownloadFile https://cygwin.com/setup-x86.exe -FileName setup.exe' - - 'setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P dejagnu >NUL' - - '%CYG_ROOT%/bin/bash -lc "cygcheck -dc cygwin"' - - ps: $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS")) - - echo "Using Visual Studio %VSVER%.0 at %VSCOMNTOOLS%" - - call "%VSCOMNTOOLS%\..\..\VC\vcvarsall.bat" %VCVARS_PLATFORM% - -build_script: - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./autogen.sh;)" - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./configure CC='/cygdrive/c/projects/libffi/msvcc.sh -m64' CXX='/cygdrive/c/projects/libffi/msvcc.sh -m64' LD='link' CPP='cl -nologo -EP' CXXCPP='cl -nologo -EP' CPPFLAGS='-DFFI_BUILDING_DLL' AR='/cygdrive/c/projects/libffi/.travis/ar-lib lib' NM='dumpbin -symbols' STRIP=':' --build=$BUILD --host=$HOST;)" - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp src/x86/ffitarget.h include; make; find .;)" - - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp `find . -name 'libffi-?.dll'` $HOST/testsuite/; make check; cat `find ./ -name libffi.log`)" - -# FIXME: "make check" currently fails. It just looks like msvcc needs -# to learn about -L and -l options. If you add "make check; cat `find -# ./ -name libffi.log" to the end of that build command you'll see -# what I mean. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.github/issue_template.md b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.github/issue_template.md deleted file mode 100644 index e197e2c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.github/issue_template.md +++ /dev/null @@ -1,10 +0,0 @@ -## System Details - - - - -## Problems Description - - - - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.gitignore b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.gitignore deleted file mode 100644 index 5d39689..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.gitignore +++ /dev/null @@ -1,38 +0,0 @@ -.libs -.deps -*.o -*.lo -.dirstamp -*.la -Makefile -!testsuite/libffi.bhaible/Makefile -Makefile.in -aclocal.m4 -compile -!.travis/compile -configure -depcomp -doc/libffi.info -*~ -fficonfig.h.in -fficonfig.h -include/ffi.h -include/ffitarget.h -install-sh -libffi.pc -libtool -libtool-ldflags -ltmain.sh -m4/libtool.m4 -m4/lt*.m4 -mdate-sh -missing -stamp-h1 -libffi*gz -autom4te.cache -libffi.xcodeproj/xcuserdata -libffi.xcodeproj/project.xcworkspace -build_*/ -darwin_*/ -src/arm/trampoline.S -**/texinfo.tex diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis.yml deleted file mode 100644 index b6e5cb7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis.yml +++ /dev/null @@ -1,34 +0,0 @@ ---- -sudo: required - -language: cpp - -matrix: - include: - - os: osx - env: HOST=arm-apple-darwin - - os: linux - compiler: gcc - env: HOST=i386-pc-linux-gnu MEVAL='export CC="$CC -m32" && CXX="$CXX -m32"' - - os: linux - compiler: gcc - - os: linux - compiler: gcc - env: CONFIGURE_OPTIONS=--disable-shared - - os: linux - compiler: clang - - os: linux - compiler: clang - env: CONFIGURE_OPTIONS=--disable-shared - - os: linux - env: HOST=moxie-elf MEVAL='export PATH=/opt/moxielogic/bin:$PATH && CC=moxie-elf-gcc && CXX=moxie-elf-g++' LDFLAGS=-Tsim.ld RUNTESTFLAGS="--target_board moxie-sim" DEJAGNU="$TRAVIS_BUILD_DIR/.travis/site.exp" - -before_install: - - if test x"$MEVAL" != x; then eval ${MEVAL}; fi - -install: - - ./.travis/install.sh - -script: - - if ! test x"$MEVAL" = x; then eval ${MEVAL}; fi - - ./.travis/build.sh diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/ar-lib b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/ar-lib deleted file mode 100755 index 0baa4f6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/ar-lib +++ /dev/null @@ -1,270 +0,0 @@ -#! /bin/sh -# Wrapper for Microsoft lib.exe - -me=ar-lib -scriptversion=2012-03-01.08; # UTC - -# Copyright (C) 2010-2018 Free Software Foundation, Inc. -# Written by Peter Rosin . -# -# 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 -# . - - -# func_error message -func_error () -{ - echo "$me: $1" 1>&2 - exit 1 -} - -file_conv= - -# func_file_conv build_file -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv in - mingw) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_at_file at_file operation archive -# Iterate over all members in AT_FILE performing OPERATION on ARCHIVE -# for each of them. -# When interpreting the content of the @FILE, do NOT use func_file_conv, -# since the user would need to supply preconverted file names to -# binutils ar, at least for MinGW. -func_at_file () -{ - operation=$2 - archive=$3 - at_file_contents=`cat "$1"` - eval set x "$at_file_contents" - shift - - for member - do - $AR -NOLOGO $operation:"$member" "$archive" || exit $? - done -} - -case $1 in - '') - func_error "no command. Try '$0 --help' for more information." - ;; - -h | --h*) - cat <. -# -# 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 -# . - -nl=' -' - -# We need space, tab and new line, in precisely that order. Quoting is -# there to prevent tools from complaining about whitespace usage. -IFS=" "" $nl" - -file_conv= - -# func_file_conv build_file lazy -# Convert a $build file to $host form and store it in $file -# Currently only supports Windows hosts. If the determined conversion -# type is listed in (the comma separated) LAZY, no conversion will -# take place. -func_file_conv () -{ - file=$1 - case $file in - / | /[!/]*) # absolute file, and not a UNC file - if test -z "$file_conv"; then - # lazily determine how to convert abs files - case `uname -s` in - MINGW*) - file_conv=mingw - ;; - CYGWIN*) - file_conv=cygwin - ;; - *) - file_conv=wine - ;; - esac - fi - case $file_conv/,$2, in - *,$file_conv,*) - ;; - mingw/*) - file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'` - ;; - cygwin/*) - file=`cygpath -m "$file" || echo "$file"` - ;; - wine/*) - file=`winepath -w "$file" || echo "$file"` - ;; - esac - ;; - esac -} - -# func_cl_dashL linkdir -# Make cl look for libraries in LINKDIR -func_cl_dashL () -{ - func_file_conv "$1" - if test -z "$lib_path"; then - lib_path=$file - else - lib_path="$lib_path;$file" - fi - linker_opts="$linker_opts -LIBPATH:$file" -} - -# func_cl_dashl library -# Do a library search-path lookup for cl -func_cl_dashl () -{ - lib=$1 - found=no - save_IFS=$IFS - IFS=';' - for dir in $lib_path $LIB - do - IFS=$save_IFS - if $shared && test -f "$dir/$lib.dll.lib"; then - found=yes - lib=$dir/$lib.dll.lib - break - fi - if test -f "$dir/$lib.lib"; then - found=yes - lib=$dir/$lib.lib - break - fi - if test -f "$dir/lib$lib.a"; then - found=yes - lib=$dir/lib$lib.a - break - fi - done - IFS=$save_IFS - - if test "$found" != yes; then - lib=$lib.lib - fi -} - -# func_cl_wrapper cl arg... -# Adjust compile command to suit cl -func_cl_wrapper () -{ - # Assume a capable shell - lib_path= - shared=: - linker_opts= - 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'. - eat=1 - case $2 in - *.o | *.[oO][bB][jJ]) - func_file_conv "$2" - set x "$@" -Fo"$file" - shift - ;; - *) - func_file_conv "$2" - set x "$@" -Fe"$file" - shift - ;; - esac - ;; - -I) - eat=1 - func_file_conv "$2" mingw - set x "$@" -I"$file" - shift - ;; - -I*) - func_file_conv "${1#-I}" mingw - set x "$@" -I"$file" - shift - ;; - -l) - eat=1 - func_cl_dashl "$2" - set x "$@" "$lib" - shift - ;; - -l*) - func_cl_dashl "${1#-l}" - set x "$@" "$lib" - shift - ;; - -L) - eat=1 - func_cl_dashL "$2" - ;; - -L*) - func_cl_dashL "${1#-L}" - ;; - -static) - shared=false - ;; - -warn) - eat=1 - ;; - -Wl,*) - arg=${1#-Wl,} - save_ifs="$IFS"; IFS=',' - for flag in $arg; do - IFS="$save_ifs" - linker_opts="$linker_opts $flag" - done - IFS="$save_ifs" - ;; - -Xlinker) - eat=1 - linker_opts="$linker_opts $2" - ;; - -*) - set x "$@" "$1" - shift - ;; - *.cc | *.CC | *.cxx | *.CXX | *.[cC]++) - func_file_conv "$1" - set x "$@" -Tp"$file" - shift - ;; - *.c | *.cpp | *.CPP | *.lib | *.LIB | *.Lib | *.OBJ | *.obj | *.[oO]) - func_file_conv "$1" mingw - set x "$@" "$file" - shift - ;; - *) - set x "$@" "$1" - shift - ;; - esac - fi - shift - done - if test -n "$linker_opts"; then - linker_opts="-link$linker_opts" - fi - exec "$@" $linker_opts - exit 1 -} - -eat= - -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 $? - ;; - cl | *[/\\]cl | cl.exe | *[/\\]cl.exe | \ - icl | *[/\\]icl | icl.exe | *[/\\]icl.exe ) - func_cl_wrapper "$@" # Doesn't return... - ;; -esac - -ofile= -cfile= - -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 'before-save-hook 'time-stamp) -# time-stamp-start: "scriptversion=" -# time-stamp-format: "%:y-%02m-%02d.%02H" -# time-stamp-time-zone: "UTC0" -# time-stamp-end: "; # UTC" -# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/install.sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/install.sh deleted file mode 100755 index 56b3f6a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/install.sh +++ /dev/null @@ -1,22 +0,0 @@ -#!/bin/bash -set -x - -if [[ $TRAVIS_OS_NAME != 'linux' ]]; then - brew update - # fix an issue with libtool on travis by reinstalling it - brew uninstall libtool; - brew install libtool dejagnu; -else - sudo apt-get update - sudo apt-get install dejagnu texinfo - case "$HOST" in - i386-pc-linux-gnu) - sudo apt-get install gcc-multilib g++-multilib - ;; - moxie-elf) - echo 'deb http://repos.moxielogic.org:7114/MoxieLogic moxiedev main' | sudo tee -a /etc/apt/sources.list - sudo apt-get update -qq - sudo apt-get install -y --allow-unauthenticated moxielogic-moxie-elf-gcc moxielogic-moxie-elf-gcc-c++ moxielogic-moxie-elf-gcc-libstdc++ moxielogic-moxie-elf-gdb-sim - ;; - esac -fi diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/moxie-sim.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/moxie-sim.exp deleted file mode 100644 index 3a6042e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/moxie-sim.exp +++ /dev/null @@ -1,60 +0,0 @@ -# Copyright (C) 2010 Free Software Foundation, Inc. -# -# This file is part of DejaGnu. -# -# DejaGnu 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. -# -# DejaGnu 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 DejaGnu; if not, write to the Free Software Foundation, -# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. - -# This is a list of toolchains that are supported on this board. -set_board_info target_install {moxie-elf} - -# Load the generic configuration for this board. This will define a basic set -# of routines needed by the tool to communicate with the board. -load_generic_config "sim" - -# basic-sim.exp is a basic description for the standard Cygnus simulator. -load_base_board_description "basic-sim" - -# "moxie" is the name of the sim subdir in devo/sim. -setup_sim moxie - -# No multilib options needed by default. -process_multilib_options "" - -# We only support newlib on this target. We assume that all multilib -# options have been specified before we get here. - -set_board_info compiler "[find_gcc]" -set_board_info cflags "[libgloss_include_flags] [newlib_include_flags]" -set_board_info ldflags "[libgloss_link_flags] [newlib_link_flags]" -# No linker script needed. -set_board_info ldscript "-Tsim.ld" - -# Configuration settings for testsuites -set_board_info noargs 1 -set_board_info gdb,nosignals 1 -set_board_info gdb,noresults 1 -set_board_info gdb,cannot_call_functions 1 -set_board_info gdb,skip_float_tests 1 -set_board_info gdb,can_reverse 1 -set_board_info gdb,use_precord 1 - -# More time is needed -set_board_info gcc,timeout 800 -set_board_info gdb,timeout 60 - -# Used by a few gcc.c-torture testcases to delimit how large the stack can -# be. -set_board_info gcc,stack_size 5000 - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/site.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/site.exp deleted file mode 100644 index e42cb1d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/.travis/site.exp +++ /dev/null @@ -1,18 +0,0 @@ -# Copyright (C) 2008, 2010, 2018 Anthony Green - -# Make sure we look in the right place for the board description files. -if ![info exists boards_dir] { - set boards_dir {} -} - -lappend boards_dir $::env(TRAVIS_BUILD_DIR)/.travis - -verbose "Global Config File: target_triplet is $target_triplet" 2 -global target_list - -case "$target_triplet" in { - { "moxie-elf" } { - set target_list "moxie-sim" - } -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libffi b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libffi deleted file mode 100644 index 49ba8da..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libffi +++ /dev/null @@ -1,584 +0,0 @@ -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.25/ext/ffi_c/libffi/ChangeLog.libffi-3.1 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libffi-3.1 deleted file mode 100644 index 8f7f50d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libffi-3.1 +++ /dev/null @@ -1,6000 +0,0 @@ -2014-03-16 Josh Triplett - - * ChangeLog: Archive to ChangeLog.libffi-3.1 and delete. Future - changelogs will come from git, with autogenerated snapshots shipped in - distributed tarballs. - -2014-03-16 Josh Triplett - - Add support for stdcall, thiscall, and fastcall on non-Windows - x86-32. - - Linux supports the stdcall calling convention, either via - functions explicitly declared with the stdcall attribute, or via - code compiled with -mrtd which effectively makes stdcall the - default. - - This introduces FFI_STDCALL, FFI_THISCALL, and FFI_FASTCALL on - non-Windows x86-32 platforms, as non-default calling conventions. - - * Makefile.am: Compile in src/x86/win32.S on non-Windows x86-32. - * src/x86/ffitarget.h: Add FFI_STDCALL, FFI_THISCALL, and - FFI_FASTCALL on non-Windows x86-32. Increase trampoline size to - accomodate these calling conventions, and unify some ifdeffery. - * src/x86/ffi.c: Add support for FFI_STDCALL, FFI_THISCALL, and - FFI_FASTCALL on non-Windows x86-32 platforms; update ifdeffery. - * src/x86/win32.S: Support compiling on non-Windows x86-32 - platforms. On those platforms, avoid redefining the SYSV symbols - already provided by src/x86/sysv.S. - * testsuite/libffi.call/closure_stdcall.c: Run on non-Windows. - #define __stdcall if needed. - * testsuite/libffi.call/closure_thiscall.c: Run on non-Windows. - #define __fastcall if needed. - * testsuite/libffi.call/fastthis1_win32.c: Run on non-Windows. - * testsuite/libffi.call/fastthis2_win32.c: Ditto. - * testsuite/libffi.call/fastthis3_win32.c: Ditto. - * testsuite/libffi.call/many2_win32.c: Ditto. - * testsuite/libffi.call/many_win32.c: Ditto. - * testsuite/libffi.call/strlen2_win32.c: Ditto. - * testsuite/libffi.call/strlen_win32.c: Ditto. - * testsuite/libffi.call/struct1_win32.c: Ditto. - * testsuite/libffi.call/struct2_win32.c: Ditto. - -2014-03-16 Josh Triplett - - * prep_cif.c: Remove unnecessary ifdef for X86_WIN32. - ffi_prep_cif_core had a special case for X86_WIN32, checking for - FFI_THISCALL in addition to the FFI_FIRST_ABI-to-FFI_LAST_ABI - range before returning FFI_BAD_ABI. However, on X86_WIN32, - FFI_THISCALL already falls in that range, making the special case - unnecessary. Remove it. - -2014-03-16 Josh Triplett - - * testsuite/libffi.call/closure_stdcall.c, - testsuite/libffi.call/closure_thiscall.c: Remove fragile stack - pointer checks. These files included inline assembly to save the - stack pointer before and after the call, and compare the values. - However, compilers can and do leave the stack in different states - for these two pieces of inline assembly, such as by saving a - temporary value on the stack across the call; observed with gcc - -Os, and verified as spurious through careful inspection of - disassembly. - -2014-03-16 Josh Triplett - - * testsuite/libffi.call/many.c: Avoid spurious failure due to - excess floating-point precision. - * testsuite/libffi.call/many_win32.c: Ditto. - -2014-03-16 Josh Triplett - - * libtool-ldflags: Re-add. - -2014-03-16 Josh Triplett - - * Makefile.in, aclocal.m4, compile, config.guess, config.sub, - configure, depcomp, include/Makefile.in, install-sh, - libtool-ldflags, ltmain.sh, m4/libtool.m4, m4/ltoptions.m4, - m4/ltsugar.m4, m4/ltversion.m4, m4/lt~obsolete.m4, - man/Makefile.in, mdate-sh, missing, testsuite/Makefile.in: Delete - autogenerated files from version control. - * .gitignore: Add autogenerated files. - * autogen.sh: New script to generate the autogenerated files. - * README: Document requirement to run autogen.sh when building - directly from version control. - * .travis.yml: Run autogen.sh - -2014-03-14 Anthony Green - - * configure, Makefile.in: Rebuilt. - -2014-03-10 Mike Hommey - - * configure.ac: Allow building for mipsel with Android NDK r8. - * Makefile.am (AM_MAKEFLAGS): Replace double quotes with single - quotes. - -2014-03-10 Landry Breuil - - * configure.ac: Ensure the linker supports @unwind sections in libffi. - -2014-03-01 Anthony Green - - * Makefile.am (EXTRA_DIST): Replace old scripts with - generate-darwin-source-and-headers.py. - * Makefile.in: Rebuilt. - -2014-02-28 Anthony Green - - * Makefile.am (AM_CFLAGS): Reintroduce missing -DFFI_DEBUG for - --enable-debug builds. - * Makefile.in: Rebuilt. - -2014-02-28 Makoto Kato - - * src/closures.c: Fix build failure when using clang for Android. - -2014-02-28 Marcin Wojdyr - - * libffi.pc.in (toolexeclibdir): use -L${toolexeclibdir} instead - of -L${libdir}. - -2014-02-28 Paulo Pizarro - - * src/bfin/sysv.S: Calling functions in shared libraries requires - considering the GOT. - -2014-02-28 Josh Triplett - - * src/x86/ffi64.c (classify_argument): Handle case where - FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE. - -2014-02-28 Anthony Green - - * ltmain.sh: Generate with libtool-2.4.2.418. - * m4/libtool.m4, m4/ltoptions.m4, m4/ltversion.m4: Ditto. - * configure: Rebuilt. - -2014-02-28 Dominik Vogt - - * configure.ac (AC_ARG_ENABLE struct): Fix typo in help - message. - (AC_ARG_ENABLE raw_api): Ditto. - * configure, fficonfig.h.in: Rebuilt. - -2014-02-28 Will Newton - - * src/arm/sysv.S: Initialize IP register with FP. - -2014-02-28 Yufeng Zhang - - * src/aarch64/sysv.S (ffi_closure_SYSV): Use x29 as the - main CFA reg; update cfi_rel_offset. - -2014-02-15 Marcus Comstedt - - * src/powerpc/ffi_linux64.c, src/powerpc/linux64_closure.S: Remove - assumption on contents of r11 in closure. - -2014-02-09 Heiher - - * src/mips/n32.S: Fix call floating point va function. - -2014-01-21 Zachary Waldowski - - * src/aarch64/ffi.c: Fix missing semicolons on assertions under - debug mode. - -2013-12-30 Zachary Waldowski - - * .gitignore: Exclude darwin_* generated source and build_* trees. - * src/aarch64/ffi.c, src/arm/ffi.c, src/x86/ffi.c: Inhibit Clang - previous prototype warnings. - * src/arm/ffi.c: Prevent NULL dereference, fix short type warning - * src/dlmalloc.c: Fix warnings from set_segment_flags return type, - and the native use of size_t for malloc on platforms - * src/arm/sysv.S: Use unified syntax. Clang clean-ups for - ARM_FUNC_START. - * generate-osx-source-and-headers.py: Remove. - * build-ios.sh: Remove. - * libffi.xcodeproj/project.pbxproj: Rebuild targets. Include - x86_64+aarch64 pieces in library. Export headers properly. - * src/x86/ffi64.c: More Clang warning clean-ups. - * src/closures.c (open_temp_exec_file_dir): Use size_t. - * src/prep_cif.c (ffi_prep_cif_core): Cast ALIGN result. - * src/aarch64/sysv.S: Use CNAME for global symbols. Only use - .size for ELF targets. - * src/aarch64/ffi.c: Clean up for double == long double. Clean up - from Clang warnings. Use Clang cache invalidation builtin. Use - size_t in place of unsigned in many places. Accommodate for - differences in Apple AArch64 ABI. - -2013-12-02 Daniel Rodríguez Troitiño - - * generate-darwin-source-and-headers.py: Clean up, modernize, - merged version of previous scripts. - -2013-11-21 Anthony Green - - * configure, Makefile.in, include/Makefile.in, include/ffi.h.in, - man/Makefile.in, testsuite/Makefile.in, fficonfig.h.in: Rebuilt. - -2013-11-21 Alan Modra - - * Makefile.am (EXTRA_DIST): Add new src/powerpc files. - (nodist_libffi_la_SOURCES ): Likewise. - * configure.ac (HAVE_LONG_DOUBLE_VARIANT): Define for powerpc. - * include/ffi.h.in (ffi_prep_types): Declare. - * src/prep_cif.c (ffi_prep_cif_core): Call ffi_prep_types. - * src/types.c (FFI_NONCONST_TYPEDEF): Define and use for - HAVE_LONG_DOUBLE_VARIANT. - * src/powerpc/ffi_powerpc.h: New file. - * src/powerpc/ffi.c: Split into.. - * src/powerpc/ffi_sysv.c: ..new file, and.. - * src/powerpc/ffi_linux64.c: ..new file, rewriting parts. - * src/powerpc/ffitarget.h (enum ffi_abi): Rewrite powerpc ABI - selection as bits controlling features. - * src/powerpc/linux64.S: For consistency, use POWERPC64 rather - than __powerpc64__. - * src/powerpc/linux64_closure.S: Likewise. - * src/powerpc/ppc_closure.S: Likewise. Move .note.FNU-stack - inside guard. - * src/powerpc/sysv.S: Likewise. - * configure: Regenerate. - * fficonfig.h.in: Regenerate. - * Makefile.in: Regenerate. - -2013-11-20 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use - NUM_FPR_ARG_REGISTERS64 and NUM_GPR_ARG_REGISTERS64 not their - 32-bit versions for 64-bit code. - * src/powerpc/linux64_closure.S: Don't use the return value area - as a parameter save area on ELFv2. - -2013-11-18 Iain Sandoe - - * src/powerpc/darwin.S (EH): Correct use of pcrel FDE encoding. - * src/powerpc/darwin_closure.S (EH): Likewise. Modernise picbase - labels. - -2013-11-18 Anthony Green - - * src/arm/ffi.c (ffi_call): Hoist declaration of temp to top of - function. - * src/arm/ffi.c (ffi_closure_inner): Moderize function declaration - to appease compiler. - Thanks for Gregory P. Smith . - -2013-11-18 Anthony Green - - * README (tested): Mention PowerPC ELFv2. - -2013-11-16 Alan Modra - - * src/powerpc/ppc_closure.S: Move errant #endif to where it belongs. - Don't bl .Luint128. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep_core): Use #if _CALL_ELF - test to select parameter save sizing for ELFv2 vs. ELFv1. - * src/powerpc/ffitarget.h (FFI_V2_TYPE_FLOAT_HOMOG, - FFI_V2_TYPE_DOUBLE_HOMOG, FFI_V2_TYPE_SMALL_STRUCT): Define. - (FFI_TRAMPOLINE_SIZE): Define variant for ELFv2. - * src/powerpc/ffi.c (FLAG_ARG_NEEDS_PSAVE): Define. - (discover_homogeneous_aggregate): New function. - (ffi_prep_args64): Adjust start of param save area for ELFv2. - Handle homogenous floating point struct parms. - (ffi_prep_cif_machdep_core): Adjust space calculation for ELFv2. - Handle ELFv2 return values. Set FLAG_ARG_NEEDS_PSAVE. Handle - homogenous floating point structs. - (ffi_call): Increase size of smst_buffer for ELFv2. Handle ELFv2. - (flush_icache): Compile for ELFv2. - (ffi_prep_closure_loc): Set up ELFv2 trampoline. - (ffi_closure_helper_LINUX64): Don't return all structs directly - to caller. Handle homogenous floating point structs. Handle - ELFv2 struct return values. - * src/powerpc/linux64.S (ffi_call_LINUX64): Set up r2 for - ELFv2. Adjust toc save location. Call function pointer using - r12. Handle FLAG_RETURNS_SMST. Don't predict branches. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Set up r2 - for ELFv2. Define ELFv2 versions of STACKFRAME, PARMSAVE, and - RETVAL. Handle possibly missing parameter save area. Handle - ELFv2 return values. - (.note.GNU-stack): Move inside outer #ifdef. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Revert 2013-02-08 - change. Do not consume an int arg when returning a small struct - for FFI_SYSV ABI. - (ffi_call): Only use bounce buffer when FLAG_RETURNS_SMST. - Properly copy bounce buffer to destination. - * src/powerpc/sysv.S: Revert 2013-02-08 change. - * src/powerpc/ppc_closure.S: Remove stray '+'. - -2013-11-16 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args64): Align struct parameters - according to __STRUCT_PARM_ALIGN__. - (ffi_prep_cif_machdep_core): Likewise. - (ffi_closure_helper_LINUX64): Likewise. - -2013-11-16 Alan Modra - - * src/powerpc/linux64.S (ffi_call_LINUX64): Tweak restore of r28. - (.note.GNU-stack): Move inside outer #ifdef. - * src/powerpc/linux64_closure.S (STACKFRAME, PARMSAVE, - RETVAL): Define and use throughout. - (ffi_closure_LINUX64): Save fprs before buying stack. - (.note.GNU-stack): Move inside outer #ifdef. - -2013-11-16 Alan Modra - - * src/powerpc/ffitarget.h (FFI_TARGET_SPECIFIC_VARIADIC): Define. - (FFI_EXTRA_CIF_FIELDS): Define. - * src/powerpc/ffi.c (ffi_prep_args64): Save fprs as per the - ABI, not to both fpr and param save area. - (ffi_prep_cif_machdep_core): Renamed from ffi_prep_cif_machdep. - Keep initial flags. Formatting. Remove dead FFI_LINUX_SOFT_FLOAT - code. - (ffi_prep_cif_machdep, ffi_prep_cif_machdep_var): New functions. - (ffi_closure_helper_LINUX64): Pass floating point as per ABI, - not to both fpr and parameter save areas. - - * libffi/testsuite/libffi.call/cls_double_va.c (main): Correct - function cast and don't call ffi_prep_cif. - * libffi/testsuite/libffi.call/cls_longdouble_va.c (main): Likewise. - -2013-11-15 Andrew Haley - - * doc/libffi.texi (Closure Example): Fix the sample code. - * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. - -2013-11-15 Andrew Haley - - * testsuite/libffi.call/va_struct1.c (main): Fix broken test. - * testsuite/libffi.call/cls_uint_va.c (cls_ret_T_fn): Likewise - * testsuite/libffi.call/cls_struct_va1.c (test_fn): Likewise. - * testsuite/libffi.call/va_1.c (main): Likewise. - -2013-11-14 David Schneider - - * src/arm/ffi.c: Fix register allocation for mixed float and - doubles. - * testsuite/libffi.call/cls_many_mixed_float_double.c: Testcase - for many mixed float and double arguments. - -2013-11-13 Alan Modra - - * doc/libffi.texi (Simple Example): Correct example code. - * doc/libffi.info, doc/stamp-vti, doc/version.texi: Rebuilt. - -2013-11-13 Anthony Green - - * include/ffi_common.h: Respect HAVE_ALLOCA_H for GNU compiler - based build. (Thanks to tmr111116 on github) - -2013-11-09 Anthony Green - - * m4/libtool.m4: Refresh. - * configure, Makefile.in: Rebuilt. - * README: Add more notes about next release. - -2013-11-09 Shigeharu TAKENO - - * m4/ax_gcc_archflag.m4 (ax_gcc_arch): Don't recognize - UltraSPARC-IIi as ultrasparc3. - -2013-11-06 Mark Kettenis - - * src/x86/freebsd.S (ffi_call_SYSV): Align the stack pointer to - 16-bytes. - -2013-11-06 Konstantin Belousov - - * src/x86/freebsd.S (ffi_closure_raw_SYSV): Mark the assembler - source as not requiring executable stack. - -2013-11-02 Anthony Green - - * doc/libffi.texi (The Basics): Clarify return value buffer size - requirements. Also, NULL result buffer pointers are no longer - supported. - * doc/libffi.info: Rebuilt. - -2013-11-02 Mischa Jonker - - * Makefile.am (nodist_libffi_la_SOURCES): Fix build error. - * Makefile.in: Rebuilt. - -2013-11-02 David Schneider - - * src/arm/ffi.c: more robust argument handling for closures on arm hardfloat - * testsuite/libffi.call/many_mixed.c: New file. - * testsuite/libffi.call/cls_many_mixed_args.c: More tests. - -2013-11-02 Vitaly Budovski - - * src/x86/ffi.c (ffi_prep_cif_machdep): Don't align stack for win32. - -2013-10-23 Mark H Weaver - - * src/mips/ffi.c: Fix handling of uint32_t arguments on the - MIPS N32 ABI. - -2013-10-13 Sandra Loosemore - - * README: Add Nios II to table of supported platforms. - * Makefile.am (EXTRA_DIST): Add nios2 files. - (nodist_libffi_la_SOURCES): Likewise. - * Makefile.in: Regenerated. - * configure.ac (nios2*-linux*): New host. - (NIOS2): Add AM_CONDITIONAL. - * configure: Regenerated. - * src/nios2/ffi.c: New. - * src/nios2/ffitarget.h: New. - * src/nios2/sysv.S: New. - * src/prep_cif.c (initialize_aggregate): Handle extra structure - alignment via FFI_AGGREGATE_ALIGNMENT. - (ffi_prep_cif_core): Conditionalize structure return for NIOS2. - -2013-10-10 Sandra Loosemore - - * testsuite/libffi.call/cls_many_mixed_args.c (cls_ret_double_fn): - Fix uninitialized variable. - -2013-10-11 Marcus Shawcroft - - * testsuite/libffi.call/many.c (many): Replace * with +. - -2013-10-08 Ondřej Bílka - - * src/aarch64/ffi.c, src/aarch64/sysv.S, src/arm/ffi.c, - src/arm/gentramp.sh, src/bfin/sysv.S, src/closures.c, - src/dlmalloc.c, src/ia64/ffi.c, src/microblaze/ffi.c, - src/microblaze/sysv.S, src/powerpc/darwin_closure.S, - src/powerpc/ffi.c, src/powerpc/ffi_darwin.c, src/sh/ffi.c, - src/tile/tile.S, testsuite/libffi.call/nested_struct11.c: Fix - spelling errors. - -2013-10-08 Anthony Green - - * aclocal.m4, compile, config.guess, config.sub, depcomp, - install-sh, mdate-sh, missing, texinfo.tex: Update from upstream. - * configure.ac: Update version to 3.0.14-rc0. - * Makefile.in, configure, Makefile.in, include/Makefile.in, - man/Makefile.in, testsuite/Makefile.in: Rebuilt. - * README: Mention M88K and VAX. - -2013-07-15 Miod Vallat - - * Makefile.am, - configure.ac, - src/m88k/ffi.c, - src/m88k/ffitarget.h, - src/m88k/obsd.S, - src/vax/elfbsd.S, - src/vax/ffi.c, - src/vax/ffitarget.h: Add m88k and vax support. - -2013-06-24 Alan Modra - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Move var declaration - before statements. - (ffi_prep_args64): Support little-endian. - (ffi_closure_helper_SYSV, ffi_closure_helper_LINUX64): Likewise. - * src/powerpc/linux64_closure.S (ffi_closure_LINUX64): Likewise. - * src/powerpc/ppc_closure.S (ffi_closure_SYSV): Likewise. - -2013-06-12 Mischa Jonker - - * configure.ac: Add support for ARC. - * Makefile.am: Likewise. - * README: Add ARC details. - * src/arc/arcompact.S: New. - * src/arc/ffi.c: Likewise. - * src/arc/ffitarget.h: Likewise. - -2013-03-28 David Schneider - - * src/arm/ffi.c: Fix support for ARM hard-float calling convention. - * src/arm/sysv.S: call different methods for SYSV and VFP ABIs. - * testsuite/libffi.call/cls_many_mixed_args.c: testcase for a closure with - mixed arguments, many doubles. - * testsuite/libffi.call/many_double.c: testcase for calling a function using - more than 8 doubles. - * testcase/libffi.call/many.c: use absolute value to check result against an - epsilon - -2013-03-17 Anthony Green - - * README: Update for 3.0.13. - * configure.ac: Ditto. - * configure: Rebuilt. - * doc/*: Update version. - -2013-03-17 Dave Korn - - * src/closures.c (is_emutramp_enabled - [!FFI_MMAP_EXEC_EMUTRAMP_PAX]): Move default definition outside - enclosing #if scope. - -2013-03-17 Anthony Green - - * configure.ac: Only modify toolexecdir in certain cases. - * configure: Rebuilt. - -2013-03-16 Gilles Talis - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Don't use - fparg_count,etc on __NO_FPRS__ targets. - -2013-03-16 Alan Hourihane - - * src/m68k/sysv.S (epilogue): Don't use extb instruction on - m680000 machines. - -2013-03-16 Alex Gaynor - - * src/x86/ffi.c (ffi_prep_cif_machdep): Always align stack. - -2013-03-13 Markos Chandras - - * configure.ac: Add support for Imagination Technologies Meta. - * Makefile.am: Likewise. - * README: Add Imagination Technologies Meta details. - * src/metag/ffi.c: New. - * src/metag/ffitarget.h: Likewise. - * src/metag/sysv.S: Likewise. - -2013-02-24 Andreas Schwab - - * doc/libffi.texi (Structures): Fix missing category argument of - @deftp. - -2013-02-11 Anthony Green - - * configure.ac: Update release number to 3.0.12. - * configure: Rebuilt. - * README: Update release info. - -2013-02-10 Anthony Green - - * README: Add Moxie. - * src/moxie/ffi.c: Created. - * src/moxie/eabi.S: Created. - * src/moxie/ffitarget.h: Created. - * Makefile.am (nodist_libffi_la_SOURCES): Add Moxie. - * Makefile.in: Rebuilt. - * configure.ac: Add Moxie. - * configure: Rebuilt. - * testsuite/libffi.call/huge_struct.c: Disable format string - warnings for moxie*-*-elf tests. - -2013-02-10 Anthony Green - - * Makefile.am (LTLDFLAGS): Fix reference. - * Makefile.in: Rebuilt. - -2013-02-10 Anthony Green - - * README: Update supported platforms. Update test results link. - -2013-02-09 Anthony Green - - * testsuite/libffi.call/negint.c: Remove forced -O2. - * testsuite/libffi.call/many2.c (foo): Remove GCCism. - * testsuite/libffi.call/ffitest.h: Add default PRIuPTR definition. - - * src/sparc/v8.S (ffi_closure_v8): Import ancient ulonglong - closure return type fix developed by Martin v. Löwis for cpython - fork. - -2013-02-08 Andreas Tobler - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix small struct - support. - * src/powerpc/sysv.S: Ditto. - -2013-02-08 Anthony Green - - * testsuite/libffi.call/cls_longdouble.c: Remove xfail for - arm*-*-*. - -2013-02-08 Anthony Green - - * src/sparc/ffi.c (ffi_prep_closure_loc): Fix cache flushing for GCC. - -2013-02-08 Matthias Klose - - * man/ffi_prep_cif.3: Clean up for debian linter. - -2013-02-08 Peter Bergner - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Account for FP args pushed - on the stack. - -2013-02-08 Anthony Green - - * Makefile.am (EXTRA_DIST): Add missing files. - * testsuite/Makefile.am (EXTRA_DIST): Ditto. - * Makefile.in: Rebuilt. - -2013-02-08 Anthony Green - - * configure.ac: Move sparc asm config checks to within functions - for compatibility with sun tools. - * configure: Rebuilt. - * src/sparc/ffi.c (ffi_prep_closure_loc): Flush cache on v9 - systems. - * src/sparc/v8.S (ffi_flush_icache): Implement a sparc v9 cache - flusher. - -2013-02-08 Nathan Rossi - - * src/microblaze/ffi.c (ffi_closure_call_SYSV): Fix handling of - small big-endian structures. - (ffi_prep_args): Ditto. - -2013-02-07 Anthony Green - - * src/sparc/v8.S (ffi_call_v8): Fix typo from last patch - (effectively hiding ffi_call_v8). - -2013-02-07 Anthony Green - - * configure.ac: Update bug reporting address. - * configure.in: Rebuild. - - * src/sparc/v8.S (ffi_flush_icache): Out-of-line cache flusher for - Sun compiler. - * src/sparc/ffi.c (ffi_call): Remove warning. - Call ffi_flush_icache for non-GCC builds. - (ffi_prep_closure_loc): Use ffi_flush_icache. - - * Makefile.am (EXTRA_DIST): Add libtool-ldflags. - * Makefile.in: Rebuilt. - * libtool-ldflags: New file. - -2013-02-07 Daniel Schepler - - * configure.ac: Correctly identify x32 systems as 64-bit. - * m4/libtool.m4: Remove libtool expr error. - * aclocal.m4, configure: Rebuilt. - -2013-02-07 Anthony Green - - * configure.ac: Fix GCC usage test. - * configure: Rebuilt. - * README: Mention LLVM/GCC x86_64 issue. - * testsuite/Makefile.in: Rebuilt. - -2013-02-07 Anthony Green - - * testsuite/libffi.call/cls_double_va.c (main): Replace // style - comments with /* */ for xlc compiler. - * testsuite/libffi.call/stret_large.c (main): Ditto. - * testsuite/libffi.call/stret_large2.c (main): Ditto. - * testsuite/libffi.call/nested_struct1.c (main): Ditto. - * testsuite/libffi.call/huge_struct.c (main): Ditto. - * testsuite/libffi.call/float_va.c (main): Ditto. - * testsuite/libffi.call/cls_struct_va1.c (main): Ditto. - * testsuite/libffi.call/cls_pointer_stack.c (main): Ditto. - * testsuite/libffi.call/cls_pointer.c (main): Ditto. - * testsuite/libffi.call/cls_longdouble_va.c (main): Ditto. - -2013-02-06 Anthony Green - - * man/ffi_prep_cif.3: Clean up for debian lintian checker. - -2013-02-06 Anthony Green - - * Makefile.am (pkgconfigdir): Add missing pkgconfig install bits. - * Makefile.in: Rebuild. - -2013-02-02 Mark H Weaver - - * src/x86/ffi64.c (ffi_call): Sign-extend integer arguments passed - via general purpose registers. - -2013-01-21 Nathan Rossi - - * README: Add MicroBlaze details. - * Makefile.am: Add MicroBlaze support. - * configure.ac: Likewise. - * src/microblaze/ffi.c: New. - * src/microblaze/ffitarget.h: Likewise. - * src/microblaze/sysv.S: Likewise. - -2013-01-21 Nathan Rossi - * testsuite/libffi.call/return_uc.c: Fixed issue. - -2013-01-21 Chris Zankel - - * README: Add Xtensa support. - * Makefile.am: Likewise. - * configure.ac: Likewise. - * Makefile.in Regenerate. - * configure: Likewise. - * src/prep_cif.c: Handle Xtensa. - * src/xtensa: New directory. - * src/xtensa/ffi.c: New file. - * src/xtensa/ffitarget.h: Ditto. - * src/xtensa/sysv.S: Ditto. - -2013-01-11 Anthony Green - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Replace // style - comments with /* */ for xlc compiler. - * src/powerpc/aix.S (ffi_call_AIX): Ditto. - * testsuite/libffi.call/ffitest.h (allocate_mmap): Delete - deprecated inline function. - * testsuite/libffi.special/ffitestcxx.h: Ditto. - * README: Add update for AIX support. - -2013-01-11 Anthony Green - - * configure.ac: Robustify pc relative reloc check. - * m4/ax_cc_maxopt.m4: Don't -malign-double. This is an ABI - changing option for 32-bit x86. - * aclocal.m4, configure: Rebuilt. - * README: Update supported target list. - -2013-01-10 Anthony Green - - * README (tested): Add Compiler column to table. - -2013-01-10 Anthony Green - - * src/x86/ffi64.c (struct register_args): Make sse array and array - of unions for sunpro compiler compatibility. - -2013-01-10 Anthony Green - - * configure.ac: Test target platform size_t size. Handle both 32 - and 64-bit builds for x86_64-* and i?86-* targets (allowing for - CFLAG option to change default settings). - * configure, aclocal.m4: Rebuilt. - -2013-01-10 Anthony Green - - * testsuite/libffi.special/special.exp: Only run exception - handling tests when using GNU compiler. - - * m4/ax_compiler_vendor.m4: New file. - * configure.ac: Test for compiler vendor and don't use - AX_CFLAGS_WARN_ALL with the sun compiler. - * aclocal.m4, configure: Rebuilt. - -2013-01-10 Anthony Green - - * include/ffi_common.h: Don't use GCCisms to define types when - building with the SUNPRO compiler. - -2013-01-10 Anthony Green - - * configure.ac: Put local.exp in the right place. - * configure: Rebuilt. - - * src/x86/ffi.c: Update comment about regparm function attributes. - * src/x86/sysv.S (ffi_closure_SYSV): The SUNPRO compiler requires - that all function arguments be passed on the stack (no regparm - support). - -2013-01-08 Anthony Green - - * configure.ac: Generate local.exp. This sets CC_FOR_TARGET - when we are using the vendor compiler. - * testsuite/Makefile.am (EXTRA_DEJAGNU_SITE_CONFIG): Point to - ../local.exp. - * configure, testsuite/Makefile.in: Rebuilt. - - * testsuite/libffi.call/call.exp: Run tests with different - options, depending on whether or not we are using gcc or the - vendor compiler. - * testsuite/lib/libffi.exp (libffi-init): Set using_gcc based on - whether or not we are building/testing with gcc. - -2013-01-08 Anthony Green - - * configure.ac: Switch x86 solaris target to X86 by default. - * configure: Rebuilt. - -2013-01-08 Anthony Green - - * configure.ac: Fix test for read-only eh_frame. - * configure: Rebuilt. - -2013-01-08 Anthony Green - - * src/x86/sysv.S, src/x86/unix64.S: Only emit DWARF unwind info - when building with the GNU toolchain. - * testsuite/libffi.call/ffitest.h (CHECK): Fix for Solaris vendor - compiler. - -2013-01-07 Thorsten Glaser - - * testsuite/libffi.call/cls_uchar_va.c, - testsuite/libffi.call/cls_ushort_va.c, - testsuite/libffi.call/va_1.c: Testsuite fixes. - -2013-01-07 Thorsten Glaser - - * src/m68k/ffi.c (CIF_FLAGS_SINT8, CIF_FLAGS_SINT16): Define. - (ffi_prep_cif_machdep): Fix 8-bit and 16-bit signed calls. - * src/m68k/sysv.S (ffi_call_SYSV, ffi_closure_SYSV): Ditto. - -2013-01-04 Anthony Green - - * Makefile.am (AM_CFLAGS): Don't automatically add -fexceptions - and -Wall. This is set in the configure script after testing for - GCC. - * Makefile.in: Rebuilt. - -2013-01-02 rofl0r - - * src/powerpc/ffi.c (ffi_prep_cif_machdep): Fix build error on ppc - when long double == double. - -2013-01-02 Reini Urban - - * Makefile.am (libffi_la_LDFLAGS): Add -no-undefined to LDFLAGS - (required for shared libs on cygwin/mingw). - * Makefile.in: Rebuilt. - -2012-10-31 Alan Modra - - * src/powerpc/linux64_closure.S: Add new ABI support. - * src/powerpc/linux64.S: Likewise. - -2012-10-30 Magnus Granberg - Pavel Labushev - - * configure.ac: New options pax_emutramp - * configure, fficonfig.h.in: Regenerated - * src/closures.c: New function emutramp_enabled_check() and - checks. - -2012-10-30 Frederick Cheung - - * configure.ac: Enable FFI_MAP_EXEC_WRIT for Darwin 12 (mountain - lion) and future version. - * configure: Rebuild. - -2012-10-30 James Greenhalgh - Marcus Shawcroft - - * README: Add details of aarch64 port. - * src/aarch64/ffi.c: New. - * src/aarch64/ffitarget.h: Likewise. - * src/aarch64/sysv.S: Likewise. - * Makefile.am: Support aarch64. - * configure.ac: Support aarch64. - * Makefile.in, configure: Rebuilt. - -2012-10-30 James Greenhalgh - Marcus Shawcroft - - * testsuite/lib/libffi.exp: Add support for aarch64. - * testsuite/libffi.call/cls_struct_va1.c: New. - * testsuite/libffi.call/cls_uchar_va.c: Likewise. - * testsuite/libffi.call/cls_uint_va.c: Likewise. - * testsuite/libffi.call/cls_ulong_va.c: Likewise. - * testsuite/libffi.call/cls_ushort_va.c: Likewise. - * testsuite/libffi.call/nested_struct11.c: Likewise. - * testsuite/libffi.call/uninitialized.c: Likewise. - * testsuite/libffi.call/va_1.c: Likewise. - * testsuite/libffi.call/va_struct1.c: Likewise. - * testsuite/libffi.call/va_struct2.c: Likewise. - * testsuite/libffi.call/va_struct3.c: Likewise. - -2012-10-12 Walter Lee - - * Makefile.am: Add TILE-Gx/TILEPro support. - * configure.ac: Likewise. - * Makefile.in: Regenerate. - * configure: Likewise. - * src/prep_cif.c (ffi_prep_cif_core): Handle TILE-Gx/TILEPro. - * src/tile: New directory. - * src/tile/ffi.c: New file. - * src/tile/ffitarget.h: Ditto. - * src/tile/tile.S: Ditto. - -2012-10-12 Matthias Klose - - * generate-osx-source-and-headers.py: Normalize whitespace. - -2012-09-14 David Edelsohn - - * configure: Regenerated. - -2012-08-26 Andrew Pinski - - PR libffi/53014 - * src/mips/ffi.c (ffi_prep_closure_loc): Allow n32 with soft-float and n64 with - soft-float. - -2012-08-08 Uros Bizjak - - * src/s390/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - -2012-07-18 H.J. Lu - - PR libffi/53982 - PR libffi/53973 - * src/x86/ffitarget.h: Check __ILP32__ instead of __LP64__ for x32. - (FFI_SIZEOF_JAVA_RAW): Defined to 4 for x32. - -2012-05-16 H.J. Lu - - * configure: Regenerated. - -2012-05-05 Nicolas Lelong - - * libffi.xcodeproj/project.pbxproj: Fixes. - * README: Update for iOS builds. - -2012-04-23 Alexandre Keunecke I. de Mendonca - - * configure.ac: Add Blackfin/sysv support - * Makefile.am: Add Blackfin/sysv support - * src/bfin/ffi.c: Add Blackfin/sysv support - * src/bfin/ffitarget.h: Add Blackfin/sysv support - -2012-04-11 Anthony Green - - * Makefile.am (EXTRA_DIST): Add new script. - * Makefile.in: Rebuilt. - -2012-04-11 Zachary Waldowski - - * generate-ios-source-and-headers.py, - libffi.xcodeproj/project.pbxproj: Support a Mac static library via - Xcode. Set iOS compatibility to 4.0. Move iOS trampoline - generation into an Xcode "run script" phase. Include both as - Xcode build scripts. Don't always regenerate config files. - -2012-04-10 Anthony Green - - * src/powerpc/ffi_darwin.c (ffi_prep_args): Add missing semicolon. - -2012-04-06 Anthony Green - - * Makefile.am (EXTRA_DIST): Add new iOS/xcode files. - * Makefile.in: Rebuilt. - -2012-04-06 Mike Lewis - - * generate-ios-source-and-headers.py: New file. - * libffi.xcodeproj/project.pbxproj: New file. - * README: Update instructions on building iOS binary. - * build-ios.sh: Delete. - -2012-04-06 Anthony Green - - * src/x86/ffi64.c (UINT128): Define differently for Intel and GNU - compilers, then use it. - -2012-04-06 H.J. Lu - - * m4/libtool.m4 (_LT_ENABLE_LOCK): Support x32. - -2012-04-06 Anthony Green - - * testsuite/Makefile.am (EXTRA_DIST): Add missing test cases. - * testsuite/Makefile.in: Rebuilt. - -2012-04-05 Zachary Waldowski - - * include/ffi.h.in: Add missing trampoline table fields. - * src/arm/sysv.S: Fix ENTRY definition, and wrap symbol references - in CNAME. - * src/x86/ffi.c: Wrap Windows specific code in ifdefs. - -2012-04-02 Peter Bergner - - * src/powerpc/ffi.c (ffi_prep_args_SYSV): Declare double_tmp. - Silence casting pointer to integer of different size warning. - Delete goto to previously deleted label. - (ffi_call): Silence possibly undefined warning. - (ffi_closure_helper_SYSV): Declare variable type. - -2012-04-02 Peter Rosin - - * src/x86/win32.S (ffi_call_win32): Sign/zero extend the return - value in the Intel version as is already done for the AT&T version. - (ffi_closure_SYSV): Likewise. - (ffi_closure_raw_SYSV): Likewise. - (ffi_closure_STDCALL): Likewise. - -2012-03-29 Peter Rosin - - * src/x86/win32.S (ffi_closure_raw_THISCALL): Unify the frame - generation, fix the ENDP label and remove the surplus third arg - from the 'lea' insn. - -2012-03-29 Peter Rosin - - * src/x86/win32.S (ffi_closure_raw_SYSV): Make the 'stubraw' label - visible outside the PROC, so that ffi_closure_raw_THISCALL can see - it. Also instruct the assembler to add a frame to the function. - -2012-03-23 Peter Rosin - - * Makefile.am (AM_CPPFLAGS): Add -DFFI_BUILDING. - * Makefile.in: Rebuilt. - * include/ffi.h.in [MSVC]: Add __declspec(dllimport) decorations - to all data exports, when compiling libffi clients using MSVC. - -2012-03-29 Peter Rosin - - * src/x86/ffitarget.h (ffi_abi): Add new ABI FFI_MS_CDECL and - make it the default for MSVC. - (FFI_TYPE_MS_STRUCT): New structure return convention. - * src/x86/ffi.c (ffi_prep_cif_machdep): Tweak the structure - return convention for FFI_MS_CDECL to be FFI_TYPE_MS_STRUCT - instead of an ordinary FFI_TYPE_STRUCT. - (ffi_prep_args): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. - (ffi_call): Likewise. - (ffi_prep_incoming_args_SYSV): Likewise. - (ffi_raw_call): Likewise. - (ffi_prep_closure_loc): Treat FFI_MS_CDECL as FFI_SYSV. - * src/x86/win32.S (ffi_closure_SYSV): For FFI_TYPE_MS_STRUCT, - return a pointer to the result structure in eax and don't pop - that pointer from the stack, the caller takes care of it. - (ffi_call_win32): Treat FFI_TYPE_MS_STRUCT as FFI_TYPE_STRUCT. - (ffi_closure_raw_SYSV): Likewise. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/closure_stdcall.c [MSVC]: Add inline - assembly version with Intel syntax. - * testsuite/libffi.call/closure_thiscall.c [MSVC]: Likewise. - -2012-03-23 Peter Rosin - - * testsuite/libffi.call/ffitest.h: Provide abstration of - __attribute__((fastcall)) in the form of a __FASTCALL__ - define. Define it to __fastcall for MSVC. - * testsuite/libffi.call/fastthis1_win32.c: Use the above. - * testsuite/libffi.call/fastthis2_win32.c: Likewise. - * testsuite/libffi.call/fastthis3_win32.c: Likewise. - * testsuite/libffi.call/strlen2_win32.c: Likewise. - * testsuite/libffi.call/struct1_win32.c: Likewise. - * testsuite/libffi.call/struct2_win32.c: Likewise. - -2012-03-22 Peter Rosin - - * src/x86/win32.S [MSVC] (ffi_closure_THISCALL): Remove the manual - frame on function entry, MASM adds one automatically. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/ffitest.h [MSVC]: Add kludge for missing - bits in the MSVC headers. - -2012-03-22 Peter Rosin - - * testsuite/libffi.call/cls_12byte.c: Adjust to the C89 style - with no declarations after statements. - * 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_5_1_byte.c: Likewise. - * testsuite/libffi.call/cls_5byte.c: Likewise. - * testsuite/libffi.call/cls_64byte.c: Likewise. - * testsuite/libffi.call/cls_6_1_byte.c: Likewise. - * testsuite/libffi.call/cls_6byte.c: Likewise. - * testsuite/libffi.call/cls_7_1_byte.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_longdouble_split.c: Likewise. - * testsuite/libffi.call/cls_align_longdouble_split2.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_dbls_struct.c: Likewise. - * testsuite/libffi.call/cls_pointer_stack.c: Likewise. - * testsuite/libffi.call/err_bad_typedef.c: Likewise. - * testsuite/libffi.call/huge_struct.c: Likewise. - * testsuite/libffi.call/nested_struct.c: Likewise. - * testsuite/libffi.call/nested_struct1.c: Likewise. - * testsuite/libffi.call/nested_struct10.c: Likewise. - * testsuite/libffi.call/nested_struct2.c: Likewise. - * testsuite/libffi.call/nested_struct3.c: Likewise. - * testsuite/libffi.call/nested_struct4.c: Likewise. - * testsuite/libffi.call/nested_struct5.c: Likewise. - * testsuite/libffi.call/nested_struct6.c: Likewise. - * testsuite/libffi.call/nested_struct7.c: Likewise. - * testsuite/libffi.call/nested_struct8.c: Likewise. - * testsuite/libffi.call/nested_struct9.c: Likewise. - * testsuite/libffi.call/stret_large.c: Likewise. - * testsuite/libffi.call/stret_large2.c: Likewise. - * testsuite/libffi.call/stret_medium.c: Likewise. - * testsuite/libffi.call/stret_medium2.c: Likewise. - * testsuite/libffi.call/struct1.c: Likewise. - * testsuite/libffi.call/struct1_win32.c: Likewise. - * testsuite/libffi.call/struct2.c: Likewise. - * testsuite/libffi.call/struct2_win32.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.call/testclosure.c: Likewise. - -2012-03-21 Peter Rosin - - * testsuite/libffi.call/float_va.c (float_va_fn): Use %f when - printing doubles (%lf is for long doubles). - (main): Likewise. - -2012-03-21 Peter Rosin - - * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] - (set_ld_library_path_env_vars): Add the library search dir to PATH - (and save PATH for later). - (restore_ld_library_path_env_vars): Restore PATH. - -2012-03-21 Peter Rosin - - * testsuite/lib/target-libpath.exp [*-*-cygwin*, *-*-mingw*] - (set_ld_library_path_env_vars): Add the library search dir to PATH - (and save PATH for later). - (restore_ld_library_path_env_vars): Restore PATH. - -2012-03-20 Peter Rosin - - * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. - * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label - visible outside the PROC, so that ffi_closure_THISCALL can see it. - -2012-03-20 Peter Rosin - - * testsuite/libffi.call/strlen2_win32.c (main): Remove bug. - * src/x86/win32.S [MSVC] (ffi_closure_SYSV): Make the 'stub' label - visible outside the PROC, so that ffi_closure_THISCALL can see it. - -2012-03-19 Alan Hourihane - - * src/m68k/ffi.c: Add MINT support. - * src/m68k/sysv.S: Ditto. - -2012-03-06 Chung-Lin Tang - - * src/arm/ffi.c (ffi_call): Add __ARM_EABI__ guard around call to - ffi_call_VFP(). - (ffi_prep_closure_loc): Add __ARM_EABI__ guard around use of - ffi_closure_VFP. - * src/arm/sysv.S: Add __ARM_EABI__ guard around VFP code. - -2012-03-19 chennam - - * src/powerpc/ffi_darwin.c (ffi_prep_closure_loc): Fix AIX closure - support. - -2012-03-13 Kaz Kojima - - * src/sh/ffi.c (ffi_prep_closure_loc): Don't ASSERT ABI test, - just return FFI_BAD_ABI when things are wrong. - * src/sh64/ffi.c (ffi_prep_closure_loc): Ditto. - -2012-03-09 David Edelsohn - - * src/powerpc/aix_closure.S (ffi_closure_ASM): Adjust for Darwin64 - change to return value of ffi_closure_helper_DARWIN and load type - from return type. - -2012-03-03 H.J. Lu - - * src/x86/ffi64.c (ffi_call): Cast the return value to unsigned - long. - (ffi_prep_closure_loc): Cast to 64bit address in trampoline. - (ffi_closure_unix64_inner): Cast return pointer to unsigned long - first. - - * src/x86/ffitarget.h (FFI_SIZEOF_ARG): Defined to 8 for x32. - (ffi_arg): Set to unsigned long long for x32. - (ffi_sarg): Set to long long for x32. - -2012-03-03 H.J. Lu - - * src/prep_cif.c (ffi_prep_cif_core): Properly check bad ABI. - -2012-03-03 Andoni Morales Alastruey - - * configure.ac: Add -no-undefined for both 32- and 64-bit x86 - windows-like hosts. - * configure: Rebuilt. - -2012-02-27 Mikael Pettersson - - PR libffi/52223 - * Makefile.am (FLAGS_TO_PASS): Define. - * Makefile.in: Regenerate. - -2012-02-23 Anthony Green - - * src/*/ffitarget.h: Ensure that users never include ffitarget.h - directly. - -2012-02-23 Kai Tietz - - PR libffi/52221 - * src/x86/ffi.c (ffi_closure_raw_THISCALL): New - prototype. - (ffi_prep_raw_closure_loc): Use ffi_closure_raw_THISCALL for - thiscall-convention. - (ffi_raw_call): Use ffi_prep_args_raw. - * src/x86/win32.S (ffi_closure_raw_THISCALL): Add - implementation for stub. - -2012-02-10 Kai Tietz - - * configure.ac (AM_LTLDFLAGS): Add -no-undefine for x64 - windows target. - * configure: Regenerated. - -2012-02-08 Kai Tietz - - * src/prep_cif.c (ffi_prep_cif): Allow for X86_WIN32 - also FFI_THISCALL. - * src/x86/ffi.c (ffi_closure_THISCALL): Add prototype. - (FFI_INIT_TRAMPOLINE_THISCALL): New trampoline code. - (ffi_prep_closure_loc): Add FFI_THISCALL support. - * src/x86/ffitarget.h (FFI_TRAMPOLINE_SIZE): Adjust size. - * src/x86/win32.S (ffi_closure_THISCALL): New closure code - for thiscall-calling convention. - * testsuite/libffi.call/closure_thiscall.c: New test. - -2012-01-28 Kai Tietz - - * src/libffi/src/x86/ffi.c (ffi_call_win32): Add new - argument to prototype for specify calling-convention. - (ffi_call): Add support for stdcall/thiscall convention. - (ffi_prep_args): Likewise. - (ffi_raw_call): Likewise. - * src/x86/ffitarget.h (ffi_abi): Add FFI_THISCALL and - FFI_FASTCALL. - * src/x86/win32.S (_ffi_call_win32): Add support for - fastcall/thiscall calling-convention calls. - * testsuite/libffi.call/fastthis1_win32.c: New test. - * testsuite/libffi.call/fastthis2_win32.c: New test. - * testsuite/libffi.call/fastthis3_win32.c: New test. - * testsuite/libffi.call/strlen2_win32.c: New test. - * testsuite/libffi.call/many2_win32.c: New test. - * testsuite/libffi.call/struct1_win32.c: New test. - * testsuite/libffi.call/struct2_win32.c: New test. - -2012-01-23 Uros Bizjak - - * src/alpha/ffi.c (ffi_prep_closure_loc): Check for bad ABI. - -2012-01-23 Anthony Green - Chris Young - - * configure.ac: Add Amiga support. - * configure: Rebuilt. - -2012-01-23 Dmitry Nadezhin - - * include/ffi_common.h (LIKELY, UNLIKELY): Fix definitions. - -2012-01-23 Andreas Schwab - - * src/m68k/sysv.S (ffi_call_SYSV): Properly test for plain - mc68000. Test for __HAVE_68881__ in addition to __MC68881__. - -2012-01-19 Jakub Jelinek - - PR rtl-optimization/48496 - * src/ia64/ffi.c (ffi_call): Fix up aliasing violations. - -2012-01-09 Rainer Orth - - * configure.ac (i?86-*-*): Set TARGET to X86_64. - * configure: Regenerate. - -2011-12-07 Andrew Pinski - - PR libffi/50051 - * src/mips/n32.S: Add ".set mips4". - -2011-11-21 Andreas Tobler - - * configure: Regenerate. - -2011-11-12 David Gilbert - - * doc/libffi.texi, include/ffi.h.in, include/ffi_common.h, - man/Makefile.am, man/ffi.3, man/ffi_prep_cif.3, - man/ffi_prep_cif_var.3, src/arm/ffi.c, src/arm/ffitarget.h, - src/cris/ffi.c, src/prep_cif.c, - testsuite/libffi.call/cls_double_va.c, - testsuite/libffi.call/cls_longdouble_va.c, - testsuite/libffi.call/float_va.c: Many changes to support variadic - function calls. - -2011-11-12 Kyle Moffett - - * src/powerpc/ffi.c, src/powerpc/ffitarget.h, - src/powerpc/ppc_closure.S, src/powerpc/sysv.S: Many changes for - softfloat powerpc variants. - -2011-11-12 Petr Salinger - - * configure.ac (FFI_EXEC_TRAMPOLINE_TABLE): Fix kfreebsd support. - * configure: Rebuilt. - -2011-11-12 Timothy Wall - - * src/arm/ffi.c (ffi_prep_args, ffi_prep_incoming_args_SYSV): Max - alignment of 4 for wince on ARM. - -2011-11-12 Kyle Moffett - Anthony Green - - * src/ppc/sysv.S, src/ppc/ffi.c: Remove use of ppc string - instructions (not available on some cores, like the PPC440). - -2011-11-12 Kimura Wataru - - * m4/ax_enable_builddir: Change from string comparison to numeric - comparison for wc output. - * configure.ac: Enable FFI_MMAP_EXEC_WRIT for darwin11 aka Mac OS - X 10.7. - * configure: Rebuilt. - -2011-11-12 Anthony Green - - * Makefile.am (AM_CCASFLAGS): Add -g option to build assembly - files with debug info. - * Makefile.in: Rebuilt. - -2011-11-12 Jasper Lievisse Adriaanse - - * README: Update list of supported OpenBSD systems. - -2011-11-12 Anthony Green - - * libtool-version: Update. - * Makefile.am (nodist_libffi_la_SOURCES): Add src/debug.c if - FFI_DEBUG. - (libffi_la_SOURCES): Remove src/debug.c - (EXTRA_DIST): Add src/debug.c - * Makefile.in: Rebuilt. - * README: Update for 3.0.11. - -2011-11-10 Richard Henderson - - * configure.ac (GCC_AS_CFI_PSEUDO_OP): Use it instead of inline check. - * configure, aclocal.m4: Rebuild. - -2011-09-04 Iain Sandoe - - PR libffi/49594 - * src/powerpc/darwin_closure.S (stubs): Make the stub binding - helper reference track the architecture pointer size. - -2011-08-25 Andrew Haley - - * src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Remove hard-coded assembly - instructions. - * src/arm/sysv.S (ffi_arm_trampoline): Put them here instead. - -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. - -2012-02-11 Eric Botcazou - - * src/sparc/v9.S (STACKFRAME): Bump to 176. - -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. - -2012-02-13 Kai Tietz - - PR libffi/52221 - * src/x86/ffi.c (ffi_prep_raw_closure_loc): Add thiscall - support for X86_WIN32. - (FFI_INIT_TRAMPOLINE_THISCALL): Fix displacement. - -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. - -2011-08-22 Jasper Lievisse Adriaanse - - * configure.ac: Add OpenBSD/hppa and OpenBSD/powerpc support. - * configure: Rebuilt. - -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.25/ext/ffi_c/libffi/ChangeLog.libgcj b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libgcj deleted file mode 100644 index ea5d02f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.libgcj +++ /dev/null @@ -1,40 +0,0 @@ -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.25/ext/ffi_c/libffi/ChangeLog.v1 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.v1 deleted file mode 100644 index af3a377..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/ChangeLog.v1 +++ /dev/null @@ -1,764 +0,0 @@ -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 concatenated 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.25/ext/ffi_c/libffi/LICENSE b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/LICENSE deleted file mode 100644 index a66fab4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -libffi - Copyright (c) 1996-2014 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.25/ext/ffi_c/libffi/LICENSE-BUILDTOOLS b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/LICENSE-BUILDTOOLS deleted file mode 100644 index 869c703..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +++ /dev/null @@ -1,352 +0,0 @@ -The libffi source distribution contains certain code that is not part -of libffi, and is only used as tooling to assist with the building and -testing of libffi. This includes the msvcc.sh script used to wrap the -Microsoft compiler with GNU compatible command-line options, and the -libffi test code distributed in the testsuite/libffi.bhaible -directory. This code is distributed with libffi for the purpose of -convenience only, and libffi is in no way derived from this code. - -msvcc.sh an testsuite/libffi.bhaible are both distributed under the -terms of the GNU GPL version 2, as below. - - - - 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. - - END OF TERMS AND CONDITIONS - - How to Apply These Terms to Your New Programs - - If you develop a new program, and you want it to be of the greatest -possible use to the public, the best way to achieve this is to make it -free software which everyone can redistribute and change under these terms. - - To do so, attach the following notices to the program. It is safest -to attach them to the start of each source file to most effectively -convey the exclusion of warranty; and each file should have at least -the "copyright" line and a pointer to where the full notice is found. - - - Copyright (C) - - 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., - 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. - -Also add information on how to contact you by electronic and paper mail. - -If the program is interactive, make it output a short notice like this -when it starts in an interactive mode: - - Gnomovision version 69, Copyright (C) year name of author - Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. - This is free software, and you are welcome to redistribute it - under certain conditions; type `show c' for details. - -The hypothetical commands `show w' and `show c' should show the appropriate -parts of the General Public License. Of course, the commands you use may -be called something other than `show w' and `show c'; they could even be -mouse-clicks or menu items--whatever suits your program. - -You should also get your employer (if you work as a programmer) or your -school, if any, to sign a "copyright disclaimer" for the program, if -necessary. Here is a sample; alter the names: - - Yoyodyne, Inc., hereby disclaims all copyright interest in the program - `Gnomovision' (which makes passes at compilers) written by James Hacker. - - , 1 April 1989 - Ty Coon, President of Vice - -This General Public License does not permit incorporating your program into -proprietary programs. If your program is a subroutine library, you may -consider it more useful to permit linking proprietary applications with the -library. If this is what you want to do, use the GNU Lesser General -Public License instead of this License. diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/Makefile.am deleted file mode 100644 index 27a11b2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/Makefile.am +++ /dev/null @@ -1,166 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS = foreign subdir-objects - -ACLOCAL_AMFLAGS = -I m4 - -SUBDIRS = include testsuite man -if BUILD_DOCS -## This hack is needed because it doesn't seem possible to make a -## conditional info_TEXINFOS in Automake. At least Automake 1.14 -## either gives errors -- if this attempted in the most -## straightforward way -- or simply unconditionally tries to build the -## info file. -SUBDIRS += doc -endif - -EXTRA_DIST = LICENSE ChangeLog.v1 ChangeLog.libgcj \ - ChangeLog.libffi ChangeLog.libffi-3.1 \ - m4/libtool.m4 m4/lt~obsolete.m4 \ - m4/ltoptions.m4 m4/ltsugar.m4 m4/ltversion.m4 \ - m4/ltversion.m4 src/debug.c msvcc.sh \ - generate-darwin-source-and-headers.py \ - libffi.xcodeproj/project.pbxproj \ - libtool-ldflags libtool-version configure.host README.md \ - libffi.map.in - -# local.exp is generated by configure -DISTCLEANFILES = local.exp - -# Subdir rules rely on $(FLAGS_TO_PASS) -FLAGS_TO_PASS = $(AM_MAKEFLAGS) - -MAKEOVERRIDES= - -pkgconfigdir = $(libdir)/pkgconfig -pkgconfig_DATA = libffi.pc - -toolexeclib_LTLIBRARIES = libffi.la -noinst_LTLIBRARIES = libffi_convenience.la - -libffi_la_SOURCES = src/prep_cif.c src/types.c \ - src/raw_api.c src/java_raw_api.c src/closures.c - -if FFI_DEBUG -libffi_la_SOURCES += src/debug.c -endif - -noinst_HEADERS = \ - src/aarch64/ffitarget.h src/aarch64/internal.h \ - src/alpha/ffitarget.h src/alpha/internal.h \ - src/arc/ffitarget.h \ - src/arm/ffitarget.h src/arm/internal.h \ - src/avr32/ffitarget.h \ - src/bfin/ffitarget.h \ - src/cris/ffitarget.h \ - src/frv/ffitarget.h \ - src/ia64/ffitarget.h src/ia64/ia64_flags.h \ - src/m32r/ffitarget.h \ - src/m68k/ffitarget.h \ - src/m88k/ffitarget.h \ - src/metag/ffitarget.h \ - src/microblaze/ffitarget.h \ - src/mips/ffitarget.h \ - src/moxie/ffitarget.h \ - src/nios2/ffitarget.h \ - src/or1k/ffitarget.h \ - src/pa/ffitarget.h \ - src/powerpc/ffitarget.h src/powerpc/asm.h src/powerpc/ffi_powerpc.h \ - src/riscv/ffitarget.h \ - src/s390/ffitarget.h src/s390/internal.h \ - src/sh/ffitarget.h \ - src/sh64/ffitarget.h \ - src/sparc/ffitarget.h src/sparc/internal.h \ - src/tile/ffitarget.h \ - src/vax/ffitarget.h \ - src/x86/ffitarget.h src/x86/internal.h src/x86/internal64.h src/x86/asmnames.h \ - src/xtensa/ffitarget.h \ - src/dlmalloc.c - -EXTRA_libffi_la_SOURCES = \ - src/aarch64/ffi.c src/aarch64/sysv.S \ - src/alpha/ffi.c src/alpha/osf.S \ - src/arc/ffi.c src/arc/arcompact.S \ - src/arm/ffi.c src/arm/sysv.S \ - src/avr32/ffi.c src/avr32/sysv.S \ - src/bfin/ffi.c src/bfin/sysv.S \ - src/cris/ffi.c src/cris/sysv.S \ - src/frv/ffi.c src/frv/eabi.S \ - src/ia64/ffi.c src/ia64/unix.S \ - src/m32r/ffi.c src/m32r/sysv.S \ - src/m68k/ffi.c src/m68k/sysv.S \ - src/m88k/ffi.c src/m88k/obsd.S \ - src/metag/ffi.c src/metag/sysv.S \ - src/microblaze/ffi.c src/microblaze/sysv.S \ - src/mips/ffi.c src/mips/o32.S src/mips/n32.S \ - src/moxie/ffi.c src/moxie/eabi.S \ - src/nios2/ffi.c src/nios2/sysv.S \ - src/or1k/ffi.c src/or1k/sysv.S \ - src/pa/ffi.c src/pa/linux.S src/pa/hpux32.S \ - src/powerpc/ffi.c src/powerpc/ffi_sysv.c src/powerpc/ffi_linux64.c \ - src/powerpc/sysv.S src/powerpc/linux64.S \ - src/powerpc/linux64_closure.S src/powerpc/ppc_closure.S \ - src/powerpc/aix.S src/powerpc/darwin.S src/powerpc/aix_closure.S \ - src/powerpc/darwin_closure.S src/powerpc/ffi_darwin.c \ - src/riscv/ffi.c src/riscv/sysv.S \ - src/s390/ffi.c src/s390/sysv.S \ - src/sh/ffi.c src/sh/sysv.S \ - src/sh64/ffi.c src/sh64/sysv.S \ - src/sparc/ffi.c src/sparc/ffi64.c src/sparc/v8.S src/sparc/v9.S \ - src/tile/ffi.c src/tile/tile.S \ - src/vax/ffi.c src/vax/elfbsd.S \ - src/x86/ffi.c src/x86/sysv.S \ - src/x86/ffiw64.c src/x86/win64.S \ - src/x86/ffi64.c src/x86/unix64.S \ - src/xtensa/ffi.c src/xtensa/sysv.S - -TARGET_OBJ = @TARGET_OBJ@ -libffi_la_LIBADD = $(TARGET_OBJ) - -libffi_convenience_la_SOURCES = $(libffi_la_SOURCES) -EXTRA_libffi_convenience_la_SOURCES = $(EXTRA_libffi_la_SOURCES) -libffi_convenience_la_LIBADD = $(libffi_la_LIBADD) -libffi_convenience_la_DEPENDENCIES = $(libffi_la_DEPENDENCIES) -nodist_libffi_convenience_la_SOURCES = $(nodist_libffi_la_SOURCES) - -LTLDFLAGS = $(shell $(SHELL) $(top_srcdir)/libtool-ldflags $(LDFLAGS)) - -AM_CFLAGS = -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 - -if LIBFFI_BUILD_VERSIONED_SHLIB -if LIBFFI_BUILD_VERSIONED_SHLIB_GNU -libffi_version_script = -Wl,--version-script,libffi.map -libffi_version_dep = libffi.map -endif -if LIBFFI_BUILD_VERSIONED_SHLIB_SUN -libffi_version_script = -Wl,-M,libffi.map-sun -libffi_version_dep = libffi.map-sun -libffi.map-sun : libffi.map $(top_srcdir)/../contrib/make_sunver.pl \ - $(libffi_la_OBJECTS) $(libffi_la_LIBADD) - perl $(top_srcdir)/../contrib/make_sunver.pl libffi.map \ - `echo $(libffi_la_OBJECTS) $(libffi_la_LIBADD) | \ - sed 's,\([^/ ]*\)\.l\([ao]\),.libs/\1.\2,g'` \ - > $@ || (rm -f $@ ; exit 1) -endif -else -libffi_version_script = -libffi_version_dep = -endif -libffi_version_info = -version-info `grep -v '^\#' $(srcdir)/libtool-version` - -libffi.map: $(top_srcdir)/libffi.map.in - $(COMPILE) -D$(TARGET) -E -x assembler-with-cpp -o $@ $< - -libffi_la_LDFLAGS = -no-undefined $(libffi_version_info) $(libffi_version_script) $(LTLDFLAGS) $(AM_LTLDFLAGS) -libffi_la_DEPENDENCIES = $(libffi_la_LIBADD) $(libffi_version_dep) - -AM_CPPFLAGS = -I. -I$(top_srcdir)/include -Iinclude -I$(top_srcdir)/src -AM_CCASFLAGS = $(AM_CPPFLAGS) - -dist-hook: - if [ -d $(top_srcdir)/.git ] ; then (cd $(top_srcdir); git log --no-decorate) ; else echo 'See git log for history.' ; fi > $(distdir)/ChangeLog diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/README.md b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/README.md deleted file mode 100644 index 3caf2fa..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/README.md +++ /dev/null @@ -1,461 +0,0 @@ -Status -====== - -[![Build Status](https://travis-ci.org/libffi/libffi.svg?branch=master)](https://travis-ci.org/libffi/libffi) -[![Build status](https://ci.appveyor.com/api/projects/status/8lko9vagbx4w2kxq?svg=true)](https://ci.appveyor.com/project/atgreen/libffi) - -libffi-3.3-rc0 was released on April 2, 2018. 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. - -At the time of release, the following basic configurations have been -tested: - -| Architecture | Operating System | Compiler | -| --------------- | ---------------- | ----------------------- | -| AArch64 (ARM64) | iOS | Clang | -| AArch64 | Linux | GCC | -| Alpha | Linux | GCC | -| Alpha | Tru64 | GCC | -| ARC | Linux | GCC | -| ARM | Linux | GCC | -| ARM | iOS | GCC | -| AVR32 | Linux | GCC | -| Blackfin | uClinux | GCC | -| HPPA | HPUX | GCC | -| IA-64 | Linux | GCC | -| M68K | FreeMiNT | GCC | -| M68K | Linux | GCC | -| M68K | RTEMS | GCC | -| M88K | OpenBSD/mvme88k | GCC | -| Meta | Linux | GCC | -| MicroBlaze | Linux | GCC | -| MIPS | IRIX | GCC | -| MIPS | Linux | GCC | -| MIPS | RTEMS | GCC | -| MIPS64 | Linux | GCC | -| Moxie | Bare metal | GCC | -| Nios II | Linux | GCC | -| OpenRISC | Linux | GCC | -| PowerPC 32-bit | AIX | IBM XL C | -| PowerPC 64-bit | AIX | IBM XL C | -| PowerPC | AMIGA | GCC | -| PowerPC | Linux | GCC | -| PowerPC | Mac OSX | GCC | -| PowerPC | FreeBSD | GCC | -| PowerPC 64-bit | FreeBSD | GCC | -| PowerPC 64-bit | Linux ELFv1 | GCC | -| PowerPC 64-bit | Linux ELFv2 | GCC | -| RISC-V 32-bit | Linux | GCC | -| RISC-V 64-bit | Linux | GCC | -| S390 | Linux | GCC | -| S390X | Linux | GCC | -| SPARC | Linux | GCC | -| SPARC | Solaris | GCC | -| SPARC | Solaris | Oracle Solaris Studio C | -| SPARC64 | Linux | GCC | -| SPARC64 | FreeBSD | GCC | -| SPARC64 | Solaris | Oracle Solaris Studio C | -| TILE-Gx/TILEPro | Linux | GCC | -| VAX | OpenBSD/vax | GCC | -| X86 | FreeBSD | GCC | -| X86 | GNU HURD | GCC | -| X86 | Interix | GCC | -| X86 | kFreeBSD | GCC | -| X86 | Linux | GCC | -| X86 | Mac OSX | GCC | -| X86 | OpenBSD | GCC | -| X86 | OS/2 | GCC | -| X86 | Solaris | GCC | -| X86 | Solaris | Oracle Solaris Studio C | -| X86 | Windows/Cygwin | GCC | -| X86 | Windows/MingW | GCC | -| X86-64 | FreeBSD | GCC | -| X86-64 | Linux | GCC | -| X86-64 | Linux/x32 | GCC | -| X86-64 | OpenBSD | GCC | -| X86-64 | Solaris | Oracle Solaris Studio C | -| X86-64 | Windows/Cygwin | GCC | -| X86-64 | Windows/MingW | GCC | -| X86-64 | Mac OSX | GCC | -| Xtensa | Linux | GCC | - -Please send additional platform test results to -libffi-discuss@sourceware.org. - -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. Note that building libffi requires a C99 compatible -compiler. - -If you're building libffi directly from git hosted sources, configure -won't exist yet; run ./autogen.sh first. This will require that you -install autoconf, automake and libtool. - -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. - -If you don't want to build documentation, use the ``--disable-docs`` -configure switch. - -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 CXX=path/to/msvcc.sh LD=link CPP="cl -nologo -EP" - -For 64-bit Windows builds, use ``CC="path/to/msvcc.sh -m64"`` and -``CXX="path/to/msvcc.sh -m64"``. You may also need to specify -``--build`` appropriately. - -It is also possible to build libffi on Windows platforms with the LLVM -project's clang-cl compiler, like below: - - path/to/configure CC="path/to/msvcc.sh -clang-cl" CXX="path/to/msvcc.sh -clang-cl" LD=link CPP="clang-cl -EP" - -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.) - -SPARC Solaris builds require the use of the GNU assembler and linker. -Point ``AS`` and ``LD`` environment variables at those tool prior to -configuration. - -For iOS builds, the ``libffi.xcodeproj`` Xcode project is available. - -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 ftp.gnu.org:/pub/gnu/make . - -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 git log for details at http://github.com/libffi/libffi. - - 3.3 TBD - Add RISC-V support. - New API in support of GO closures. - Default to Microsoft's 64 bit long double ABI with Visual C++. - GNU compiler uses 80 bits (128 in memory) FFI_GNUW64 ABI. - Many new tests cases and bug fixes. - - 3.2.1 Nov-12-14 - Build fix for non-iOS AArch64 targets. - - 3.2 Nov-11-14 - Add C99 Complex Type support (currently only supported on - s390). - Add support for PASCAL and REGISTER calling conventions on x86 - Windows/Linux. - Add OpenRISC and Cygwin-64 support. - Bug fixes. - - 3.1 May-19-14 - Add AArch64 (ARM64) iOS support. - Add Nios II support. - Add m88k and DEC VAX support. - Add support for stdcall, thiscall, and fastcall on non-Windows - 32-bit x86 targets such as Linux. - Various Android, MIPS N32, x86, FreeBSD and UltraSPARC IIi - fixes. - Make the testsuite more robust: eliminate several spurious - failures, and respect the $CC and $CXX environment variables. - Archive off the manually maintained ChangeLog in favor of git - log. - - 3.0.13 Mar-17-13 - Add Meta support. - Add missing Moxie bits. - Fix stack alignment bug on 32-bit x86. - Build fix for m68000 targets. - Build fix for soft-float Power targets. - Fix the install dir location for some platforms when building - with GCC (OS X, Solaris). - Fix Cygwin regression. - - 3.0.12 Feb-11-13 - Add Moxie support. - Add AArch64 support. - Add Blackfin support. - Add TILE-Gx/TILEPro support. - Add MicroBlaze support. - Add Xtensa support. - Add support for PaX enabled kernels with MPROTECT. - Add support for native vendor compilers on - Solaris and AIX. - Work around LLVM/GCC interoperability issue on x86_64. - - 3.0.11 Apr-11-12 - Lots of build fixes. - Add support for variadic functions (ffi_prep_cif_var). - Add Linux/x32 support. - Add thiscall, fastcall and MSVC cdecl support on Windows. - Add Amiga and newer MacOS support. - Add m68k FreeMiNT support. - Integration with iOS' xcode build tools. - Fix Octeon and MC68881 support. - Fix code pessimizations. - - 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: - - aarch64 Marcus Shawcroft, James Greenhalgh - alpha Richard Henderson - arm Raffaele Sena - blackfin Alexandre Keunecke I. de Mendonca - cris Simon Posnjak, Hans-Peter Nilsson - frv Anthony Green - ia64 Hans Boehm - m32r Kazuhiro Inaoka - m68k Andreas Schwab - m88k Miod Vallat - microblaze Nathan Rossi - mips Anthony Green, Casey Marshall - mips64 David Daney - moxie Anthony Green - nios ii Sandra Loosemore - openrisc Sebastian Macke - 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 - tile-gx/tilepro Walter Lee - vax Miod Vallat - x86 Anthony Green, Jon Beniston - x86-64 Bo Thorsen - xtensa Chris Zankel - -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.25/ext/ffi_c/libffi/acinclude.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/acinclude.m4 deleted file mode 100644 index 1a70efb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/acinclude.m4 +++ /dev/null @@ -1,479 +0,0 @@ -# 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 -]) - -dnl ---------------------------------------------------------------------- -dnl This whole bit snagged from libstdc++-v3, via libatomic. - -dnl -dnl LIBFFI_ENABLE -dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING) -dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, permit a|b|c) -dnl (FEATURE, DEFAULT, HELP-ARG, HELP-STRING, SHELL-CODE-HANDLER) -dnl -dnl See docs/html/17_intro/configury.html#enable for documentation. -dnl -m4_define([LIBFFI_ENABLE],[dnl -m4_define([_g_switch],[--enable-$1])dnl -m4_define([_g_help],[AC_HELP_STRING(_g_switch$3,[$4 @<:@default=$2@:>@])])dnl - AC_ARG_ENABLE($1,_g_help, - m4_bmatch([$5], - [^permit ], - [[ - case "$enableval" in - m4_bpatsubst([$5],[permit ])) ;; - *) AC_MSG_ERROR(Unknown argument to enable/disable $1) ;; - dnl Idea for future: generate a URL pointing to - dnl "onlinedocs/configopts.html#whatever" - esac - ]], - [^$], - [[ - case "$enableval" in - yes|no) ;; - *) AC_MSG_ERROR(Argument to enable/disable $1 must be yes or no) ;; - esac - ]], - [[$5]]), - [enable_]m4_bpatsubst([$1],-,_)[=][$2]) -m4_undefine([_g_switch])dnl -m4_undefine([_g_help])dnl -]) - -dnl -dnl If GNU ld is in use, check to see if tricky linker opts can be used. If -dnl the native linker is in use, all variables will be defined to something -dnl safe (like an empty string). -dnl -dnl Defines: -dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible -dnl OPT_LDFLAGS='-Wl,-O1' if possible -dnl LD (as a side effect of testing) -dnl Sets: -dnl with_gnu_ld -dnl libat_ld_is_gold (possibly) -dnl libat_gnu_ld_version (possibly) -dnl -dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will -dnl set libat_gnu_ld_version to 12345. Zeros cause problems. -dnl -AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ - # If we're not using GNU ld, then there's no point in even trying these - # tests. Check for that first. We should have already tested for gld - # by now (in libtool), but require it now just to be safe... - test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' - test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' - AC_REQUIRE([AC_PROG_LD]) - AC_REQUIRE([AC_PROG_AWK]) - - # The name set by libtool depends on the version of libtool. Shame on us - # for depending on an impl detail, but c'est la vie. Older versions used - # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on - # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually - # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't - # set (hence we're using an older libtool), then set it. - if test x${with_gnu_ld+set} != xset; then - if test x${ac_cv_prog_gnu_ld+set} != xset; then - # We got through "ac_require(ac_prog_ld)" and still not set? Huh? - with_gnu_ld=no - else - with_gnu_ld=$ac_cv_prog_gnu_ld - fi - fi - - # Start by getting the version number. I think the libtool test already - # does some of this, but throws away the result. - libat_ld_is_gold=no - if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then - libat_ld_is_gold=yes - fi - changequote(,) - ldver=`$LD --version 2>/dev/null | - sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` - changequote([,]) - libat_gnu_ld_version=`echo $ldver | \ - $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` - - # Set --gc-sections. - if test "$with_gnu_ld" = "notbroken"; then - # GNU ld it is! Joy and bunny rabbits! - - # All these tests are for C++; save the language and the compiler flags. - # Need to do this so that g++ won't try to link in libstdc++ - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS='-x c++ -Wl,--gc-sections' - - # Check for -Wl,--gc-sections - # XXX This test is broken at the moment, as symbols required for linking - # are now in libsupc++ (not built yet). In addition, this test has - # cored on solaris in the past. In addition, --gc-sections doesn't - # really work at the moment (keeps on discarding used sections, first - # .eh_frame and now some of the glibc sections for iconv). - # Bzzzzt. Thanks for playing, maybe next time. - AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) - AC_TRY_RUN([ - int main(void) - { - try { throw 1; } - catch (...) { }; - return 0; - } - ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - else - # this is the suspicious part - CFLAGS='' - fi - if test "$ac_sectionLDflags" = "yes"; then - SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" - fi - AC_MSG_RESULT($ac_sectionLDflags) - fi - - # Set linker optimization flags. - if test x"$with_gnu_ld" = x"yes"; then - OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" - fi - - AC_SUBST(SECTION_LDFLAGS) - AC_SUBST(OPT_LDFLAGS) -]) - - -dnl -dnl If GNU ld is in use, check to see if tricky linker opts can be used. If -dnl the native linker is in use, all variables will be defined to something -dnl safe (like an empty string). -dnl -dnl Defines: -dnl SECTION_LDFLAGS='-Wl,--gc-sections' if possible -dnl OPT_LDFLAGS='-Wl,-O1' if possible -dnl LD (as a side effect of testing) -dnl Sets: -dnl with_gnu_ld -dnl libat_ld_is_gold (possibly) -dnl libat_gnu_ld_version (possibly) -dnl -dnl The last will be a single integer, e.g., version 1.23.45.0.67.89 will -dnl set libat_gnu_ld_version to 12345. Zeros cause problems. -dnl -AC_DEFUN([LIBFFI_CHECK_LINKER_FEATURES], [ - # If we're not using GNU ld, then there's no point in even trying these - # tests. Check for that first. We should have already tested for gld - # by now (in libtool), but require it now just to be safe... - test -z "$SECTION_LDFLAGS" && SECTION_LDFLAGS='' - test -z "$OPT_LDFLAGS" && OPT_LDFLAGS='' - AC_REQUIRE([AC_PROG_LD]) - AC_REQUIRE([AC_PROG_AWK]) - - # The name set by libtool depends on the version of libtool. Shame on us - # for depending on an impl detail, but c'est la vie. Older versions used - # ac_cv_prog_gnu_ld, but now it's lt_cv_prog_gnu_ld, and is copied back on - # top of with_gnu_ld (which is also set by --with-gnu-ld, so that actually - # makes sense). We'll test with_gnu_ld everywhere else, so if that isn't - # set (hence we're using an older libtool), then set it. - if test x${with_gnu_ld+set} != xset; then - if test x${ac_cv_prog_gnu_ld+set} != xset; then - # We got through "ac_require(ac_prog_ld)" and still not set? Huh? - with_gnu_ld=no - else - with_gnu_ld=$ac_cv_prog_gnu_ld - fi - fi - - # Start by getting the version number. I think the libtool test already - # does some of this, but throws away the result. - libat_ld_is_gold=no - if $LD --version 2>/dev/null | grep 'GNU gold'> /dev/null 2>&1; then - libat_ld_is_gold=yes - fi - libat_ld_is_lld=no - if $LD --version 2>/dev/null | grep 'LLD '> /dev/null 2>&1; then - libat_ld_is_lld=yes - fi - changequote(,) - ldver=`$LD --version 2>/dev/null | - sed -e 's/GNU gold /GNU ld /;s/GNU ld version /GNU ld /;s/GNU ld ([^)]*) /GNU ld /;s/GNU ld \([0-9.][0-9.]*\).*/\1/; q'` - changequote([,]) - libat_gnu_ld_version=`echo $ldver | \ - $AWK -F. '{ if (NF<3) [$]3=0; print ([$]1*100+[$]2)*100+[$]3 }'` - - # Set --gc-sections. - if test "$with_gnu_ld" = "notbroken"; then - # GNU ld it is! Joy and bunny rabbits! - - # All these tests are for C++; save the language and the compiler flags. - # Need to do this so that g++ won't try to link in libstdc++ - ac_test_CFLAGS="${CFLAGS+set}" - ac_save_CFLAGS="$CFLAGS" - CFLAGS='-x c++ -Wl,--gc-sections' - - # Check for -Wl,--gc-sections - # XXX This test is broken at the moment, as symbols required for linking - # are now in libsupc++ (not built yet). In addition, this test has - # cored on solaris in the past. In addition, --gc-sections doesn't - # really work at the moment (keeps on discarding used sections, first - # .eh_frame and now some of the glibc sections for iconv). - # Bzzzzt. Thanks for playing, maybe next time. - AC_MSG_CHECKING([for ld that supports -Wl,--gc-sections]) - AC_TRY_RUN([ - int main(void) - { - try { throw 1; } - catch (...) { }; - return 0; - } - ], [ac_sectionLDflags=yes],[ac_sectionLDflags=no], [ac_sectionLDflags=yes]) - if test "$ac_test_CFLAGS" = set; then - CFLAGS="$ac_save_CFLAGS" - else - # this is the suspicious part - CFLAGS='' - fi - if test "$ac_sectionLDflags" = "yes"; then - SECTION_LDFLAGS="-Wl,--gc-sections $SECTION_LDFLAGS" - fi - AC_MSG_RESULT($ac_sectionLDflags) - fi - - # Set linker optimization flags. - if test x"$with_gnu_ld" = x"yes"; then - OPT_LDFLAGS="-Wl,-O1 $OPT_LDFLAGS" - fi - - AC_SUBST(SECTION_LDFLAGS) - AC_SUBST(OPT_LDFLAGS) -]) - - -dnl -dnl Add version tags to symbols in shared library (or not), additionally -dnl marking other symbols as private/local (or not). -dnl -dnl --enable-symvers=style adds a version script to the linker call when -dnl creating the shared library. The choice of version script is -dnl controlled by 'style'. -dnl --disable-symvers does not. -dnl + Usage: LIBFFI_ENABLE_SYMVERS[(DEFAULT)] -dnl Where DEFAULT is either 'yes' or 'no'. Passing `yes' tries to -dnl choose a default style based on linker characteristics. Passing -dnl 'no' disables versioning. -dnl -AC_DEFUN([LIBFFI_ENABLE_SYMVERS], [ - -LIBFFI_ENABLE(symvers,yes,[=STYLE], - [enables symbol versioning of the shared library], - [permit yes|no|gnu*|sun]) - -# If we never went through the LIBFFI_CHECK_LINKER_FEATURES macro, then we -# don't know enough about $LD to do tricks... -AC_REQUIRE([LIBFFI_CHECK_LINKER_FEATURES]) - -# Turn a 'yes' into a suitable default. -if test x$enable_symvers = xyes ; then - # FIXME The following test is too strict, in theory. - if test $enable_shared = no || test "x$LD" = x; then - enable_symvers=no - else - if test $with_gnu_ld = yes ; then - enable_symvers=gnu - else - case ${target_os} in - # Sun symbol versioning exists since Solaris 2.5. - solaris2.[[5-9]]* | solaris2.1[[0-9]]*) - enable_symvers=sun ;; - *) - enable_symvers=no ;; - esac - fi - fi -fi - -# Check if 'sun' was requested on non-Solaris 2 platforms. -if test x$enable_symvers = xsun ; then - case ${target_os} in - solaris2*) - # All fine. - ;; - *) - # Unlikely to work. - AC_MSG_WARN([=== You have requested Sun symbol versioning, but]) - AC_MSG_WARN([=== you are not targetting Solaris 2.]) - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - ;; - esac -fi - -# Check to see if libgcc_s exists, indicating that shared libgcc is possible. -if test $enable_symvers != no; then - AC_MSG_CHECKING([for shared libgcc]) - ac_save_CFLAGS="$CFLAGS" - CFLAGS=' -lgcc_s' - AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes, libat_shared_libgcc=no) - CFLAGS="$ac_save_CFLAGS" - if test $libat_shared_libgcc = no; then - cat > conftest.c <&1 >/dev/null \ - | sed -n 's/^.* -lgcc_s\([^ ]*\) .*$/\1/p'` -changequote([,])dnl - rm -f conftest.c conftest.so - if test x${libat_libgcc_s_suffix+set} = xset; then - CFLAGS=" -lgcc_s$libat_libgcc_s_suffix" - AC_TRY_LINK(, [return 0;], libat_shared_libgcc=yes) - CFLAGS="$ac_save_CFLAGS" - fi - fi - AC_MSG_RESULT($libat_shared_libgcc) -fi - -# For GNU ld, we need at least this version. The format is described in -# LIBFFI_CHECK_LINKER_FEATURES above. -libat_min_gnu_ld_version=21400 -# XXXXXXXXXXX libat_gnu_ld_version=21390 - -# Check to see if unspecified "yes" value can win, given results above. -# Change "yes" into either "no" or a style name. -if test $enable_symvers != no && test $libat_shared_libgcc = yes; then - if test $with_gnu_ld = yes; then - if test $libat_gnu_ld_version -ge $libat_min_gnu_ld_version ; then - enable_symvers=gnu - elif test $libat_ld_is_gold = yes ; then - enable_symvers=gnu - elif test $libat_ld_is_lld = yes ; then - enable_symvers=gnu - else - # The right tools, the right setup, but too old. Fallbacks? - AC_MSG_WARN(=== Linker version $libat_gnu_ld_version is too old for) - AC_MSG_WARN(=== full symbol versioning support in this release of GCC.) - AC_MSG_WARN(=== You would need to upgrade your binutils to version) - AC_MSG_WARN(=== $libat_min_gnu_ld_version or later and rebuild GCC.) - if test $libat_gnu_ld_version -ge 21200 ; then - # Globbing fix is present, proper block support is not. - dnl AC_MSG_WARN([=== Dude, you are soooo close. Maybe we can fake it.]) - dnl enable_symvers=??? - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - else - # 2.11 or older. - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - fi - fi - elif test $enable_symvers = sun; then - : All interesting versions of Sun ld support sun style symbol versioning. - else - # just fail for now - AC_MSG_WARN([=== You have requested some kind of symbol versioning, but]) - AC_MSG_WARN([=== either you are not using a supported linker, or you are]) - AC_MSG_WARN([=== not building a shared libgcc_s (which is required).]) - AC_MSG_WARN([=== Symbol versioning will be disabled.]) - enable_symvers=no - fi -fi -if test $enable_symvers = gnu; then - AC_DEFINE(LIBFFI_GNU_SYMBOL_VERSIONING, 1, - [Define to 1 if GNU symbol versioning is used for libatomic.]) -fi - -AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB, test $enable_symvers != no) -AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_GNU, test $enable_symvers = gnu) -AM_CONDITIONAL(LIBFFI_BUILD_VERSIONED_SHLIB_SUN, test $enable_symvers = sun) -AC_MSG_NOTICE(versioning on shared library symbols is $enable_symvers) -]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/autogen.sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/autogen.sh deleted file mode 100755 index fb014a3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/autogen.sh +++ /dev/null @@ -1,2 +0,0 @@ -#!/bin/sh -exec autoreconf -v -i diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/config.guess b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/config.guess deleted file mode 100644 index faa63aa..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/config.guess +++ /dev/null @@ -1,1466 +0,0 @@ -#! /bin/sh -# Attempt to guess a canonical system name. -# Copyright 1992-2017 Free Software Foundation, Inc. - -timestamp='2017-05-11' - -# 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 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 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 Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). -# -# Originally written by Per Bothner; maintained since 2000 by Ben Elliston. -# -# 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 -# -# Please send patches to . - - -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 1992-2017 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 - -case "${UNAME_SYSTEM}" in -Linux|GNU|GNU/*) - # If the system lacks a compiler, then just pick glibc. - # We could probably try harder. - LIBC=gnu - - eval $set_cc_for_build - cat <<-EOF > $dummy.c - #include - #if defined(__UCLIBC__) - LIBC=uclibc - #elif defined(__dietlibc__) - LIBC=dietlibc - #else - LIBC=gnu - #endif - EOF - eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep '^LIBC' | sed 's, ,,g'` - ;; -esac - -# 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 tuples: *-*-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=`(uname -p 2>/dev/null || \ - /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 ;; - earmv*) - arch=`echo ${UNAME_MACHINE_ARCH} | sed -e 's,^e\(armv[0-9]\).*$,\1,'` - endian=`echo ${UNAME_MACHINE_ARCH} | sed -ne 's,^.*\(eb\)$,\1,p'` - machine=${arch}${endian}-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) and ABI. - case "${UNAME_MACHINE_ARCH}" in - earm*) - os=netbsdelf - ;; - 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 - # Determine ABI tags. - case "${UNAME_MACHINE_ARCH}" in - earm*) - expr='s/^earmv[0-9]/-eabi/;s/eb$//' - abi=`echo ${UNAME_MACHINE_ARCH} | sed -e "$expr"` - ;; - 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/[-_].*//' | cut -d. -f1,2` - ;; - 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}${abi}" - exit ;; - *:Bitrig:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/Bitrig.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-bitrig${UNAME_RELEASE} - exit ;; - *:OpenBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/OpenBSD.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-openbsd${UNAME_RELEASE} - exit ;; - *:LibertyBSD:*:*) - UNAME_MACHINE_ARCH=`arch | sed 's/^.*BSD\.//'` - echo ${UNAME_MACHINE_ARCH}-unknown-libertybsd${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 ;; - *:Sortix:*:*) - echo ${UNAME_MACHINE}-unknown-sortix - 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` - # Reset EXIT trap before exiting to avoid spurious non-zero exit code. - exitcode=$? - trap '' 0 - exit $exitcode ;; - 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:*:[4567]) - 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/lslpp ] ; then - IBM_REV=`/usr/bin/lslpp -Lqc bos.rte.libc | - awk -F: '{ print $3 }' | sed s/[0-9]*$/0/` - 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:*:*) - UNAME_PROCESSOR=`/usr/bin/uname -p` - case ${UNAME_PROCESSOR} in - amd64) - UNAME_PROCESSOR=x86_64 ;; - i386) - UNAME_PROCESSOR=i586 ;; - esac - echo ${UNAME_PROCESSOR}-unknown-freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` - exit ;; - i*:CYGWIN*:*) - echo ${UNAME_MACHINE}-pc-cygwin - exit ;; - *:MINGW64*:*) - echo ${UNAME_MACHINE}-pc-mingw64 - exit ;; - *:MINGW*:*) - echo ${UNAME_MACHINE}-pc-mingw32 - exit ;; - *:MSYS*:*) - echo ${UNAME_MACHINE}-pc-msys - 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-${LIBC}`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 "[:upper:]" "[:lower:]"``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-${LIBC} - exit ;; - i*86:Minix:*:*) - echo ${UNAME_MACHINE}-pc-minix - exit ;; - aarch64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - aarch64_be:Linux:*:*) - UNAME_MACHINE=aarch64_be - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - 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=gnulibc1 ; fi - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - arc:Linux:*:* | arceb:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${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-${LIBC} - else - if echo __ARM_PCS_VFP | $CC_FOR_BUILD -E - 2>/dev/null \ - | grep -q __ARM_PCS_VFP - then - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabi - else - echo ${UNAME_MACHINE}-unknown-linux-${LIBC}eabihf - fi - fi - exit ;; - avr32*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - cris:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; - crisv32:Linux:*:*) - echo ${UNAME_MACHINE}-axis-linux-${LIBC} - exit ;; - e2k:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - frv:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - hexagon:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - i*86:Linux:*:*) - echo ${UNAME_MACHINE}-pc-linux-${LIBC} - exit ;; - ia64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - k1om:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m32r*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - m68*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - 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-${LIBC}"; exit; } - ;; - mips64el:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - openrisc*:Linux:*:*) - echo or1k-unknown-linux-${LIBC} - exit ;; - or32:Linux:*:* | or1k*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - padre:Linux:*:*) - echo sparc-unknown-linux-${LIBC} - exit ;; - parisc64:Linux:*:* | hppa64:Linux:*:*) - echo hppa64-unknown-linux-${LIBC} - 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-${LIBC} ;; - PA8*) echo hppa2.0-unknown-linux-${LIBC} ;; - *) echo hppa-unknown-linux-${LIBC} ;; - esac - exit ;; - ppc64:Linux:*:*) - echo powerpc64-unknown-linux-${LIBC} - exit ;; - ppc:Linux:*:*) - echo powerpc-unknown-linux-${LIBC} - exit ;; - ppc64le:Linux:*:*) - echo powerpc64le-unknown-linux-${LIBC} - exit ;; - ppcle:Linux:*:*) - echo powerpcle-unknown-linux-${LIBC} - exit ;; - riscv32:Linux:*:* | riscv64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - s390:Linux:*:* | s390x:Linux:*:*) - echo ${UNAME_MACHINE}-ibm-linux-${LIBC} - exit ;; - sh64*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sh*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - sparc:Linux:*:* | sparc64:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - tile*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - exit ;; - vax:Linux:*:*) - echo ${UNAME_MACHINE}-dec-linux-${LIBC} - exit ;; - x86_64:Linux:*:*) - echo ${UNAME_MACHINE}-pc-linux-${LIBC} - exit ;; - xtensa*:Linux:*:*) - echo ${UNAME_MACHINE}-unknown-linux-${LIBC} - 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 configure 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 ;; - x86_64:Haiku:*:*) - echo x86_64-unknown-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 ;; - SX-ACE:SUPER-UX:*:*) - echo sxace-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 - eval $set_cc_for_build - if test "$UNAME_PROCESSOR" = unknown ; then - UNAME_PROCESSOR=powerpc - fi - if test `echo "$UNAME_RELEASE" | sed -e 's/\..*//'` -le 10 ; then - 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 - case $UNAME_PROCESSOR in - i386) UNAME_PROCESSOR=x86_64 ;; - powerpc) UNAME_PROCESSOR=powerpc64 ;; - esac - fi - fi - elif test "$UNAME_PROCESSOR" = i386 ; then - # Avoid executing cc on OS X 10.9, as it ships with a stub - # that puts up a graphical alert prompting to install - # developer tools. Any system running Mac OS X 10.7 or - # later (Darwin 11 and later) is required to have a 64-bit - # processor. This is not true of the ARM version of Darwin - # that Apple uses in portable devices. - UNAME_PROCESSOR=x86_64 - fi - 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 ;; - NEO-*:NONSTOP_KERNEL:*:*) - echo neo-tandem-nsk${UNAME_RELEASE} - exit ;; - NSE-*:NONSTOP_KERNEL:*:*) - echo nse-tandem-nsk${UNAME_RELEASE} - exit ;; - NSR-*:NONSTOP_KERNEL:*:*) - echo nsr-tandem-nsk${UNAME_RELEASE} - exit ;; - NSX-*:NONSTOP_KERNEL:*:*) - echo nsx-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 ;; - x86_64:VMkernel:*:*) - echo ${UNAME_MACHINE}-unknown-esx - exit ;; - amd64:Isilon\ OneFS:*:*) - echo x86_64-unknown-onefs - exit ;; -esac - -cat >&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.25/ext/ffi_c/libffi/config.sub b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/config.sub deleted file mode 100644 index 40ea5df..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/config.sub +++ /dev/null @@ -1,1836 +0,0 @@ -#! /bin/sh -# Configuration validation subroutine script. -# Copyright 1992-2017 Free Software Foundation, Inc. - -timestamp='2017-04-02' - -# 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 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 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 Exception is an additional permission under section 7 -# of the GNU General Public License, version 3 ("GPLv3"). - - -# Please send patches to . -# -# 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 - -# 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 or 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 1992-2017 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-android* | linux-dietlibc | linux-newlib* | \ - linux-musl* | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | kfreebsd*-gnu* | \ - knetbsd*-gnu* | netbsd*-gnu* | netbsd*-eabi* | \ - kopensolaris*-gnu* | cloudabi*-eabi* | \ - storm-chaos* | os2-emx* | rtmk-nova*) - os=-$maybe_os - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` - ;; - android-linux) - os=-linux-android - basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'`-unknown - ;; - *) - 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*178) - os=-lynxos178 - ;; - -lynx*5) - os=-lynxos5 - ;; - -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 \ - | aarch64 | aarch64_be \ - | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ - | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ - | am33_2.0 \ - | arc | arceb \ - | arm | arm[bl]e | arme[lb] | armv[2-8] | armv[3-8][lb] | armv7[arm] \ - | avr | avr32 \ - | ba \ - | be32 | be64 \ - | bfin \ - | c4x | c8051 | clipper \ - | d10v | d30v | dlx | dsp16xx \ - | e2k | epiphany \ - | fido | fr30 | frv | ft32 \ - | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ - | hexagon \ - | i370 | i860 | i960 | ia16 | ia64 \ - | ip2k | iq2000 \ - | k1om \ - | le32 | le64 \ - | lm32 \ - | m32c | m32r | m32rle | m68000 | m68k | m88k \ - | maxq | mb | microblaze | microblazeel | 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 \ - | mipsisa32r6 | mipsisa32r6el \ - | mipsisa64 | mipsisa64el \ - | mipsisa64r2 | mipsisa64r2el \ - | mipsisa64r6 | mipsisa64r6el \ - | mipsisa64sb1 | mipsisa64sb1el \ - | mipsisa64sr71k | mipsisa64sr71kel \ - | mipsr5900 | mipsr5900el \ - | mipstx39 | mipstx39el \ - | mn10200 | mn10300 \ - | moxie \ - | mt \ - | msp430 \ - | nds32 | nds32le | nds32be \ - | nios | nios2 | nios2eb | nios2el \ - | ns16k | ns32k \ - | open8 | or1k | or1knd | or32 \ - | pdp10 | pdp11 | pj | pjl \ - | powerpc | powerpc64 | powerpc64le | powerpcle \ - | pru \ - | pyramid \ - | riscv32 | riscv64 \ - | rl78 | rx \ - | score \ - | sh | sh[1234] | sh[24]a | sh[24]aeb | sh[23]e | sh[234]eb | sheb | shbe | shle | sh[1234]le | sh3ele \ - | sh64 | sh64le \ - | sparc | sparc64 | sparc64b | sparc64v | sparc86x | sparclet | sparclite \ - | sparcv8 | sparcv9 | sparcv9b | sparcv9v \ - | spu \ - | tahoe | tic4x | tic54x | tic55x | tic6x | tic80 | tron \ - | ubicom32 \ - | v850 | v850e | v850e1 | v850e2 | v850es | v850e2v3 \ - | visium \ - | wasm32 \ - | we32k \ - | x86 | xc16x | xstormy16 | xtensa \ - | z8k | z80) - basic_machine=$basic_machine-unknown - ;; - c54x) - basic_machine=tic54x-unknown - ;; - c55x) - basic_machine=tic55x-unknown - ;; - c6x) - basic_machine=tic6x-unknown - ;; - leon|leon[3-9]) - basic_machine=sparc-$basic_machine - ;; - m6811 | m68hc11 | m6812 | m68hc12 | m68hcs12x | nvptx | picochip) - basic_machine=$basic_machine-unknown - os=-none - ;; - m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) - ;; - ms1) - basic_machine=mt-unknown - ;; - - strongarm | thumb | xscale) - basic_machine=arm-unknown - ;; - xgate) - basic_machine=$basic_machine-unknown - os=-none - ;; - xscaleeb) - basic_machine=armeb-unknown - ;; - - xscaleel) - basic_machine=armel-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-* \ - | aarch64-* | aarch64_be-* \ - | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ - | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ - | alphapca5[67]-* | alpha64pca5[67]-* | arc-* | arceb-* \ - | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ - | avr-* | avr32-* \ - | ba-* \ - | be32-* | be64-* \ - | bfin-* | bs2000-* \ - | c[123]* | c30-* | [cjt]90-* | c4x-* \ - | c8051-* | clipper-* | craynv-* | cydra-* \ - | d10v-* | d30v-* | dlx-* \ - | e2k-* | elxsi-* \ - | f30[01]-* | f700-* | fido-* | fr30-* | frv-* | fx80-* \ - | h8300-* | h8500-* \ - | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ - | hexagon-* \ - | i*86-* | i860-* | i960-* | ia16-* | ia64-* \ - | ip2k-* | iq2000-* \ - | k1om-* \ - | le32-* | le64-* \ - | lm32-* \ - | m32c-* | m32r-* | m32rle-* \ - | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ - | m88110-* | m88k-* | maxq-* | mcore-* | metag-* \ - | microblaze-* | microblazeel-* \ - | 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-* \ - | mipsisa32r6-* | mipsisa32r6el-* \ - | mipsisa64-* | mipsisa64el-* \ - | mipsisa64r2-* | mipsisa64r2el-* \ - | mipsisa64r6-* | mipsisa64r6el-* \ - | mipsisa64sb1-* | mipsisa64sb1el-* \ - | mipsisa64sr71k-* | mipsisa64sr71kel-* \ - | mipsr5900-* | mipsr5900el-* \ - | mipstx39-* | mipstx39el-* \ - | mmix-* \ - | mt-* \ - | msp430-* \ - | nds32-* | nds32le-* | nds32be-* \ - | nios-* | nios2-* | nios2eb-* | nios2el-* \ - | none-* | np1-* | ns16k-* | ns32k-* \ - | open8-* \ - | or1k*-* \ - | orion-* \ - | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ - | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* \ - | pru-* \ - | pyramid-* \ - | riscv32-* | riscv64-* \ - | rl78-* | 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-* | sv1-* | sx*-* \ - | tahoe-* \ - | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ - | tile*-* \ - | tron-* \ - | ubicom32-* \ - | v850-* | v850e-* | v850e1-* | v850es-* | v850e2-* | v850e2v3-* \ - | vax-* \ - | visium-* \ - | wasm32-* \ - | we32k-* \ - | x86-* | x86_64-* | xc16x-* | xps100-* \ - | 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 - ;; - asmjs) - basic_machine=asmjs-unknown - ;; - 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 - ;; - c54x-*) - basic_machine=tic54x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c55x-*) - basic_machine=tic55x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - c6x-*) - basic_machine=tic6x-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - 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 | 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 - ;; - e500v[12]) - basic_machine=powerpc-unknown - os=$os"spe" - ;; - e500v[12]-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - os=$os"spe" - ;; - 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*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 - ;; - leon-*|leon[3-9]-*) - basic_machine=sparc-`echo $basic_machine | sed 's/-.*//'` - ;; - 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 - ;; - mingw64) - basic_machine=x86_64-pc - os=-mingw64 - ;; - mingw32) - basic_machine=i686-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 - ;; - moxiebox) - basic_machine=moxie-unknown - os=-moxiebox - ;; - msdos) - basic_machine=i386-pc - os=-msdos - ;; - ms1-*) - basic_machine=`echo $basic_machine | sed -e 's/ms1-/mt-/'` - ;; - msys) - basic_machine=i686-pc - os=-msys - ;; - mvs) - basic_machine=i370-ibm - os=-mvs - ;; - nacl) - basic_machine=le32-unknown - os=-nacl - ;; - 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 - ;; - neo-tandem) - basic_machine=neo-tandem - ;; - nse-tandem) - basic_machine=nse-tandem - ;; - nsr-tandem) - basic_machine=nsr-tandem - ;; - nsx-tandem) - basic_machine=nsx-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 | ppcbe) basic_machine=powerpc-unknown - ;; - ppc-* | ppcbe-*) - basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - ppcle | powerpclittle) - 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) - 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 | rdos64) - basic_machine=x86_64-pc - os=-rdos - ;; - rdos32) - 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 - ;; - strongarm-* | thumb-*) - basic_machine=arm-`echo $basic_machine | sed 's/^[^-]*-//'` - ;; - 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 - ;; - tile*) - basic_machine=$basic_machine-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 - ;; - wasm32) - basic_machine=wasm32-unknown - ;; - 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 - ;; - xscale-* | xscalee[bl]-*) - basic_machine=`echo $basic_machine | sed 's/^xscale/arm/'` - ;; - 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* | -plan9* \ - | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ - | -aos* | -aros* | -cloudabi* | -sortix* \ - | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ - | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ - | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* \ - | -bitrig* | -openbsd* | -solidbsd* | -libertybsd* \ - | -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* | -glidix* \ - | -cygwin* | -msys* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ - | -midipix* | -mingw32* | -mingw64* | -linux-gnu* | -linux-android* \ - | -linux-newlib* | -linux-musl* | -linux-uclibc* \ - | -uxpv* | -beos* | -mpeix* | -udk* | -moxiebox* \ - | -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* \ - | -onefs* | -tirtos* | -phoenix* | -fuchsia* | -redox*) - # 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 - ;; - -zvmoe) - os=-zvmoe - ;; - -dicos*) - os=-dicos - ;; - -nacl*) - ;; - -ios) - ;; - -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 - ;; - c8051-*) - os=-elf - ;; - hexagon-*) - os=-elf - ;; - tic54x-*) - os=-coff - ;; - tic55x-*) - os=-coff - ;; - tic6x-*) - 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 - ;; - 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 - ;; - pru-*) - os=-elf - ;; - *-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.25/ext/ffi_c/libffi/configure.ac b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure.ac deleted file mode 100644 index aec2f55..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure.ac +++ /dev/null @@ -1,390 +0,0 @@ -dnl Process this with autoconf to create configure - -AC_PREREQ(2.68) - -AC_INIT([libffi], [3.3-rc0], [http://github.com/libffi/libffi/issues]) -AC_CONFIG_HEADERS([fficonfig.h]) - -AC_CANONICAL_SYSTEM -target_alias=${target_alias-$host_alias} - -case "${host}" in - frv*-elf) - LDFLAGS=`echo $LDFLAGS | sed "s/\-B[^ ]*libgloss\/frv\///"`\ -B`pwd`/../libgloss/frv/ - ;; -esac - -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 -AC_PROG_CXX -CFLAGS=$save_CFLAGS -m4_undefine([_AC_ARG_VAR_PRECIOUS]) -m4_rename_force([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]) - -# Test for 64-bit build. -AC_CHECK_SIZEOF([size_t]) - -AX_COMPILER_VENDOR -AX_CC_MAXOPT -# The AX_CFLAGS_WARN_ALL macro doesn't currently work for sunpro -# compiler. -if test "$ax_cv_c_compiler_vendor" != "sun"; then - AX_CFLAGS_WARN_ALL -fi - -if test "x$GCC" = "xyes"; then - CFLAGS="$CFLAGS -fexceptions" -fi - -cat > local.exp < conftest.s - if $CC $CFLAGS -c conftest.s > /dev/null 2>&1; 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 - ;; - - S390) - AC_CACHE_CHECK([compiler uses zarch features], - libffi_cv_as_s390_zarch, [ - libffi_cv_as_s390_zarch=no - echo 'void foo(void) { bar(); bar(); }' > conftest.c - if $CC $CFLAGS -S conftest.c > /dev/null 2>&1; then - if grep -q brasl conftest.s; then - libffi_cv_as_s390_zarch=yes - fi - fi - ]) - if test "x$libffi_cv_as_s390_zarch" = xyes; then - AC_DEFINE(HAVE_AS_S390_ZARCH, 1, - [Define if the compiler uses zarch features.]) - fi - ;; -esac - -# On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. -AC_ARG_ENABLE(pax_emutramp, - [ --enable-pax_emutramp enable pax emulated trampolines, for we can't use PROT_EXEC], - if test "$enable_pax_emutramp" = "yes"; then - AC_DEFINE(FFI_MMAP_EXEC_EMUTRAMP_PAX, 1, - [Define this if you want to enable pax emulated trampolines]) - fi) - -LT_SYS_SYMBOL_USCORE -if test "x$sys_symbol_underscore" = xyes; then - AC_DEFINE(SYMBOL_UNDERSCORE, 1, [Define if symbols are underscored.]) -fi - -FFI_EXEC_TRAMPOLINE_TABLE=0 -case "$target" in - *arm*-apple-* | aarch64-apple-*) - 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-* | *-*-freebsd* | *-*-kfreebsd* | *-*-openbsd* | *-pc-solaris* | *-linux-android*) - 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([toolchain supports unwind section type], - libffi_cv_as_x86_64_unwind_section_type, [ - cat > conftest1.s << EOF -.text -.globl foo -foo: -jmp bar -.section .eh_frame,"a",@unwind -bar: -EOF - - cat > conftest2.c << EOF -extern void foo(); -int main(){foo();} -EOF - - libffi_cv_as_x86_64_unwind_section_type=no - # we ensure that we can compile _and_ link an assembly file containing an @unwind section - # since the compiler can support it and not the linker (ie old binutils) - if $CC -Wa,--fatal-warnings $CFLAGS -c conftest1.s > /dev/null 2>&1 && \ - $CC conftest2.c conftest1.o > /dev/null 2>&1 ; then - libffi_cv_as_x86_64_unwind_section_type=yes - 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 -c -fpic -fexceptions -o conftest.o conftest.c > /dev/null 2>&1; then - objdump -h conftest.o > conftest.dump 2>&1 - libffi_eh_frame_line=`grep -n eh_frame conftest.dump | cut -d: -f 1` - if test "x$libffi_eh_frame_line" != "x"; then - libffi_test_line=`expr $libffi_eh_frame_line + 1`p - sed -n $libffi_test_line conftest.dump > conftest.line - if grep READONLY conftest.line > /dev/null; then - libffi_cv_ro_eh_frame=yes - fi - 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 - -AC_ARG_ENABLE(docs, - AC_HELP_STRING([--disable-docs], - [Disable building of docs (default: no)]), - [enable_docs=no], - [enable_docs=yes]) -AM_CONDITIONAL(BUILD_DOCS, [test x$enable_docs = xyes]) - -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) - -changequote(<,>) -TARGET_OBJ= -for i in $SOURCES; do - TARGET_OBJ="${TARGET_OBJ} src/${TARGETDIR}/"`echo $i | sed 's/[cS]$/lo/'` -done -changequote([,]) -AC_SUBST(TARGET_OBJ) - -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 if you do not want support for aggregate types.]) - fi) -AM_CONDITIONAL(FFI_DEBUG, test "$enable_debug" = "yes") - -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 if 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) - -AC_ARG_ENABLE(multi-os-directory, -[ --disable-multi-os-directory - disable use of gcc --print-multi-os-directory to change the library installation directory]) - -# 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" = "xyes"; 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 - if test x"$enable_multi_os_directory" != x"no"; then - multi_os_directory=`$CC $CFLAGS -print-multi-os-directory` - case $multi_os_directory in - .) ;; # Avoid trailing /. - ../*) toolexeclibdir=$toolexeclibdir/$multi_os_directory ;; - esac - fi - AC_SUBST(toolexecdir) -else - toolexeclibdir='${libdir}' -fi -AC_SUBST(toolexeclibdir) - -# Check linker support. -LIBFFI_ENABLE_SYMVERS - -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_FILES(include/Makefile include/ffi.h Makefile testsuite/Makefile man/Makefile doc/Makefile libffi.pc) - -AC_OUTPUT - -# Copy this file instead of using AC_CONFIG_LINK in order to support -# compiling with MSVC, which won't understand cygwin style symlinks. -cp ${srcdir}/src/$TARGETDIR/ffitarget.h include/ffitarget.h diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure.host b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure.host deleted file mode 100644 index 7634c3a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/configure.host +++ /dev/null @@ -1,289 +0,0 @@ -# configure.host -# -# This shell script handles all host based configuration for libffi. -# - -# THIS TABLE IS SORTED. KEEP IT THAT WAY. -# Most of the time we can define all the variables all at once... -case "${host}" in - aarch64*-*-*) - TARGET=AARCH64; TARGETDIR=aarch64 - SOURCES="ffi.c sysv.S" - ;; - - alpha*-*-*) - TARGET=ALPHA; TARGETDIR=alpha; - # Support 128-bit long double, changeable via command-line switch. - HAVE_LONG_DOUBLE='defined(__LONG_DOUBLE_128__)' - SOURCES="ffi.c osf.S" - ;; - - arc*-*-*) - TARGET=ARC; TARGETDIR=arc - SOURCES="ffi.c arcompact.S" - ;; - - arm*-*-*) - TARGET=ARM; TARGETDIR=arm - SOURCES="ffi.c sysv.S" - ;; - - avr32*-*-*) - TARGET=AVR32; TARGETDIR=avr32 - SOURCES="ffi.c sysv.S" - ;; - - bfin*) - TARGET=BFIN; TARGETDIR=bfin - SOURCES="ffi.c sysv.S" - ;; - - cris-*-*) - TARGET=LIBFFI_CRIS; TARGETDIR=cris - SOURCES="ffi.c sysv.S" - ;; - - frv-*-*) - TARGET=FRV; TARGETDIR=frv - SOURCES="ffi.c eabi.S" - ;; - - hppa*-*-linux* | parisc*-*-linux* | hppa*-*-openbsd*) - TARGET=PA_LINUX; TARGETDIR=pa - SOURCES="ffi.c linux.S" - ;; - hppa*64-*-hpux*) - TARGET=PA64_HPUX; TARGETDIR=pa - ;; - hppa*-*-hpux*) - TARGET=PA_HPUX; TARGETDIR=pa - SOURCES="ffi.c hpux32.S" - ;; - - i?86-*-freebsd* | i?86-*-openbsd*) - TARGET=X86_FREEBSD; TARGETDIR=x86 - ;; - - i?86-*-cygwin* | i?86-*-mingw* | i?86-*-os2* | i?86-*-interix* \ - | x86_64-*-cygwin* | x86_64-*-mingw* | x86_64-*-win* ) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - TARGET=X86_WIN32 - else - TARGET=X86_WIN64 - fi - if test "${ax_cv_c_compiler_vendor}" = "microsoft"; then - MSVC=1 - if test $ac_cv_sizeof_size_t = 4; then - # libffi does not support microsoft tools for 32-bit windows - # hosts. Try porting src/x86/sysv.S to intel assembly - # format. - UNSUPPORTED=1 - fi - fi - # 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* | x86_64-*-darwin* | i?86-*-ios | x86_64-*-ios) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - TARGET=X86_DARWIN - else - TARGET=X86_64 - fi - ;; - - i?86-*-* | x86_64-*-* | amd64-*) - TARGETDIR=x86 - if test $ac_cv_sizeof_size_t = 4; then - case "$host" in - x86_64-*x32|x86_64-x32-*) - TARGET_X32=yes - TARGET=X86_64 - ;; - *) - echo 'int foo (void) { return __x86_64__; }' > conftest.c - if $CC $CFLAGS -Werror -S conftest.c -o conftest.s > /dev/null 2>&1; then - TARGET_X32=yes - TARGET=X86_64 - else - TARGET=X86; - fi - rm -f conftest.* - ;; - esac - else - TARGET=X86_64; - fi - ;; - - ia64*-*-*) - TARGET=IA64; TARGETDIR=ia64 - SOURCES="ffi.c unix.S" - ;; - - m32r*-*-*) - TARGET=M32R; TARGETDIR=m32r - SOURCES="ffi.c sysv.S" - ;; - - m68k-*-*) - TARGET=M68K; TARGETDIR=m68k - SOURCES="ffi.c sysv.S" - ;; - - m88k-*-*) - TARGET=M88K; TARGETDIR=m88k - SOURCES="ffi.c obsd.S" - ;; - - microblaze*-*-*) - TARGET=MICROBLAZE; TARGETDIR=microblaze - SOURCES="ffi.c sysv.S" - ;; - - moxie-*-*) - TARGET=MOXIE; TARGETDIR=moxie - SOURCES="ffi.c eabi.S" - ;; - - metag-*-*) - TARGET=METAG; TARGETDIR=metag - SOURCES="ffi.c sysv.S" - ;; - - 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 - ;; - - nios2*-linux*) - TARGET=NIOS2; TARGETDIR=nios2 - SOURCES="ffi.c sysv.S" - ;; - - or1k*-linux*) - TARGET=OR1K; TARGETDIR=or1k - SOURCES="ffi.c sysv.S" - ;; - - powerpc*-*-linux* | powerpc-*-sysv*) - TARGET=POWERPC; TARGETDIR=powerpc - HAVE_LONG_DOUBLE_VARIANT=1 - ;; - powerpc-*-amigaos*) - 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* | powerpc-*-netbsd*) - TARGET=POWERPC_FREEBSD; TARGETDIR=powerpc - HAVE_LONG_DOUBLE_VARIANT=1 - ;; - powerpc64-*-freebsd*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - powerpc*-*-rtems*) - TARGET=POWERPC; TARGETDIR=powerpc - ;; - - riscv*-*) - TARGET=RISCV; TARGETDIR=riscv - SOURCES="ffi.c sysv.S" - ;; - - s390-*-* | s390x-*-*) - TARGET=S390; TARGETDIR=s390 - SOURCES="ffi.c sysv.S" - ;; - - sh-*-* | sh[34]*-*-*) - TARGET=SH; TARGETDIR=sh - SOURCES="ffi.c sysv.S" - ;; - sh64-*-* | sh5*-*-*) - TARGET=SH64; TARGETDIR=sh64 - SOURCES="ffi.c sysv.S" - ;; - - sparc*-*-*) - TARGET=SPARC; TARGETDIR=sparc - SOURCES="ffi.c ffi64.c v8.S v9.S" - ;; - - tile*-*) - TARGET=TILE; TARGETDIR=tile - SOURCES="ffi.c tile.S" - ;; - - vax-*-*) - TARGET=VAX; TARGETDIR=vax - SOURCES="ffi.c elfbsd.S" - ;; - - xtensa*-*) - TARGET=XTENSA; TARGETDIR=xtensa - SOURCES="ffi.c sysv.S" - ;; -esac - -# ... but some of the cases above share configury. -case "${TARGET}" in - MIPS) - SOURCES="ffi.c o32.S n32.S" - ;; - POWERPC) - SOURCES="ffi.c ffi_sysv.c ffi_linux64.c sysv.S ppc_closure.S" - SOURCES="${SOURCES} linux64.S linux64_closure.S" - ;; - POWERPC_AIX) - SOURCES="ffi_darwin.c aix.S aix_closure.S" - ;; - POWERPC_DARWIN) - SOURCES="ffi_darwin.c darwin.S darwin_closure.S" - ;; - POWERPC_FREEBSD) - SOURCES="ffi.c ffi_sysv.c sysv.S ppc_closure.S" - ;; - X86 | X86_DARWIN | X86_FREEBSD | X86_WIN32) - SOURCES="ffi.c sysv.S" - ;; - X86_64) - if test x"$TARGET_X32" = xyes; then - SOURCES="ffi64.c unix64.S" - else - SOURCES="ffi64.c unix64.S ffiw64.c win64.S" - fi - ;; - X86_WIN64) - if test "$MSVC" = 1; then - SOURCES="ffiw64.c win64_intel.S" - else - SOURCES="ffiw64.c win64.S" - fi - ;; -esac - -# If we failed to configure SOURCES, we can't do anything. -if test -z "${SOURCES}"; then - UNSUPPORTED=1 -fi diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/generate-darwin-source-and-headers.py b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/generate-darwin-source-and-headers.py deleted file mode 100755 index f7fc414..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/generate-darwin-source-and-headers.py +++ /dev/null @@ -1,203 +0,0 @@ -#!/usr/bin/env python -import subprocess -import os -import errno -import collections -import glob -import argparse - -class Platform(object): - pass - -class simulator_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphonesimulator' - arch = 'i386' - triple = 'i386-apple-darwin11' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __i386__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - -class simulator64_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphonesimulator' - arch = 'x86_64' - triple = 'x86_64-apple-darwin13' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __x86_64__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h'] - - -class device_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphoneos' - arch = 'armv7' - triple = 'arm-apple-darwin11' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __arm__\n\n" - suffix = "\n\n#endif" - src_dir = 'arm' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - -class device64_platform(Platform): - directory = 'darwin_ios' - sdk = 'iphoneos' - arch = 'arm64' - triple = 'aarch64-apple-darwin13' - version_min = '-miphoneos-version-min=7.0' - - prefix = "#ifdef __arm64__\n\n" - suffix = "\n\n#endif" - src_dir = 'aarch64' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - -class desktop32_platform(Platform): - directory = 'darwin_osx' - sdk = 'macosx' - arch = 'i386' - triple = 'i386-apple-darwin10' - version_min = '-mmacosx-version-min=10.6' - src_dir = 'x86' - src_files = ['sysv.S', 'ffi.c', 'internal.h'] - - prefix = "#ifdef __i386__\n\n" - suffix = "\n\n#endif" - - -class desktop64_platform(Platform): - directory = 'darwin_osx' - sdk = 'macosx' - arch = 'x86_64' - triple = 'x86_64-apple-darwin10' - version_min = '-mmacosx-version-min=10.6' - - prefix = "#ifdef __x86_64__\n\n" - suffix = "\n\n#endif" - src_dir = 'x86' - src_files = ['unix64.S', 'ffi64.c', 'ffiw64.c', 'win64.S', 'internal64.h', 'asmnames.h'] - - -def mkdir_p(path): - try: - os.makedirs(path) - except OSError as exc: # Python >2.5 - if exc.errno != errno.EEXIST: - raise - - -def move_file(src_dir, dst_dir, filename, file_suffix=None, prefix='', suffix=''): - mkdir_p(dst_dir) - out_filename = filename - - if file_suffix: - if filename in ['internal64.h', 'asmnames.h', 'internal.h']: - out_filename = filename - else: - split_name = os.path.splitext(filename) - out_filename = "%s_%s%s" % (split_name[0], file_suffix, split_name[1]) - - with open(os.path.join(src_dir, filename)) as in_file: - with open(os.path.join(dst_dir, out_filename), 'w') as out_file: - if prefix: - out_file.write(prefix) - - out_file.write(in_file.read()) - - if suffix: - out_file.write(suffix) - - -def list_files(src_dir, pattern=None, filelist=None): - if pattern: filelist = glob.iglob(os.path.join(src_dir, pattern)) - for file in filelist: - yield os.path.basename(file) - - -def copy_files(src_dir, dst_dir, pattern=None, filelist=None, file_suffix=None, prefix=None, suffix=None): - for filename in list_files(src_dir, pattern=pattern, filelist=filelist): - move_file(src_dir, dst_dir, filename, file_suffix=file_suffix, prefix=prefix, suffix=suffix) - - -def copy_src_platform_files(platform): - src_dir = os.path.join('src', platform.src_dir) - dst_dir = os.path.join(platform.directory, 'src', platform.src_dir) - copy_files(src_dir, dst_dir, filelist=platform.src_files, file_suffix=platform.arch, prefix=platform.prefix, suffix=platform.suffix) - - -def build_target(platform, platform_headers): - def xcrun_cmd(cmd): - return 'xcrun -sdk %s %s -arch %s' % (platform.sdk, cmd, platform.arch) - - tag='%s-%s' % (platform.sdk, platform.arch) - build_dir = 'build_%s' % tag - mkdir_p(build_dir) - env = dict(CC=xcrun_cmd('clang'), - LD=xcrun_cmd('ld'), - CFLAGS='%s' % (platform.version_min)) - working_dir = os.getcwd() - try: - os.chdir(build_dir) - subprocess.check_call(['../configure', '-host', platform.triple], env=env) - finally: - os.chdir(working_dir) - - for src_dir in [build_dir, os.path.join(build_dir, 'include')]: - copy_files(src_dir, - os.path.join(platform.directory, 'include'), - pattern='*.h', - file_suffix=platform.arch, - prefix=platform.prefix, - suffix=platform.suffix) - - for filename in list_files(src_dir, pattern='*.h'): - platform_headers[filename].add((platform.prefix, platform.arch, platform.suffix)) - - -def generate_source_and_headers(generate_osx=True, generate_ios=True): - copy_files('src', 'darwin_common/src', pattern='*.c') - copy_files('include', 'darwin_common/include', pattern='*.h') - - if generate_ios: - copy_src_platform_files(simulator_platform) - copy_src_platform_files(simulator64_platform) - copy_src_platform_files(device_platform) - copy_src_platform_files(device64_platform) - if generate_osx: - copy_src_platform_files(desktop32_platform) - copy_src_platform_files(desktop64_platform) - - platform_headers = collections.defaultdict(set) - - if generate_ios: - build_target(simulator_platform, platform_headers) - build_target(simulator64_platform, platform_headers) - build_target(device_platform, platform_headers) - build_target(device64_platform, platform_headers) - if generate_osx: - build_target(desktop32_platform, platform_headers) - build_target(desktop64_platform, platform_headers) - - mkdir_p('darwin_common/include') - for header_name, tag_tuples in platform_headers.iteritems(): - basename, suffix = os.path.splitext(header_name) - with open(os.path.join('darwin_common/include', header_name), 'w') as header: - for tag_tuple in tag_tuples: - header.write('%s#include <%s_%s%s>\n%s\n' % (tag_tuple[0], basename, tag_tuple[1], suffix, tag_tuple[2])) - -if __name__ == '__main__': - parser = argparse.ArgumentParser() - parser.add_argument('--only-ios', action='store_true', default=False) - parser.add_argument('--only-osx', action='store_true', default=False) - args = parser.parse_args() - - generate_source_and_headers(generate_osx=not args.only_ios, generate_ios=not args.only_osx) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/Makefile.am deleted file mode 100644 index c59df9f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/Makefile.am +++ /dev/null @@ -1,9 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS=foreign - -DISTCLEANFILES=ffitarget.h -noinst_HEADERS=ffi_common.h ffi_cfi.h -EXTRA_DIST=ffi.h.in - -nodist_include_HEADERS = ffi.h ffitarget.h diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi.h.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi.h.in deleted file mode 100644 index 39cde46..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi.h.in +++ /dev/null @@ -1,511 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - libffi @VERSION@ - Copyright (c) 2011, 2014 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. - - ----------------------------------------------------------------------- */ - -/* ------------------------------------------------------------------- - Most of the API is documented in doc/libffi.texi. - - The raw API is designed to bypass some of the argument packing and - unpacking on architectures for which it can be avoided. Routines - are provided to emulate the raw API if the underlying platform - doesn't allow faster implementation. - - More details on the raw 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 - -#if defined(_MSC_VER) && !defined(__clang__) -#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; - -/* Need minimal decorations for DLLs to work on Windows. GCC has - autoimport and autoexport. Always mark externally visible symbols - as dllimport for MSVC clients, even if it means an extra indirection - when using the static version of the library. - Besides, as a workaround, they can define FFI_BUILDING if they - *know* they are going to link with the static library. */ -#if defined _MSC_VER -# if defined FFI_BUILDING_DLL /* Building libffi.DLL with msvcc.sh */ -# define FFI_API __declspec(dllexport) -# elif !defined FFI_BUILDING /* Importing libffi.DLL */ -# define FFI_API __declspec(dllimport) -# else /* Building/linking static library */ -# define FFI_API -# endif -#else -# define FFI_API -#endif - -/* The externally visible type declarations also need the MSVC DLL - decorations, or they will not be exported from the object file. */ -#if defined LIBFFI_HIDE_BASIC_TYPES -# define FFI_EXTERN FFI_API -#else -# define FFI_EXTERN extern FFI_API -#endif - -#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. */ -FFI_EXTERN ffi_type ffi_type_void; -FFI_EXTERN ffi_type ffi_type_uint8; -FFI_EXTERN ffi_type ffi_type_sint8; -FFI_EXTERN ffi_type ffi_type_uint16; -FFI_EXTERN ffi_type ffi_type_sint16; -FFI_EXTERN ffi_type ffi_type_uint32; -FFI_EXTERN ffi_type ffi_type_sint32; -FFI_EXTERN ffi_type ffi_type_uint64; -FFI_EXTERN ffi_type ffi_type_sint64; -FFI_EXTERN ffi_type ffi_type_float; -FFI_EXTERN ffi_type ffi_type_double; -FFI_EXTERN ffi_type ffi_type_pointer; - -#if @HAVE_LONG_DOUBLE@ -FFI_EXTERN ffi_type ffi_type_longdouble; -#else -#define ffi_type_longdouble ffi_type_double -#endif - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -FFI_EXTERN ffi_type ffi_type_complex_float; -FFI_EXTERN ffi_type ffi_type_complex_double; -#if @HAVE_LONG_DOUBLE@ -FFI_EXTERN ffi_type ffi_type_complex_longdouble; -#else -#define ffi_type_complex_longdouble ffi_type_complex_double -#endif -#endif -#endif /* LIBFFI_HIDE_BASIC_TYPES */ - -typedef enum { - FFI_OK = 0, - FFI_BAD_TYPEDEF, - FFI_BAD_ABI -} ffi_status; - -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 - - -FFI_API -void ffi_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_raw *avalue); - -FFI_API void ffi_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_raw *raw); -FFI_API void ffi_raw_to_ptrarray (ffi_cif *cif, ffi_raw *raw, void **args); -FFI_API 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. */ - -FFI_API -void ffi_java_raw_call (ffi_cif *cif, - void (*fn)(void), - void *rvalue, - ffi_java_raw *avalue); - -FFI_API -void ffi_java_ptrarray_to_raw (ffi_cif *cif, void **args, ffi_java_raw *raw); -FFI_API -void ffi_java_raw_to_ptrarray (ffi_cif *cif, ffi_java_raw *raw, void **args); -FFI_API -size_t ffi_java_raw_size (ffi_cif *cif); - -/* ---- Definitions for closures ----------------------------------------- */ - -#if FFI_CLOSURES - -#ifdef _MSC_VER -__declspec(align(8)) -#endif -typedef struct { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); - void *user_data; -} ffi_closure -#ifdef __GNUC__ - __attribute__((aligned (8))) -#endif - ; - -#ifndef __GNUC__ -# ifdef __sgi -# pragma pack 0 -# endif -#endif - -FFI_API void *ffi_closure_alloc (size_t size, void **code); -FFI_API void ffi_closure_free (void *); - -FFI_API ffi_status -ffi_prep_closure (ffi_closure*, - ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data) -#if defined(__GNUC__) && (((__GNUC__ * 100) + __GNUC_MINOR__) >= 405) - __attribute__((deprecated ("use ffi_prep_closure_loc instead"))) -#elif defined(__GNUC__) && __GNUC__ >= 3 - __attribute__((deprecated)) -#endif - ; - -FFI_API 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 { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - 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 { -#if @FFI_EXEC_TRAMPOLINE_TABLE@ - void *trampoline_table; - void *trampoline_table_entry; -#else - char tramp[FFI_TRAMPOLINE_SIZE]; -#endif - - 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 translation, 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_API ffi_status -ffi_prep_raw_closure (ffi_raw_closure*, - ffi_cif *cif, - void (*fun)(ffi_cif*,void*,ffi_raw*,void*), - void *user_data); - -FFI_API 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_API 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_API 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 */ - -#if FFI_GO_CLOSURES - -typedef struct { - void *tramp; - ffi_cif *cif; - void (*fun)(ffi_cif*,void*,void**,void*); -} ffi_go_closure; - -FFI_API ffi_status ffi_prep_go_closure (ffi_go_closure*, ffi_cif *, - void (*fun)(ffi_cif*,void*,void**,void*)); - -FFI_API void ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure); - -#endif /* FFI_GO_CLOSURES */ - -/* ---- Public interface definition -------------------------------------- */ - -FFI_API -ffi_status ffi_prep_cif(ffi_cif *cif, - ffi_abi abi, - unsigned int nargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -FFI_API -void ffi_call(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue); - -FFI_API -ffi_status ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, - size_t *offsets); - -/* 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 -#define FFI_TYPE_COMPLEX 15 - -/* This should always refer to the last type code (for sanity checks). */ -#define FFI_TYPE_LAST FFI_TYPE_COMPLEX - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_cfi.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_cfi.h deleted file mode 100644 index 244ce57..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_cfi.h +++ /dev/null @@ -1,55 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_cfi.h - Copyright (c) 2014 Red Hat, Inc. - - Conditionally assemble cfi directives. Only necessary for building libffi. - ----------------------------------------------------------------------- */ - -#ifndef FFI_CFI_H -#define FFI_CFI_H - -#ifdef HAVE_AS_CFI_PSEUDO_OP - -# define cfi_startproc .cfi_startproc -# define cfi_endproc .cfi_endproc -# define cfi_def_cfa(reg, off) .cfi_def_cfa reg, off -# define cfi_def_cfa_register(reg) .cfi_def_cfa_register reg -# define cfi_def_cfa_offset(off) .cfi_def_cfa_offset off -# define cfi_adjust_cfa_offset(off) .cfi_adjust_cfa_offset off -# define cfi_offset(reg, off) .cfi_offset reg, off -# define cfi_rel_offset(reg, off) .cfi_rel_offset reg, off -# define cfi_register(r1, r2) .cfi_register r1, r2 -# define cfi_return_column(reg) .cfi_return_column reg -# define cfi_restore(reg) .cfi_restore reg -# define cfi_same_value(reg) .cfi_same_value reg -# define cfi_undefined(reg) .cfi_undefined reg -# define cfi_remember_state .cfi_remember_state -# define cfi_restore_state .cfi_restore_state -# define cfi_window_save .cfi_window_save -# define cfi_personality(enc, exp) .cfi_personality enc, exp -# define cfi_lsda(enc, exp) .cfi_lsda enc, exp -# define cfi_escape(...) .cfi_escape __VA_ARGS__ - -#else - -# define cfi_startproc -# define cfi_endproc -# define cfi_def_cfa(reg, off) -# define cfi_def_cfa_register(reg) -# define cfi_def_cfa_offset(off) -# define cfi_adjust_cfa_offset(off) -# define cfi_offset(reg, off) -# define cfi_rel_offset(reg, off) -# define cfi_register(r1, r2) -# define cfi_return_column(reg) -# define cfi_restore(reg) -# define cfi_same_value(reg) -# define cfi_undefined(reg) -# define cfi_remember_state -# define cfi_restore_state -# define cfi_window_save -# define cfi_personality(enc, exp) -# define cfi_lsda(enc, exp) -# define cfi_escape(...) - -#endif /* HAVE_AS_CFI_PSEUDO_OP */ -#endif /* FFI_CFI_H */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_common.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_common.h deleted file mode 100644 index 7fb0a64..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/include/ffi_common.h +++ /dev/null @@ -1,149 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_common.h - Copyright (C) 2011, 2012, 2013 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__ -# if HAVE_ALLOCA_H -# include -# else - /* mingw64 defines this already in malloc.h. */ -# ifndef alloca -# define alloca __builtin_alloca -# endif -# 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 - -/* v cast to size_t and aligned up to a multiple of a */ -#define FFI_ALIGN(v, a) (((((size_t) (v))-1) | ((a)-1))+1) -/* v cast to size_t and aligned down to a multiple of a */ -#define ALIGN_DOWN(v, a) (((size_t) (v)) & -a) - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif); -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, unsigned int ntotalargs); - - -#if HAVE_LONG_DOUBLE_VARIANT -/* Used to adjust size/alignment of ffi types. */ -void ffi_prep_types (ffi_abi abi); -#endif - -/* Used internally, but overridden by some architectures */ -ffi_status ffi_prep_cif_core(ffi_cif *cif, - ffi_abi abi, - unsigned int isvariadic, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes); - -/* 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) || defined(__SUNPRO_C) -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)!=0,0) - -#ifdef __cplusplus -} -#endif - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.map.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.map.in deleted file mode 100644 index 5553ab0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.map.in +++ /dev/null @@ -1,80 +0,0 @@ -#define LIBFFI_ASM -#define LIBFFI_H -#include -#include - -/* These version numbers correspond to the libtool-version abi numbers, - not to the libffi release numbers. */ - -LIBFFI_BASE_7.0 { - global: - /* Exported data variables. */ - ffi_type_void; - ffi_type_uint8; - ffi_type_sint8; - ffi_type_uint16; - ffi_type_sint16; - ffi_type_uint32; - ffi_type_sint32; - ffi_type_uint64; - ffi_type_sint64; - ffi_type_float; - ffi_type_double; - ffi_type_longdouble; - ffi_type_pointer; - - /* Exported functions. */ - ffi_call; - ffi_prep_cif; - ffi_prep_cif_var; - - ffi_raw_call; - ffi_ptrarray_to_raw; - ffi_raw_to_ptrarray; - ffi_raw_size; - - ffi_java_raw_call; - ffi_java_ptrarray_to_raw; - ffi_java_raw_to_ptrarray; - ffi_java_raw_size; - - local: - *; -}; - -LIBFFI_BASE_7.1 { - global: - ffi_get_struct_offsets; -} LIBFFI_BASE_7.0; - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -LIBFFI_COMPLEX_7.0 { - global: - /* Exported data variables. */ - ffi_type_complex_float; - ffi_type_complex_double; - ffi_type_complex_longdouble; -} LIBFFI_BASE_7.0; -#endif - -#if FFI_CLOSURES -LIBFFI_CLOSURE_7.0 { - global: - ffi_closure_alloc; - ffi_closure_free; - ffi_prep_closure; - ffi_prep_closure_loc; - ffi_prep_raw_closure; - ffi_prep_raw_closure_loc; - ffi_prep_java_raw_closure; - ffi_prep_java_raw_closure_loc; -} LIBFFI_BASE_7.0; -#endif - -#if FFI_GO_CLOSURES -LIBFFI_GO_CLOSURE_7.0 { - global: - ffi_call_go; - ffi_prep_go_closure; -} LIBFFI_CLOSURE_7.0; -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.pc.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.pc.in deleted file mode 100644 index 6fad83b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.pc.in +++ /dev/null @@ -1,11 +0,0 @@ -prefix=@prefix@ -exec_prefix=@exec_prefix@ -libdir=@libdir@ -toolexeclibdir=@toolexeclibdir@ -includedir=@includedir@ - -Name: @PACKAGE_NAME@ -Description: Library supporting Foreign Function Interfaces -Version: @PACKAGE_VERSION@ -Libs: -L${toolexeclibdir} -lffi -Cflags: -I${includedir} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj deleted file mode 100644 index 9a107b4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libffi.xcodeproj/project.pbxproj +++ /dev/null @@ -1,1043 +0,0 @@ -// !$*UTF8*$! -{ - archiveVersion = 1; - classes = { - }; - objectVersion = 46; - objects = { - -/* Begin PBXBuildFile section */ - 43B5D3F81D35473200D1E1FD /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */; }; - 43B5D3FA1D3547CE00D1E1FD /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */; }; - 43E9A5C71D352C1500926A8F /* sysv_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C51D352C1500926A8F /* sysv_i386.S */; }; - 43E9A5C81D352C1500926A8F /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */; }; - DBFA714A187F1D8600A76262 /* ffi.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA713F187F1D8600A76262 /* ffi_common.h */; }; - DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7140187F1D8600A76262 /* fficonfig.h */; }; - DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - DBFA714E187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - DBFA714F187F1D8600A76262 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - DBFA7158187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - DBFA7159187F1D8600A76262 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - DBFA715A187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - DBFA715B187F1D8600A76262 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; - DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; - DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; - DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; - DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; - DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7176187F1D9B00A76262 /* ffi_i386.c */; }; - DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7182187F1DA100A76262 /* ffi_i386.h */; }; - DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; - DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7184187F1DA100A76262 /* fficonfig_i386.h */; }; - DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */; }; - DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7186187F1DA100A76262 /* ffitarget_i386.h */; }; - DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; - DBFA7194187F1DA100A76262 /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* unix64_x86_64.S */; }; - DBFA7195187F1DA100A76262 /* sysv_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718B187F1DA100A76262 /* sysv_i386.S */; }; - DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; - DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718D187F1DA100A76262 /* ffi_i386.c */; }; - FDB52FB31F6144FA00AA92E6 /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */; }; - FDB52FB41F6144FA00AA92E6 /* sysv_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = 43E9A5C51D352C1500926A8F /* sysv_i386.S */; }; - FDB52FB51F6144FA00AA92E6 /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */; }; - FDB52FB61F6144FA00AA92E6 /* ffi_armv7.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716F187F1D9B00A76262 /* ffi_armv7.c */; }; - FDB52FB71F6144FA00AA92E6 /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - FDB52FB81F6144FA00AA92E6 /* sysv_armv7.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7170187F1D9B00A76262 /* sysv_armv7.S */; }; - FDB52FB91F6144FA00AA92E6 /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */; }; - FDB52FBA1F6144FA00AA92E6 /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - FDB52FBB1F6144FA00AA92E6 /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7176187F1D9B00A76262 /* ffi_i386.c */; }; - FDB52FBC1F6144FA00AA92E6 /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - FDB52FBD1F6144FA00AA92E6 /* sysv_arm64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716D187F1D9B00A76262 /* sysv_arm64.S */; }; - FDB52FBE1F6144FA00AA92E6 /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - FDB52FBF1F6144FA00AA92E6 /* ffi_arm64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA716C187F1D9B00A76262 /* ffi_arm64.c */; }; - FDB52FC01F6144FA00AA92E6 /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */; }; - FDB52FD01F614A8B00AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - FDB52FD11F614AA700AA92E6 /* ffi_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715E187F1D9B00A76262 /* ffi_arm64.h */; }; - FDB52FD21F614AAB00AA92E6 /* ffi_armv7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715F187F1D9B00A76262 /* ffi_armv7.h */; }; - FDB52FD31F614AB000AA92E6 /* ffi_i386.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7160187F1D9B00A76262 /* ffi_i386.h */; }; - FDB52FD41F614AB500AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */; }; - FDB52FD51F614AE200AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - FDB52FD61F614AEA00AA92E6 /* ffi_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA715E187F1D9B00A76262 /* ffi_arm64.h */; }; - FDB52FD71F614AED00AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */; }; - FDB52FD81F614B8700AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - FDB52FD91F614B8E00AA92E6 /* ffitarget_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */; }; - FDB52FDA1F614B9300AA92E6 /* ffitarget_armv7.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */; }; - FDB52FDB1F614B9700AA92E6 /* ffitarget_i386.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */; }; - FDB52FDD1F614BA900AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */; }; - FDB52FDE1F6155E300AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - FDB52FDF1F6155EA00AA92E6 /* ffitarget_arm64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */; }; - FDB52FE01F6155EF00AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */; }; - FDB52FE21F6156FA00AA92E6 /* ffi.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA713E187F1D8600A76262 /* ffi.h */; }; - FDB52FE31F61571A00AA92E6 /* ffi_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7183187F1DA100A76262 /* ffi_x86_64.h */; }; - FDB52FE41F61571D00AA92E6 /* ffitarget.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7141187F1D8600A76262 /* ffitarget.h */; }; - FDB52FE61F61573100AA92E6 /* ffitarget_x86_64.h in CopyFiles */ = {isa = PBXBuildFile; fileRef = DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */; }; - FDDB2F411F5D66E200EF414E /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */; }; - FDDB2F461F5D691E00EF414E /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F441F5D68C900EF414E /* win64_x86_64.S */; }; - FDDB2F4A1F5D846400EF414E /* ffi64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */; }; - FDDB2F4B1F5D846400EF414E /* sysv_i386.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718B187F1DA100A76262 /* sysv_i386.S */; }; - FDDB2F4C1F5D846400EF414E /* prep_cif.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7147187F1D8600A76262 /* prep_cif.c */; }; - FDDB2F4D1F5D846400EF414E /* ffi_i386.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718D187F1DA100A76262 /* ffi_i386.c */; }; - FDDB2F4E1F5D846400EF414E /* ffiw64_x86_64.c in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */; }; - FDDB2F4F1F5D846400EF414E /* types.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7149187F1D8600A76262 /* types.c */; }; - FDDB2F501F5D846400EF414E /* raw_api.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7148187F1D8600A76262 /* raw_api.c */; }; - FDDB2F511F5D846400EF414E /* closures.c in Sources */ = {isa = PBXBuildFile; fileRef = DBFA7143187F1D8600A76262 /* closures.c */; }; - FDDB2F521F5D846400EF414E /* unix64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = DBFA718A187F1DA100A76262 /* unix64_x86_64.S */; }; - FDDB2F531F5D846400EF414E /* win64_x86_64.S in Sources */ = {isa = PBXBuildFile; fileRef = FDDB2F441F5D68C900EF414E /* win64_x86_64.S */; }; -/* End PBXBuildFile section */ - -/* Begin PBXCopyFilesBuildPhase section */ - DB13B1641849DF1E0010F42D /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - FDB52FD01F614A8B00AA92E6 /* ffi.h in CopyFiles */, - FDB52FD11F614AA700AA92E6 /* ffi_arm64.h in CopyFiles */, - FDB52FD21F614AAB00AA92E6 /* ffi_armv7.h in CopyFiles */, - FDB52FD31F614AB000AA92E6 /* ffi_i386.h in CopyFiles */, - FDB52FD41F614AB500AA92E6 /* ffi_x86_64.h in CopyFiles */, - FDB52FD81F614B8700AA92E6 /* ffitarget.h in CopyFiles */, - FDB52FD91F614B8E00AA92E6 /* ffitarget_arm64.h in CopyFiles */, - FDB52FDA1F614B9300AA92E6 /* ffitarget_armv7.h in CopyFiles */, - FDB52FDB1F614B9700AA92E6 /* ffitarget_i386.h in CopyFiles */, - FDB52FDD1F614BA900AA92E6 /* ffitarget_x86_64.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDB52FC11F6144FA00AA92E6 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 12; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - FDB52FD51F614AE200AA92E6 /* ffi.h in CopyFiles */, - FDB52FD61F614AEA00AA92E6 /* ffi_arm64.h in CopyFiles */, - FDB52FD71F614AED00AA92E6 /* ffi_x86_64.h in CopyFiles */, - FDB52FDE1F6155E300AA92E6 /* ffitarget.h in CopyFiles */, - FDB52FDF1F6155EA00AA92E6 /* ffitarget_arm64.h in CopyFiles */, - FDB52FE01F6155EF00AA92E6 /* ffitarget_x86_64.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDB52FE11F6156E000AA92E6 /* CopyFiles */ = { - isa = PBXCopyFilesBuildPhase; - buildActionMask = 2147483647; - dstPath = "include/$(PRODUCT_NAME)"; - dstSubfolderSpec = 16; - files = ( - FDB52FE21F6156FA00AA92E6 /* ffi.h in CopyFiles */, - FDB52FE31F61571A00AA92E6 /* ffi_x86_64.h in CopyFiles */, - FDB52FE41F61571D00AA92E6 /* ffitarget.h in CopyFiles */, - FDB52FE61F61573100AA92E6 /* ffitarget_x86_64.h in CopyFiles */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXCopyFilesBuildPhase section */ - -/* Begin PBXFileReference section */ - 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffiw64_x86_64.c; sourceTree = ""; }; - 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = win64_x86_64.S; sourceTree = ""; }; - 43E9A5C51D352C1500926A8F /* sysv_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_i386.S; sourceTree = ""; }; - 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = unix64_x86_64.S; sourceTree = ""; }; - 43E9A5DA1D35373600926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - 43E9A5DB1D35374400926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - 43E9A5DC1D35375400926A8F /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - 43E9A5DD1D35375400926A8F /* internal64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal64.h; sourceTree = ""; }; - DB13B1661849DF1E0010F42D /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; - DB13B1911849DF510010F42D /* ffi.dylib */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = ffi.dylib; sourceTree = BUILT_PRODUCTS_DIR; }; - DBFA713E187F1D8600A76262 /* ffi.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi.h; sourceTree = ""; }; - DBFA713F187F1D8600A76262 /* ffi_common.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_common.h; sourceTree = ""; }; - DBFA7140187F1D8600A76262 /* fficonfig.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig.h; sourceTree = ""; }; - DBFA7141187F1D8600A76262 /* ffitarget.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget.h; sourceTree = ""; }; - DBFA7143187F1D8600A76262 /* closures.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = closures.c; sourceTree = ""; }; - DBFA7145187F1D8600A76262 /* dlmalloc.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = dlmalloc.c; sourceTree = ""; }; - DBFA7147187F1D8600A76262 /* prep_cif.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = prep_cif.c; sourceTree = ""; }; - DBFA7148187F1D8600A76262 /* raw_api.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = raw_api.c; sourceTree = ""; }; - DBFA7149187F1D8600A76262 /* types.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = types.c; sourceTree = ""; }; - DBFA715E187F1D9B00A76262 /* ffi_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_arm64.h; sourceTree = ""; }; - DBFA715F187F1D9B00A76262 /* ffi_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_armv7.h; sourceTree = ""; }; - DBFA7160187F1D9B00A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; - DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; - DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_arm64.h; sourceTree = ""; }; - DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_armv7.h; sourceTree = ""; }; - DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; - DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; - DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_arm64.h; sourceTree = ""; }; - DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_armv7.h; sourceTree = ""; }; - DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; - DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; - DBFA716C187F1D9B00A76262 /* ffi_arm64.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi_arm64.c; sourceTree = ""; }; - DBFA716D187F1D9B00A76262 /* sysv_arm64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_arm64.S; sourceTree = ""; }; - DBFA716F187F1D9B00A76262 /* ffi_armv7.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi_armv7.c; sourceTree = ""; }; - DBFA7170187F1D9B00A76262 /* sysv_armv7.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_armv7.S; sourceTree = ""; }; - DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; - DBFA7176187F1D9B00A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = ""; }; - DBFA7182187F1DA100A76262 /* ffi_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_i386.h; sourceTree = ""; }; - DBFA7183187F1DA100A76262 /* ffi_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffi_x86_64.h; sourceTree = ""; }; - DBFA7184187F1DA100A76262 /* fficonfig_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_i386.h; sourceTree = ""; }; - DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = fficonfig_x86_64.h; sourceTree = ""; }; - DBFA7186187F1DA100A76262 /* ffitarget_i386.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_i386.h; sourceTree = ""; }; - DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = ffitarget_x86_64.h; sourceTree = ""; }; - DBFA718A187F1DA100A76262 /* unix64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = unix64_x86_64.S; sourceTree = ""; }; - DBFA718B187F1DA100A76262 /* sysv_i386.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = sysv_i386.S; sourceTree = ""; }; - DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; indentWidth = 2; lastKnownFileType = sourcecode.c.c; path = ffi64_x86_64.c; sourceTree = ""; }; - DBFA718D187F1DA100A76262 /* ffi_i386.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffi_i386.c; sourceTree = ""; }; - FDB52FC51F6144FA00AA92E6 /* libffi.a */ = {isa = PBXFileReference; explicitFileType = archive.ar; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; - FDDB2F3E1F5D61BC00EF414E /* asmnames.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = asmnames.h; sourceTree = ""; }; - FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.c; path = ffiw64_x86_64.c; sourceTree = ""; }; - FDDB2F421F5D68C900EF414E /* internal64.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal64.h; sourceTree = ""; }; - FDDB2F431F5D68C900EF414E /* internal.h */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.c.h; path = internal.h; sourceTree = ""; }; - FDDB2F441F5D68C900EF414E /* win64_x86_64.S */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = sourcecode.asm; path = win64_x86_64.S; sourceTree = ""; }; - FDDB2F621F5D846400EF414E /* libffi.a */ = {isa = PBXFileReference; explicitFileType = "compiled.mach-o.dylib"; includeInIndex = 0; path = libffi.a; sourceTree = BUILT_PRODUCTS_DIR; }; -/* End PBXFileReference section */ - -/* Begin PBXGroup section */ - DB13B15B1849DEB70010F42D = { - isa = PBXGroup; - children = ( - DBFA713C187F1D8600A76262 /* darwin_common */, - DBFA715C187F1D9B00A76262 /* darwin_ios */, - DBFA7180187F1DA100A76262 /* darwin_osx */, - DB13B1671849DF1E0010F42D /* Products */, - ); - sourceTree = ""; - }; - DB13B1671849DF1E0010F42D /* Products */ = { - isa = PBXGroup; - children = ( - DB13B1661849DF1E0010F42D /* libffi.a */, - DB13B1911849DF510010F42D /* ffi.dylib */, - FDDB2F621F5D846400EF414E /* libffi.a */, - FDB52FC51F6144FA00AA92E6 /* libffi.a */, - ); - name = Products; - sourceTree = ""; - }; - DBFA713C187F1D8600A76262 /* darwin_common */ = { - isa = PBXGroup; - children = ( - DBFA713D187F1D8600A76262 /* include */, - DBFA7142187F1D8600A76262 /* src */, - ); - path = darwin_common; - sourceTree = ""; - }; - DBFA713D187F1D8600A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA713E187F1D8600A76262 /* ffi.h */, - DBFA713F187F1D8600A76262 /* ffi_common.h */, - DBFA7140187F1D8600A76262 /* fficonfig.h */, - DBFA7141187F1D8600A76262 /* ffitarget.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA7142187F1D8600A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA7143187F1D8600A76262 /* closures.c */, - DBFA7145187F1D8600A76262 /* dlmalloc.c */, - DBFA7147187F1D8600A76262 /* prep_cif.c */, - DBFA7148187F1D8600A76262 /* raw_api.c */, - DBFA7149187F1D8600A76262 /* types.c */, - ); - path = src; - sourceTree = ""; - }; - DBFA715C187F1D9B00A76262 /* darwin_ios */ = { - isa = PBXGroup; - children = ( - DBFA715D187F1D9B00A76262 /* include */, - DBFA716A187F1D9B00A76262 /* src */, - ); - path = darwin_ios; - sourceTree = ""; - }; - DBFA715D187F1D9B00A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA715E187F1D9B00A76262 /* ffi_arm64.h */, - DBFA715F187F1D9B00A76262 /* ffi_armv7.h */, - DBFA7160187F1D9B00A76262 /* ffi_i386.h */, - DBFA7161187F1D9B00A76262 /* ffi_x86_64.h */, - DBFA7162187F1D9B00A76262 /* fficonfig_arm64.h */, - DBFA7163187F1D9B00A76262 /* fficonfig_armv7.h */, - DBFA7164187F1D9B00A76262 /* fficonfig_i386.h */, - DBFA7165187F1D9B00A76262 /* fficonfig_x86_64.h */, - DBFA7166187F1D9B00A76262 /* ffitarget_arm64.h */, - DBFA7167187F1D9B00A76262 /* ffitarget_armv7.h */, - DBFA7168187F1D9B00A76262 /* ffitarget_i386.h */, - DBFA7169187F1D9B00A76262 /* ffitarget_x86_64.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA716A187F1D9B00A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA716B187F1D9B00A76262 /* aarch64 */, - DBFA716E187F1D9B00A76262 /* arm */, - DBFA7172187F1D9B00A76262 /* x86 */, - ); - path = src; - sourceTree = ""; - }; - DBFA716B187F1D9B00A76262 /* aarch64 */ = { - isa = PBXGroup; - children = ( - 43E9A5DA1D35373600926A8F /* internal.h */, - DBFA716C187F1D9B00A76262 /* ffi_arm64.c */, - DBFA716D187F1D9B00A76262 /* sysv_arm64.S */, - ); - path = aarch64; - sourceTree = ""; - }; - DBFA716E187F1D9B00A76262 /* arm */ = { - isa = PBXGroup; - children = ( - 43E9A5DB1D35374400926A8F /* internal.h */, - DBFA716F187F1D9B00A76262 /* ffi_armv7.c */, - DBFA7170187F1D9B00A76262 /* sysv_armv7.S */, - ); - path = arm; - sourceTree = ""; - }; - DBFA7172187F1D9B00A76262 /* x86 */ = { - isa = PBXGroup; - children = ( - 43E9A5DC1D35375400926A8F /* internal.h */, - 43E9A5DD1D35375400926A8F /* internal64.h */, - DBFA7175187F1D9B00A76262 /* ffi64_x86_64.c */, - 43B5D3F71D35473200D1E1FD /* ffiw64_x86_64.c */, - DBFA7176187F1D9B00A76262 /* ffi_i386.c */, - 43E9A5C51D352C1500926A8F /* sysv_i386.S */, - 43E9A5C61D352C1500926A8F /* unix64_x86_64.S */, - 43B5D3F91D3547CE00D1E1FD /* win64_x86_64.S */, - ); - path = x86; - sourceTree = ""; - }; - DBFA7180187F1DA100A76262 /* darwin_osx */ = { - isa = PBXGroup; - children = ( - DBFA7181187F1DA100A76262 /* include */, - DBFA7188187F1DA100A76262 /* src */, - ); - path = darwin_osx; - sourceTree = ""; - }; - DBFA7181187F1DA100A76262 /* include */ = { - isa = PBXGroup; - children = ( - DBFA7182187F1DA100A76262 /* ffi_i386.h */, - DBFA7183187F1DA100A76262 /* ffi_x86_64.h */, - DBFA7184187F1DA100A76262 /* fficonfig_i386.h */, - DBFA7185187F1DA100A76262 /* fficonfig_x86_64.h */, - DBFA7186187F1DA100A76262 /* ffitarget_i386.h */, - DBFA7187187F1DA100A76262 /* ffitarget_x86_64.h */, - ); - path = include; - sourceTree = ""; - }; - DBFA7188187F1DA100A76262 /* src */ = { - isa = PBXGroup; - children = ( - DBFA7189187F1DA100A76262 /* x86 */, - ); - path = src; - sourceTree = ""; - }; - DBFA7189187F1DA100A76262 /* x86 */ = { - isa = PBXGroup; - children = ( - FDDB2F431F5D68C900EF414E /* internal.h */, - FDDB2F421F5D68C900EF414E /* internal64.h */, - FDDB2F3E1F5D61BC00EF414E /* asmnames.h */, - DBFA718C187F1DA100A76262 /* ffi64_x86_64.c */, - FDDB2F3F1F5D666900EF414E /* ffiw64_x86_64.c */, - DBFA718D187F1DA100A76262 /* ffi_i386.c */, - DBFA718B187F1DA100A76262 /* sysv_i386.S */, - DBFA718A187F1DA100A76262 /* unix64_x86_64.S */, - FDDB2F441F5D68C900EF414E /* win64_x86_64.S */, - ); - path = x86; - sourceTree = ""; - }; -/* End PBXGroup section */ - -/* Begin PBXHeadersBuildPhase section */ - DB13B18F1849DF510010F42D /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - DBFA714C187F1D8600A76262 /* fficonfig.h in Headers */, - DBFA714D187F1D8600A76262 /* ffitarget.h in Headers */, - DBFA714A187F1D8600A76262 /* ffi.h in Headers */, - DBFA718F187F1DA100A76262 /* ffi_x86_64.h in Headers */, - DBFA7191187F1DA100A76262 /* fficonfig_x86_64.h in Headers */, - DBFA718E187F1DA100A76262 /* ffi_i386.h in Headers */, - DBFA7190187F1DA100A76262 /* fficonfig_i386.h in Headers */, - DBFA714B187F1D8600A76262 /* ffi_common.h in Headers */, - DBFA7193187F1DA100A76262 /* ffitarget_x86_64.h in Headers */, - DBFA7192187F1DA100A76262 /* ffitarget_i386.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXHeadersBuildPhase section */ - -/* Begin PBXNativeTarget section */ - DB13B1651849DF1E0010F42D /* libffi-iOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */; - buildPhases = ( - 43B5D3FB1D35480D00D1E1FD /* Run Script */, - DB13B1621849DF1E0010F42D /* Sources */, - DB13B1641849DF1E0010F42D /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-iOS"; - productName = ffi; - productReference = DB13B1661849DF1E0010F42D /* libffi.a */; - productType = "com.apple.product-type.library.static"; - }; - DB13B1901849DF510010F42D /* libffi-Mac */ = { - isa = PBXNativeTarget; - buildConfigurationList = DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */; - buildPhases = ( - DB13B3061849E0490010F42D /* ShellScript */, - DB13B18D1849DF510010F42D /* Sources */, - DB13B18F1849DF510010F42D /* Headers */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-Mac"; - productName = ffi; - productReference = DB13B1911849DF510010F42D /* ffi.dylib */; - productType = "com.apple.product-type.library.dynamic"; - }; - FDB52FB01F6144FA00AA92E6 /* libffi-tvOS */ = { - isa = PBXNativeTarget; - buildConfigurationList = FDB52FC21F6144FA00AA92E6 /* Build configuration list for PBXNativeTarget "libffi-tvOS" */; - buildPhases = ( - FDB52FB11F6144FA00AA92E6 /* Run Script */, - FDB52FB21F6144FA00AA92E6 /* Sources */, - FDB52FC11F6144FA00AA92E6 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-tvOS"; - productName = ffi; - productReference = FDB52FC51F6144FA00AA92E6 /* libffi.a */; - productType = "com.apple.product-type.library.static"; - }; - FDDB2F471F5D846400EF414E /* libffi-static-Mac */ = { - isa = PBXNativeTarget; - buildConfigurationList = FDDB2F5F1F5D846400EF414E /* Build configuration list for PBXNativeTarget "libffi-static-Mac" */; - buildPhases = ( - FDDB2F481F5D846400EF414E /* ShellScript */, - FDDB2F491F5D846400EF414E /* Sources */, - FDB52FE11F6156E000AA92E6 /* CopyFiles */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "libffi-static-Mac"; - productName = ffi; - productReference = FDDB2F621F5D846400EF414E /* libffi.a */; - productType = "com.apple.product-type.library.dynamic"; - }; -/* End PBXNativeTarget section */ - -/* Begin PBXProject section */ - DB13B15C1849DEB70010F42D /* Project object */ = { - isa = PBXProject; - attributes = { - LastUpgradeCheck = 0830; - }; - buildConfigurationList = DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */; - compatibilityVersion = "Xcode 3.2"; - developmentRegion = English; - hasScannedForEncodings = 0; - knownRegions = ( - en, - ); - mainGroup = DB13B15B1849DEB70010F42D; - productRefGroup = DB13B1671849DF1E0010F42D /* Products */; - projectDirPath = ""; - projectRoot = ""; - targets = ( - DB13B1651849DF1E0010F42D /* libffi-iOS */, - FDB52FB01F6144FA00AA92E6 /* libffi-tvOS */, - DB13B1901849DF510010F42D /* libffi-Mac */, - FDDB2F471F5D846400EF414E /* libffi-static-Mac */, - ); - }; -/* End PBXProject section */ - -/* Begin PBXShellScriptBuildPhase section */ - 43B5D3FB1D35480D00D1E1FD /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-ios\nfi"; - }; - DB13B3061849E0490010F42D /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-osx\nfi"; - }; - FDB52FB11F6144FA00AA92E6 /* Run Script */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - name = "Run Script"; - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-ios\nfi"; - }; - FDDB2F481F5D846400EF414E /* ShellScript */ = { - isa = PBXShellScriptBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - inputPaths = ( - ); - outputPaths = ( - ); - runOnlyForDeploymentPostprocessing = 0; - shellPath = /bin/sh; - shellScript = "if [ ! -f \"./compile\" ]\nthen\nautoreconf -i -f -v\nif [ -f \"../ltmain.sh\" ]\nthen\necho \"fixing ltmain.sh for some reason\"\nmv ../ltmain.sh ./\nautoreconf -i -f -v\nfi\n/usr/bin/python generate-darwin-source-and-headers.py --only-osx\nfi"; - }; -/* End PBXShellScriptBuildPhase section */ - -/* Begin PBXSourcesBuildPhase section */ - DB13B1621849DF1E0010F42D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 43E9A5C81D352C1500926A8F /* unix64_x86_64.S in Sources */, - 43E9A5C71D352C1500926A8F /* sysv_i386.S in Sources */, - DBFA717E187F1D9B00A76262 /* ffi64_x86_64.c in Sources */, - DBFA7179187F1D9B00A76262 /* ffi_armv7.c in Sources */, - DBFA714E187F1D8600A76262 /* closures.c in Sources */, - DBFA717A187F1D9B00A76262 /* sysv_armv7.S in Sources */, - 43B5D3F81D35473200D1E1FD /* ffiw64_x86_64.c in Sources */, - DBFA7156187F1D8600A76262 /* prep_cif.c in Sources */, - DBFA717F187F1D9B00A76262 /* ffi_i386.c in Sources */, - DBFA7158187F1D8600A76262 /* raw_api.c in Sources */, - DBFA7178187F1D9B00A76262 /* sysv_arm64.S in Sources */, - DBFA715A187F1D8600A76262 /* types.c in Sources */, - DBFA7177187F1D9B00A76262 /* ffi_arm64.c in Sources */, - 43B5D3FA1D3547CE00D1E1FD /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - DB13B18D1849DF510010F42D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - DBFA7196187F1DA100A76262 /* ffi64_x86_64.c in Sources */, - DBFA7195187F1DA100A76262 /* sysv_i386.S in Sources */, - DBFA7157187F1D8600A76262 /* prep_cif.c in Sources */, - DBFA7197187F1DA100A76262 /* ffi_i386.c in Sources */, - FDDB2F411F5D66E200EF414E /* ffiw64_x86_64.c in Sources */, - DBFA715B187F1D8600A76262 /* types.c in Sources */, - DBFA7159187F1D8600A76262 /* raw_api.c in Sources */, - DBFA714F187F1D8600A76262 /* closures.c in Sources */, - DBFA7194187F1DA100A76262 /* unix64_x86_64.S in Sources */, - FDDB2F461F5D691E00EF414E /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDB52FB21F6144FA00AA92E6 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - FDB52FB31F6144FA00AA92E6 /* unix64_x86_64.S in Sources */, - FDB52FB41F6144FA00AA92E6 /* sysv_i386.S in Sources */, - FDB52FB51F6144FA00AA92E6 /* ffi64_x86_64.c in Sources */, - FDB52FB61F6144FA00AA92E6 /* ffi_armv7.c in Sources */, - FDB52FB71F6144FA00AA92E6 /* closures.c in Sources */, - FDB52FB81F6144FA00AA92E6 /* sysv_armv7.S in Sources */, - FDB52FB91F6144FA00AA92E6 /* ffiw64_x86_64.c in Sources */, - FDB52FBA1F6144FA00AA92E6 /* prep_cif.c in Sources */, - FDB52FBB1F6144FA00AA92E6 /* ffi_i386.c in Sources */, - FDB52FBC1F6144FA00AA92E6 /* raw_api.c in Sources */, - FDB52FBD1F6144FA00AA92E6 /* sysv_arm64.S in Sources */, - FDB52FBE1F6144FA00AA92E6 /* types.c in Sources */, - FDB52FBF1F6144FA00AA92E6 /* ffi_arm64.c in Sources */, - FDB52FC01F6144FA00AA92E6 /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FDDB2F491F5D846400EF414E /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - FDDB2F4A1F5D846400EF414E /* ffi64_x86_64.c in Sources */, - FDDB2F4B1F5D846400EF414E /* sysv_i386.S in Sources */, - FDDB2F4C1F5D846400EF414E /* prep_cif.c in Sources */, - FDDB2F4D1F5D846400EF414E /* ffi_i386.c in Sources */, - FDDB2F4E1F5D846400EF414E /* ffiw64_x86_64.c in Sources */, - FDDB2F4F1F5D846400EF414E /* types.c in Sources */, - FDDB2F501F5D846400EF414E /* raw_api.c in Sources */, - FDDB2F511F5D846400EF414E /* closures.c in Sources */, - FDDB2F521F5D846400EF414E /* unix64_x86_64.S in Sources */, - FDDB2F531F5D846400EF414E /* win64_x86_64.S in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; -/* End PBXSourcesBuildPhase section */ - -/* Begin XCBuildConfiguration section */ - DB13B1601849DEB70010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - ENABLE_TESTABILITY = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_common/include, - ); - ONLY_ACTIVE_ARCH = YES; - }; - name = Debug; - }; - DB13B1611849DEB70010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INFINITE_RECURSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_SUSPICIOUS_MOVE = YES; - CLANG_WARN_UNREACHABLE_CODE = YES; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - ENABLE_STRICT_OBJC_MSGSEND = YES; - GCC_NO_COMMON_BLOCKS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_common/include, - ); - }; - name = Release; - }; - DB13B1871849DF1E0010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - DSTROOT = /tmp/ffi.dst; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = ffi; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - VALID_ARCHS = "arm64 armv7 armv7s i386 x86_64"; - }; - name = Debug; - }; - DB13B1881849DF1E0010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - DSTROOT = /tmp/ffi.dst; - ENABLE_NS_ASSERTIONS = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - IPHONEOS_DEPLOYMENT_TARGET = 8.0; - PRODUCT_NAME = ffi; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - VALIDATE_PRODUCT = YES; - VALID_ARCHS = "arm64 armv7 armv7s i386 x86_64"; - }; - name = Release; - }; - DB13B1B11849DF520010F42D /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Debug; - }; - DB13B1B21849DF520010F42D /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - ENABLE_NS_ASSERTIONS = NO; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACOSX_DEPLOYMENT_TARGET = 10.6; - OTHER_LDFLAGS = "-Wl,-no_compact_unwind"; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Release; - }; - FDB52FC31F6144FA00AA92E6 /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = NO; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - PRODUCT_NAME = ffi; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; - }; - name = Debug; - }; - FDB52FC41F6144FA00AA92E6 /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COPY_PHASE_STRIP = YES; - ENABLE_NS_ASSERTIONS = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_ios/include, - ); - PRODUCT_NAME = ffi; - SDKROOT = appletvos; - SKIP_INSTALL = YES; - TVOS_DEPLOYMENT_TARGET = 9.0; - VALIDATE_PRODUCT = YES; - }; - name = Release; - }; - FDDB2F601F5D846400EF414E /* Debug */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = NO; - EXECUTABLE_EXTENSION = a; - EXECUTABLE_PREFIX = lib; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_DYNAMIC_NO_PIC = NO; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_OPTIMIZATION_LEVEL = 0; - GCC_PREPROCESSOR_DEFINITIONS = ( - "DEBUG=1", - "$(inherited)", - ); - GCC_SYMBOLS_PRIVATE_EXTERN = NO; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.6; - ONLY_ACTIVE_ARCH = YES; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Debug; - }; - FDDB2F611F5D846400EF414E /* Release */ = { - isa = XCBuildConfiguration; - buildSettings = { - ALWAYS_SEARCH_USER_PATHS = NO; - CLANG_CXX_LANGUAGE_STANDARD = "gnu++0x"; - CLANG_CXX_LIBRARY = "libc++"; - CLANG_ENABLE_OBJC_ARC = YES; - CLANG_WARN_BOOL_CONVERSION = YES; - CLANG_WARN_CONSTANT_CONVERSION = YES; - CLANG_WARN_DIRECT_OBJC_ISA_USAGE = YES_ERROR; - CLANG_WARN_EMPTY_BODY = YES; - CLANG_WARN_ENUM_CONVERSION = YES; - CLANG_WARN_INT_CONVERSION = YES; - CLANG_WARN_OBJC_ROOT_CLASS = YES_ERROR; - CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; - COMBINE_HIDPI_IMAGES = YES; - COPY_PHASE_STRIP = YES; - DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; - ENABLE_NS_ASSERTIONS = NO; - EXECUTABLE_EXTENSION = a; - EXECUTABLE_PREFIX = lib; - GCC_C_LANGUAGE_STANDARD = gnu99; - GCC_ENABLE_OBJC_EXCEPTIONS = YES; - GCC_WARN_64_TO_32_BIT_CONVERSION = YES; - GCC_WARN_ABOUT_RETURN_TYPE = YES_ERROR; - GCC_WARN_UNDECLARED_SELECTOR = YES; - GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; - GCC_WARN_UNUSED_FUNCTION = YES; - GCC_WARN_UNUSED_VARIABLE = YES; - HEADER_SEARCH_PATHS = ( - "$(inherited)", - darwin_osx/include, - ); - MACH_O_TYPE = staticlib; - MACOSX_DEPLOYMENT_TARGET = 10.6; - PRODUCT_NAME = ffi; - SDKROOT = macosx; - }; - name = Release; - }; -/* End XCBuildConfiguration section */ - -/* Begin XCConfigurationList section */ - DB13B15F1849DEB70010F42D /* Build configuration list for PBXProject "libffi" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1601849DEB70010F42D /* Debug */, - DB13B1611849DEB70010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DB13B18B1849DF1E0010F42D /* Build configuration list for PBXNativeTarget "libffi-iOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1871849DF1E0010F42D /* Debug */, - DB13B1881849DF1E0010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - DB13B1B01849DF520010F42D /* Build configuration list for PBXNativeTarget "libffi-Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - DB13B1B11849DF520010F42D /* Debug */, - DB13B1B21849DF520010F42D /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - FDB52FC21F6144FA00AA92E6 /* Build configuration list for PBXNativeTarget "libffi-tvOS" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - FDB52FC31F6144FA00AA92E6 /* Debug */, - FDB52FC41F6144FA00AA92E6 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - FDDB2F5F1F5D846400EF414E /* Build configuration list for PBXNativeTarget "libffi-static-Mac" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - FDDB2F601F5D846400EF414E /* Debug */, - FDDB2F611F5D846400EF414E /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; -/* End XCConfigurationList section */ - }; - rootObject = DB13B15C1849DEB70010F42D /* Project object */; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libtool-version b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libtool-version deleted file mode 100644 index e4f5aa2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/libtool-version +++ /dev/null @@ -1,29 +0,0 @@ -# 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 -8:0:1 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/asmcfi.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/asmcfi.m4 deleted file mode 100644 index dbf73a0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/asmcfi.m4 +++ /dev/null @@ -1,13 +0,0 @@ -AC_DEFUN([GCC_AS_CFI_PSEUDO_OP], -[AC_CACHE_CHECK([assembler .cfi pseudo-op support], - gcc_cv_as_cfi_pseudo_op, [ - gcc_cv_as_cfi_pseudo_op=unknown - AC_TRY_COMPILE([asm (".cfi_startproc\n\t.cfi_endproc");],, - [gcc_cv_as_cfi_pseudo_op=yes], - [gcc_cv_as_cfi_pseudo_op=no]) - ]) - if test "x$gcc_cv_as_cfi_pseudo_op" = xyes; then - AC_DEFINE(HAVE_AS_CFI_PSEUDO_OP, 1, - [Define if your assembler supports .cfi_* directives.]) - fi -]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_append_flag.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_append_flag.m4 deleted file mode 100644 index e8c5312..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_append_flag.m4 +++ /dev/null @@ -1,71 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_append_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_APPEND_FLAG(FLAG, [FLAGS-VARIABLE]) -# -# DESCRIPTION -# -# FLAG is appended to the FLAGS-VARIABLE shell variable, with a space -# added in between. -# -# If FLAGS-VARIABLE is not specified, the current language's flags (e.g. -# CFLAGS) is used. FLAGS-VARIABLE is not changed if it already contains -# FLAG. If FLAGS-VARIABLE is unset in the shell, it is set to exactly -# FLAG. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# 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_APPEND_FLAG], -[dnl -AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_SET_IF -AS_VAR_PUSHDEF([FLAGS], [m4_default($2,_AC_LANG_PREFIX[FLAGS])]) -AS_VAR_SET_IF(FLAGS,[ - AS_CASE([" AS_VAR_GET(FLAGS) "], - [*" $1 "*], [AC_RUN_LOG([: FLAGS already contains $1])], - [ - AS_VAR_APPEND(FLAGS,[" $1"]) - AC_RUN_LOG([: FLAGS="$FLAGS"]) - ]) - ], - [ - AS_VAR_SET(FLAGS,[$1]) - AC_RUN_LOG([: FLAGS="$FLAGS"]) - ]) -AS_VAR_POPDEF([FLAGS])dnl -])dnl AX_APPEND_FLAG diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 deleted file mode 100644 index 9e7f1ee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +++ /dev/null @@ -1,194 +0,0 @@ -# =========================================================================== -# https://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_COMPILE_FLAG, 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 17 - -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=$enableval, 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_COMPILE_FLAG($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:6c65746e:49656e69) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *0?6[[78ab]]?:*:*:*|?6[[78ab]]?:*:*:*|6[[78ab]]?:*:*:*) icc_flags="-xK" ;; - *0?6[[9d]]?:*:*:*|?6[[9d]]?:*:*:*|6[[9d]]?:*:*:*|*1?65?:*:*:*) icc_flags="-xSSE2 -xB -xK" ;; - *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) icc_flags="-xSSE3 -xP -xO -xB -xK" ;; - *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) icc_flags="-xSSSE3 -xT -xB -xK" ;; - *1?6[[7d]]?:*:*:*) icc_flags="-xSSE4.1 -xS -xT -xB -xK" ;; - *1?6[[aef]]?:*:*:*|*2?6[[5cef]]?:*:*:*) icc_flags="-xSSE4.2 -xS -xT -xB -xK" ;; - *2?6[[ad]]?:*:*:*) icc_flags="-xAVX -SSE4.2 -xS -xT -xB -xK" ;; - *3?6[[ae]]?:*:*:*) icc_flags="-xCORE-AVX-I -xAVX -SSE4.2 -xS -xT -xB -xK" ;; - *3?6[[cf]]?:*:*:*|*4?6[[56]]?:*:*:*) icc_flags="-xCORE-AVX2 -xCORE-AVX-I -xAVX -SSE4.2 -xS -xT -xB -xK" ;; - *000?f[[346]]?:*:*:*|?f[[346]]?:*:*:*|f[[346]]?:*:*:*) icc_flags="-xSSE3 -xP -xO -xN -xW -xK" ;; - *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) icc_flags="-xSSE2 -xN -xW -xK" ;; - esac ;; - esac ;; - esac - if test "x$icc_flags" != x; then - for flag in $icc_flags; do - AX_CHECK_COMPILE_FLAG($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" - - # -malign-double for x86 systems - # libffi local change -- don't align double, as it changes the ABI - # AX_CHECK_COMPILE_FLAG(-malign-double, CFLAGS="$CFLAGS -malign-double") - - # -fstrict-aliasing for gcc-2.95+ - AX_CHECK_COMPILE_FLAG(-fstrict-aliasing, - CFLAGS="$CFLAGS -fstrict-aliasing") - - # note that we enable "unsafe" fp optimization with other compilers, too - AX_CHECK_COMPILE_FLAG(-ffast-math, CFLAGS="$CFLAGS -ffast-math") - - AX_GCC_ARCHFLAG($acx_maxopt_portable) - ;; - - microsoft) - # default optimization flags for MSVC opt builds - CFLAGS="-O2" - ;; - 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_COMPILE_FLAG($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.25/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 deleted file mode 100644 index 094577e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +++ /dev/null @@ -1,122 +0,0 @@ -# =========================================================================== -# https://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 -# -# NOTE: These macros depend on AX_APPEND_FLAG. -# -# 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 16 - -AC_DEFUN([AX_FLAGS_WARN_ALL],[dnl -AS_VAR_PUSHDEF([FLAGS],[_AC_LANG_PREFIX[]FLAGS])dnl -AS_VAR_PUSHDEF([VAR],[ac_cv_[]_AC_LANG_ABBREV[]flags_warn_all])dnl -AC_CACHE_CHECK([m4_ifval($1,$1,FLAGS) for maximum warnings], -VAR,[VAR="no, unknown" -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" -]) -AS_VAR_POPDEF([FLAGS])dnl -AX_REQUIRE_DEFINED([AX_APPEND_FLAG]) -case ".$VAR" in - .ok|.ok,*) m4_ifvaln($3,$3) ;; - .|.no|.no,*) m4_default($4,[m4_ifval($2,[AX_APPEND_FLAG([$2], [$1])])]) ;; - *) m4_default($3,[AX_APPEND_FLAG([$VAR], [$1])]) ;; -esac -AS_VAR_POPDEF([VAR])dnl -])dnl AX_FLAGS_WARN_ALL -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. - -AC_DEFUN([AX_CFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([C]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([C]) -]) - -AC_DEFUN([AX_CXXFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([C++]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([C++]) -]) - -AC_DEFUN([AX_FCFLAGS_WARN_ALL],[dnl -AC_LANG_PUSH([Fortran]) -AX_FLAGS_WARN_ALL([$1], [$2], [$3], [$4]) -AC_LANG_POP([Fortran]) -]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 deleted file mode 100644 index dcabb92..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +++ /dev/null @@ -1,74 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_check_compile_flag.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_CHECK_COMPILE_FLAG(FLAG, [ACTION-SUCCESS], [ACTION-FAILURE], [EXTRA-FLAGS], [INPUT]) -# -# DESCRIPTION -# -# Check whether the given FLAG works with the current language's compiler -# or gives an error. (Warnings, however, are ignored) -# -# ACTION-SUCCESS/ACTION-FAILURE are shell commands to execute on -# success/failure. -# -# If EXTRA-FLAGS is defined, it is added to the current language's default -# flags (e.g. CFLAGS) when the check is done. The check is thus made with -# the flags: "CFLAGS EXTRA-FLAGS FLAG". This can for example be used to -# force the compiler to issue an error when a bad flag is given. -# -# INPUT gives an alternative input source to AC_COMPILE_IFELSE. -# -# NOTE: Implementation based on AX_CFLAGS_GCC_OPTION. Please keep this -# macro in sync with AX_CHECK_{PREPROC,LINK}_FLAG. -# -# LICENSE -# -# Copyright (c) 2008 Guido U. Draheim -# Copyright (c) 2011 Maarten Bosmans -# -# 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 5 - -AC_DEFUN([AX_CHECK_COMPILE_FLAG], -[AC_PREREQ(2.64)dnl for _AC_LANG_PREFIX and AS_VAR_IF -AS_VAR_PUSHDEF([CACHEVAR],[ax_cv_check_[]_AC_LANG_ABBREV[]flags_$4_$1])dnl -AC_CACHE_CHECK([whether _AC_LANG compiler accepts $1], CACHEVAR, [ - ax_check_save_flags=$[]_AC_LANG_PREFIX[]FLAGS - _AC_LANG_PREFIX[]FLAGS="$[]_AC_LANG_PREFIX[]FLAGS $4 $1" - AC_COMPILE_IFELSE([m4_default([$5],[AC_LANG_PROGRAM()])], - [AS_VAR_SET(CACHEVAR,[yes])], - [AS_VAR_SET(CACHEVAR,[no])]) - _AC_LANG_PREFIX[]FLAGS=$ax_check_save_flags]) -AS_VAR_IF(CACHEVAR,yes, - [m4_default([$2], :)], - [m4_default([$3], :)]) -AS_VAR_POPDEF([CACHEVAR])dnl -])dnl AX_CHECK_COMPILE_FLAGS diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 deleted file mode 100644 index 4ca8089..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +++ /dev/null @@ -1,87 +0,0 @@ -# =========================================================================== -# https://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 16 - -AC_DEFUN([AX_COMPILER_VENDOR], -[AC_CACHE_CHECK([for _AC_LANG compiler vendor], ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor, - dnl Please add if possible support to ax_compiler_version.m4 - [# note: don't check for gcc first since some other compilers define __GNUC__ - vendors="intel: __ICC,__ECC,__INTEL_COMPILER - ibm: __xlc__,__xlC__,__IBMC__,__IBMCPP__ - pathscale: __PATHCC__,__PATHSCALE__ - clang: __clang__ - cray: _CRAYC - fujitsu: __FUJITSU - gnu: __GNUC__ - sun: __SUNPRO_C,__SUNPRO_CC - hp: __HP_cc,__HP_aCC - dec: __DECC,__DECCXX,__DECC_VER,__DECCXX_VER - borland: __BORLANDC__,__CODEGEARC__,__TURBOC__ - comeau: __COMO__ - kai: __KCC - lcc: __LCC__ - sgi: __sgi,sgi - microsoft: _MSC_VER - metrowerks: __MWERKS__ - watcom: __WATCOMC__ - portland: __PGI - tcc: __TINYC__ - unknown: UNKNOWN" - for ventest in $vendors; do - case $ventest in - *:) vendor=$ventest; continue ;; - *) vencpp="defined("`echo $ventest | sed 's/,/) || defined(/g'`")" ;; - esac - AC_COMPILE_IFELSE([AC_LANG_PROGRAM(,[ - #if !($vencpp) - thisisanerror; - #endif - ])], [break]) - done - ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor=`echo $vendor | cut -d: -f1` - ]) -]) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_configure_args.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_configure_args.m4 deleted file mode 100644 index 95f9f64..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_configure_args.m4 +++ /dev/null @@ -1,70 +0,0 @@ -# =========================================================================== -# https://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 always 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 13 - -AC_DEFUN([AX_CONFIGURE_ARGS],[ - # [$]@ is unusable 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.25/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 deleted file mode 100644 index 710384d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +++ /dev/null @@ -1,302 +0,0 @@ -# =========================================================================== -# https://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-detection 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 overridden 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 30 - -AC_DEFUN([AX_ENABLE_BUILDDIR],[ -AC_REQUIRE([AC_CANONICAL_HOST])[]dnl -AC_REQUIRE([AC_CANONICAL_TARGET])[]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 - [[\\/]]* | ?:[[\\/]]*) # Absolute name - 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" -eq "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" -eq "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" -eq "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.25/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 deleted file mode 100644 index d4a37f8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +++ /dev/null @@ -1,263 +0,0 @@ -# =========================================================================== -# https://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 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_COMPILE_FLAG, 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 -# Copyright (c) 2014 Tsukasa Oi -# Copyright (c) 2017 Alexey Kopytov -# -# 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 20 - -AC_DEFUN([AX_GCC_ARCHFLAG], -[AC_REQUIRE([AC_PROG_CC]) -AC_REQUIRE([AC_CANONICAL_HOST]) -AC_REQUIRE([AC_PROG_SED]) -AC_REQUIRE([AX_COMPILER_VENDOR]) - -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*|amd64*) # use cpuid codes - AX_GCC_X86_CPUID(0) - AX_GCC_X86_CPUID(1) - case $ax_cv_gcc_x86_cpuid_0 in - *:756e6547:6c65746e:49656e69) # Intel - case $ax_cv_gcc_x86_cpuid_1 in - *5[[4578]]?:*:*:*) ax_gcc_arch="pentium-mmx pentium" ;; - *5[[123]]?:*:*:*) ax_gcc_arch=pentium ;; - *0?61?:*:*:*|?61?:*:*:*|61?:*:*:*) ax_gcc_arch=pentiumpro ;; - *0?6[[356]]?:*:*:*|?6[[356]]?:*:*:*|6[[356]]?:*:*:*) ax_gcc_arch="pentium2 pentiumpro" ;; - *0?6[[78ab]]?:*:*:*|?6[[78ab]]?:*:*:*|6[[78ab]]?:*:*:*) ax_gcc_arch="pentium3 pentiumpro" ;; - *0?6[[9d]]?:*:*:*|?6[[9d]]?:*:*:*|6[[9d]]?:*:*:*|*1?65?:*:*:*) ax_gcc_arch="pentium-m pentium3 pentiumpro" ;; - *0?6e?:*:*:*|?6e?:*:*:*|6e?:*:*:*) ax_gcc_arch="yonah pentium-m pentium3 pentiumpro" ;; - *0?6f?:*:*:*|?6f?:*:*:*|6f?:*:*:*|*1?66?:*:*:*) ax_gcc_arch="core2 pentium-m pentium3 pentiumpro" ;; - *1?6[[7d]]?:*:*:*) ax_gcc_arch="penryn core2 pentium-m pentium3 pentiumpro" ;; - *1?6[[aef]]?:*:*:*|*2?6e?:*:*:*) ax_gcc_arch="nehalem corei7 core2 pentium-m pentium3 pentiumpro" ;; - *2?6[[5cf]]?:*:*:*) ax_gcc_arch="westmere corei7 core2 pentium-m pentium3 pentiumpro" ;; - *2?6[[ad]]?:*:*:*) ax_gcc_arch="sandybridge corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *3?6[[ae]]?:*:*:*) ax_gcc_arch="ivybridge core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *3?6[[cf]]?:*:*:*|*4?6[[56]]?:*:*:*) ax_gcc_arch="haswell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *3?6d?:*:*:*) ax_gcc_arch="broadwell core-avx2 core-avx-i corei7-avx corei7 core2 pentium-m pentium3 pentiumpro" ;; - *1?6c?:*:*:*|*2?6[[67]]?:*:*:*|*3?6[[56]]?:*:*:*) ax_gcc_arch="bonnell atom core2 pentium-m pentium3 pentiumpro" ;; - *3?67?:*:*:*|*[[45]]?6[[ad]]?:*:*:*) ax_gcc_arch="silvermont atom core2 pentium-m pentium3 pentiumpro" ;; - *000?f[[012]]?:*:*:*|?f[[012]]?:*:*:*|f[[012]]?:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; - *000?f[[346]]?:*:*:*|?f[[346]]?:*:*:*|f[[346]]?:*:*:*) ax_gcc_arch="nocona prescott pentium4 pentiumpro" ;; - # fallback - *5??:*:*:*) ax_gcc_arch=pentium ;; - *??6??:*:*:*) ax_gcc_arch="core2 pentiumpro" ;; - *6??:*:*:*) ax_gcc_arch=pentiumpro ;; - *00??f??:*:*:*|??f??:*:*:*|?f??:*:*:*|f??:*:*:*) ax_gcc_arch="pentium4 pentiumpro" ;; - esac ;; - *:68747541:444d4163:69746e65) # AMD - case $ax_cv_gcc_x86_cpuid_1 in - *5[[67]]?:*:*:*) ax_gcc_arch=k6 ;; - *5[[8]]?:*:*:*) ax_gcc_arch="k6-2 k6" ;; - *5[[9d]]?:*:*:*) ax_gcc_arch="k6-3 k6" ;; - *6[[12]]?:*:*:*) ax_gcc_arch="athlon k7" ;; - *6[[34]]?:*:*:*) ax_gcc_arch="athlon-tbird k7" ;; - *6[[678a]]?:*:*:*) ax_gcc_arch="athlon-xp athlon-4 athlon k7" ;; - *000?f[[4578bcef]]?:*:*:*|?f[[4578bcef]]?:*:*:*|f[[4578bcef]]?:*:*:*|*001?f[[4578bcf]]?:*:*:*|1?f[[4578bcf]]?:*:*:*) ax_gcc_arch="athlon64 k8" ;; - *002?f[[13457bcf]]?:*:*:*|2?f[[13457bcf]]?:*:*:*|*004?f[[138bcf]]?:*:*:*|4?f[[138bcf]]?:*:*:*|*005?f[[df]]?:*:*:*|5?f[[df]]?:*:*:*|*006?f[[8bcf]]?:*:*:*|6?f[[8bcf]]?:*:*:*|*007?f[[cf]]?:*:*:*|7?f[[cf]]?:*:*:*|*00c?f1?:*:*:*|c?f1?:*:*:*|*020?f3?:*:*:*|20?f3?:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; - *010?f[[245689a]]?:*:*:*|10?f[[245689a]]?:*:*:*|*030?f1?:*:*:*|30?f1?:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; - *050?f[[12]]?:*:*:*|50?f[[12]]?:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; - *060?f1?:*:*:*|60?f1?:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; - *060?f2?:*:*:*|60?f2?:*:*:*|*061?f[[03]]?:*:*:*|61?f[[03]]?:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; - *063?f0?:*:*:*|63?f0?:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; - *07[[03]]?f0?:*:*:*|7[[03]]?f0?:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; - # fallback - *0[[13]]??f??:*:*:*|[[13]]??f??:*:*:*) ax_gcc_arch="barcelona amdfam10 k8" ;; - *020?f??:*:*:*|20?f??:*:*:*) ax_gcc_arch="athlon64-sse3 k8-sse3 athlon64 k8" ;; - *05??f??:*:*:*|5??f??:*:*:*) ax_gcc_arch="btver1 amdfam10 k8" ;; - *060?f??:*:*:*|60?f??:*:*:*) ax_gcc_arch="bdver1 amdfam10 k8" ;; - *061?f??:*:*:*|61?f??:*:*:*) ax_gcc_arch="bdver2 bdver1 amdfam10 k8" ;; - *06??f??:*:*:*|6??f??:*:*:*) ax_gcc_arch="bdver3 bdver2 bdver1 amdfam10 k8" ;; - *070?f??:*:*:*|70?f??:*:*:*) ax_gcc_arch="btver2 btver1 amdfam10 k8" ;; - *???f??:*:*:*) ax_gcc_arch="amdfam10 k8" ;; - esac ;; - *:746e6543:736c7561:48727561) # IDT / VIA (Centaur) - case $ax_cv_gcc_x86_cpuid_1 in - *54?:*:*:*) ax_gcc_arch=winchip-c6 ;; - *5[[89]]?:*:*:*) ax_gcc_arch=winchip2 ;; - *66?:*:*:*) ax_gcc_arch=winchip2 ;; - *6[[78]]?:*:*:*) ax_gcc_arch=c3 ;; - *6[[9adf]]?:*:*:*) 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 ' -' | $SED 's/SPARCIIi/SPARCII/' |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" - ;; - aarch64) - cpuimpl=`grep 'CPU implementer' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` - cpuarch=`grep 'CPU architecture' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` - cpuvar=`grep 'CPU variant' /proc/cpuinfo 2> /dev/null | cut -d: -f2 | tr -d " " | head -n 1` - case $cpuimpl in - 0x42) case $cpuarch in - 8) case $cpuvar in - 0x0) ax_gcc_arch="thunderx2t99 vulcan armv8.1-a armv8-a+lse armv8-a native" ;; - esac - ;; - esac - ;; - 0x43) case $cpuarch in - 8) case $cpuvar in - 0x0) ax_gcc_arch="thunderx armv8-a native" ;; - 0x1) ax_gcc_arch="thunderx+lse armv8.1-a armv8-a+lse armv8-a native" ;; - esac - ;; - esac - ;; - esac - ;; -esac -fi # not cross-compiling -fi # guess arch - -if test "x$ax_gcc_arch" != x -a "x$ax_gcc_arch" != xno; then -if test "x[]m4_default([$1],yes)" = xyes; then # if we require portable code - flag_prefixes="-mtune=" - if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then flag_prefixes="-march="; fi - # -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*|amd64*) flag_prefixes="$flag_prefixes -mcpu= -m";; esac -else - flag_prefixes="-march= -mcpu= -m" -fi -for flag_prefix in $flag_prefixes; do - for arch in $ax_gcc_arch; do - flag="$flag_prefix$arch" - AX_CHECK_COMPILE_FLAG($flag, [if test "x$ax_cv_[]_AC_LANG_ABBREV[]_compiler_vendor" = xclang; then - if test "x[]m4_default([$1],yes)" = xyes; then - if test "x$flag" = "x-march=$arch"; then flag=-mtune=$arch; fi - fi - fi; 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.25/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 deleted file mode 100644 index df95465..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +++ /dev/null @@ -1,89 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_gcc_x86_cpuid.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_GCC_X86_CPUID(OP) -# AX_GCC_X86_CPUID_COUNT(OP, COUNT) -# -# 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. AX_GCC_X86_CPUID_COUNT takes an additional COUNT -# parameter that gets passed into register ECX before calling cpuid. -# -# 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 -# Copyright (c) 2015 Michael Petch -# -# 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_GCC_X86_CPUID], -[AX_GCC_X86_CPUID_COUNT($1, 0) -]) - -AC_DEFUN([AX_GCC_X86_CPUID_COUNT], -[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, level = $2, eax, ebx, ecx, edx; - FILE *f; - __asm__ __volatile__ ("xchg %%ebx, %1\n" - "cpuid\n" - "xchg %%ebx, %1\n" - : "=a" (eax), "=r" (ebx), "=c" (ecx), "=d" (edx) - : "a" (op), "2" (level)); - - 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.25/ext/ffi_c/libffi/m4/ax_require_defined.m4 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_require_defined.m4 deleted file mode 100644 index 17c3eab..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/m4/ax_require_defined.m4 +++ /dev/null @@ -1,37 +0,0 @@ -# =========================================================================== -# https://www.gnu.org/software/autoconf-archive/ax_require_defined.html -# =========================================================================== -# -# SYNOPSIS -# -# AX_REQUIRE_DEFINED(MACRO) -# -# DESCRIPTION -# -# AX_REQUIRE_DEFINED is a simple helper for making sure other macros have -# been defined and thus are available for use. This avoids random issues -# where a macro isn't expanded. Instead the configure script emits a -# non-fatal: -# -# ./configure: line 1673: AX_CFLAGS_WARN_ALL: command not found -# -# It's like AC_REQUIRE except it doesn't expand the required macro. -# -# Here's an example: -# -# AX_REQUIRE_DEFINED([AX_CHECK_LINK_FLAG]) -# -# LICENSE -# -# Copyright (c) 2014 Mike Frysinger -# -# Copying and distribution of this file, with or without modification, are -# permitted in any medium without royalty provided the copyright notice -# and this notice are preserved. This file is offered as-is, without any -# warranty. - -#serial 2 - -AC_DEFUN([AX_REQUIRE_DEFINED], [dnl - m4_ifndef([$1], [m4_fatal([macro ]$1[ is not defined; is a m4 file missing?])]) -])dnl AX_REQUIRE_DEFINED diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/Makefile.am deleted file mode 100644 index afcbfb6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/Makefile.am +++ /dev/null @@ -1,8 +0,0 @@ -## Process this with automake to create Makefile.in - -AUTOMAKE_OPTIONS=foreign - -EXTRA_DIST = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 - -man_MANS = ffi.3 ffi_call.3 ffi_prep_cif.3 ffi_prep_cif_var.3 - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi.3 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi.3 deleted file mode 100644 index 1f1d303..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi.3 +++ /dev/null @@ -1,41 +0,0 @@ -.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_prep_cif_var -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nfixedargs" -.Fa "unsigned int ntotalargs" -.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_prep_cif_var 3 , -.Xr ffi_call 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_call.3 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_call.3 deleted file mode 100644 index 5351513..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_call.3 +++ /dev/null @@ -1,103 +0,0 @@ -.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.25/ext/ffi_c/libffi/man/ffi_prep_cif.3 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_prep_cif.3 deleted file mode 100644 index ab2be8a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_prep_cif.3 +++ /dev/null @@ -1,68 +0,0 @@ -.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. Note that to call a variadic function -.Nm ffi_prep_cif_var -must be used instead. -.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 , -.Xr ffi_prep_cif_var 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 deleted file mode 100644 index 7e19d0b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/man/ffi_prep_cif_var.3 +++ /dev/null @@ -1,73 +0,0 @@ -.Dd January 25, 2011 -.Dt ffi_prep_cif_var 3 -.Sh NAME -.Nm ffi_prep_cif_var -.Nd Prepare a -.Nm ffi_cif -structure for use with -.Nm ffi_call -for variadic functions. -.Sh SYNOPSIS -.In ffi.h -.Ft ffi_status -.Fo ffi_prep_cif_var -.Fa "ffi_cif *cif" -.Fa "ffi_abi abi" -.Fa "unsigned int nfixedargs" -.Fa "unsigned int ntotalargs" -.Fa "ffi_type *rtype" -.Fa "ffi_type **atypes" -.Fc -.Sh DESCRIPTION -The -.Nm ffi_prep_cif_var -function prepares a -.Nm ffi_cif -structure for use with -.Nm ffi_call -for variadic functions. -.Fa abi -specifies a set of calling conventions to use. -.Fa atypes -is an array of -.Fa ntotalargs -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. -.Fa nfixedargs -must contain the number of fixed (non-variadic) arguments. -Note that to call a non-variadic function -.Nm ffi_prep_cif -must be used. -.Sh RETURN VALUES -Upon successful completion, -.Nm ffi_prep_cif_var -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 , -.Xr ffi_prep_cif 3 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/msvcc.sh b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/msvcc.sh deleted file mode 100755 index 9a252f8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/msvcc.sh +++ /dev/null @@ -1,328 +0,0 @@ -#!/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_orig=$@ -args="-nologo -W3" -linkargs= -static_crt= -debug_crt= -cl="cl" -ml="ml" -safeseh="-safeseh" -output= -libpaths= -libversion=7 -verbose= - -while [ $# -gt 0 ] -do - case $1 - in - --verbose) - $verbose=1 - shift 1 - ;; - --version) - args="-help" - shift 1 - ;; - -fexceptions) - # Don't enable exceptions for now. - #args="$args -EHac" - shift 1 - ;; - -m32) - shift 1 - ;; - -m64) - ml="ml64" # "$MSVC/x86_amd64/ml64" - safeseh= - shift 1 - ;; - -clang-cl) - cl="clang-cl" - shift 1 - ;; - -O0) - args="$args -Od" - shift 1 - ;; - -O*) - # Runtime error checks (enabled by setting -RTC1 in the -DFFI_DEBUG - # case below) are not compatible with optimization flags and will - # cause the build to fail. Therefore, drop the optimization flag if - # -DFFI_DEBUG is also set. - case $args_orig in - *-DFFI_DEBUG*) - args="$args" - ;; - *) - # The ax_cc_maxopt.m4 macro from the upstream autoconf-archive - # project doesn't support MSVC and therefore ends up trying to - # use -O3. Use the equivalent "max optimization" flag for MSVC - # instead of erroring out. - case $1 in - -O3) - args="$args -O2" - ;; - *) - args="$args $1" - ;; - esac - opt="true" - ;; - esac - shift 1 - ;; - -g) - # Enable debug symbol generation. - args="$args -Zi" - shift 1 - ;; - -DFFI_DEBUG) - # Enable runtime error checks. - args="$args -RTC1" - defines="$defines $1" - shift 1 - ;; - -DUSE_STATIC_RTL) - # Link against static CRT. - static_crt=1 - shift 1 - ;; - -DUSE_DEBUG_RTL) - # Link against debug CRT. - debug_crt=1 - 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) - p=$(cygpath -m $2) - args="$args -I$p" - includes="$includes -I$p" - shift 2 - ;; - -I*) - p=$(cygpath -m ${1#-I}) - args="$args -I$p" - includes="$includes -I$p" - shift 1 - ;; - -L) - p=$(cygpath -m $2) - linkargs="$linkargs -LIBPATH:$p" - shift 2 - ;; - -L*) - p=$(cygpath -m ${1#-L}) - linkargs="$linkargs -LIBPATH:$p" - shift 1 - ;; - -link) - # add next argument verbatim to linker args - linkargs="$linkargs $2" - shift 2 - ;; - -l*) - case $1 - in - -lffi) - linkargs="$linkargs lib${1#-l}-${libversion}.lib" - ;; - *) - # ignore other libraries like -lm, hope they are - # covered by MSVCRT - # linkargs="$linkargs ${1#-l}.lib" - ;; - esac - 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 - ;; - -pedantic) - # libffi tests -pedantic with -Wall, so drop it also. - shift 1 - ;; - -warn) - # ignore -warn all from libtool as well. - if test "$2" = "all"; then - shift 2 - else - args="$args -warn" - shift 1 - fi - ;; - -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 "$linkargs" ]; then - - # If -Zi is specified, certain optimizations are implicitly disabled - # by MSVC. Add back those optimizations if this is an optimized build. - # NOTE: These arguments must come after all others. - if [ -n "$opt" ]; then - linkargs="$linkargs -OPT:REF -OPT:ICF -INCREMENTAL:NO" - fi - - args="$args -link $linkargs" -fi - -if [ -n "$static_crt" ]; then - md=-MT -else - md=-MD -fi - -if [ -n "$debug_crt" ]; then - md="${md}d" -fi - -if [ -n "$assembly" ]; then - if [ -z "$outdir" ]; then - outdir="." - fi - ppsrc="$outdir/$(basename $src|sed 's/.S$/.asm/g')" - - if test -n "$verbose"; then - echo "$cl -nologo -EP $includes $defines $src > $ppsrc" - fi - - "$cl" -nologo -EP $includes $defines $src > $ppsrc || exit $? - output="$(echo $output | sed 's%/F[dpa][^ ]*%%g')" - args="-nologo $safeseh $single $output $ppsrc" - - if test -n "$verbose"; then - echo "$ml $args" - fi - - eval "\"$ml\" $args" - result=$? - - # required to fix ml64 broken output? - #mv *.obj $outdir -else - args="$md $args" - - if test -n "$verbose"; then - echo "$cl $args" - fi - # Return an error code of 1 if an invalid command line parameter is passed - # instead of just ignoring it. Any output that is not a warning or an - # error is filtered so this command behaves more like gcc. cl.exe prints - # the name of the compiled file otherwise, which breaks the dejagnu checks - # for excess warnings and errors. - eval "(\"$cl\" $args 2>&1 1>&3 | \ - awk '{print \$0} /D9002/ {error=1} END{exit error}' >&2) 3>&1 | \ - awk '/warning|error/'" - result=$? -fi - -exit $result - -# vim: noai:ts=4:sw=4 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffi.c deleted file mode 100644 index 4400b61..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffi.c +++ /dev/null @@ -1,941 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -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 -#include "internal.h" - -/* 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 FFI_TYPE_DOUBLE != FFI_TYPE_LONGDOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -union _d -{ - UINT64 d; - UINT32 s[2]; -}; - -struct _v -{ - union _d d[2] __attribute__((aligned(16))); -}; - -struct call_context -{ - struct _v v[N_V_ARG_REG]; - UINT64 x[N_X_ARG_REG]; -}; - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#include -#endif - -#else - -#if defined (__clang__) && defined (__APPLE__) -extern void sys_icache_invalidate (void *start, size_t len); -#endif - -static inline void -ffi_clear_cache (void *start, void *end) -{ -#if defined (__clang__) && defined (__APPLE__) - sys_icache_invalidate (start, (char *)end - (char *)start); -#elif defined (__GNUC__) - __builtin___clear_cache (start, end); -#else -#error "Missing builtin to flush instruction cache" -#endif -} - -#endif - -/* A subroutine of is_vfp_type. Given a structure type, return the type code - of the first non-structure element. Recurse for structure elements. - Return -1 if the structure is in fact empty, i.e. no nested elements. */ - -static int -is_hfa0 (const ffi_type *ty) -{ - ffi_type **elements = ty->elements; - int i, ret = -1; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - ret = elements[i]->type; - if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) - { - ret = is_hfa0 (elements[i]); - if (ret < 0) - continue; - } - break; - } - - return ret; -} - -/* A subroutine of is_vfp_type. Given a structure type, return true if all - of the non-structure elements are the same as CANDIDATE. */ - -static int -is_hfa1 (const ffi_type *ty, int candidate) -{ - ffi_type **elements = ty->elements; - int i; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - return 1; -} - -/* Determine if TY may be allocated to the FP registers. This is both an - fp scalar type as well as an homogenous floating point aggregate (HFA). - That is, a structure consisting of 1 to 4 members of all the same type, - where that type is an fp scalar. - - Returns non-zero iff TY is an HFA. The result is the AARCH64_RET_* - constant for the type. */ - -static int -is_vfp_type (const ffi_type *ty) -{ - ffi_type **elements; - int candidate, i; - size_t size, ele_count; - - /* Quickest tests first. */ - candidate = ty->type; - switch (candidate) - { - default: - return 0; - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - ele_count = 1; - goto done; - case FFI_TYPE_COMPLEX: - candidate = ty->elements[0]->type; - switch (candidate) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - ele_count = 2; - goto done; - } - return 0; - case FFI_TYPE_STRUCT: - break; - } - - /* No HFA types are smaller than 4 bytes, or larger than 64 bytes. */ - size = ty->size; - if (size < 4 || size > 64) - return 0; - - /* Find the type of the first non-structure member. */ - elements = ty->elements; - candidate = elements[0]->type; - if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) - { - for (i = 0; ; ++i) - { - candidate = is_hfa0 (elements[i]); - if (candidate >= 0) - break; - } - } - - /* If the first member is not a floating point type, it's not an HFA. - Also quickly re-check the size of the structure. */ - switch (candidate) - { - case FFI_TYPE_FLOAT: - ele_count = size / sizeof(float); - if (size != ele_count * sizeof(float)) - return 0; - break; - case FFI_TYPE_DOUBLE: - ele_count = size / sizeof(double); - if (size != ele_count * sizeof(double)) - return 0; - break; - case FFI_TYPE_LONGDOUBLE: - ele_count = size / sizeof(long double); - if (size != ele_count * sizeof(long double)) - return 0; - break; - default: - return 0; - } - if (ele_count > 4) - return 0; - - /* Finally, make sure that all scalar elements are the same type. */ - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - /* All tests succeeded. Encode the result. */ - done: - return candidate * 4 + (4 - (int)ele_count); -} - -/* Representation of the procedure call argument marshalling - state. - - The terse state variable names match the names used in the AARCH64 - PCS. */ - -struct arg_state -{ - unsigned ngrn; /* Next general-purpose register number. */ - unsigned nsrn; /* Next vector register number. */ - size_t nsaa; /* Next stack offset. */ - -#if defined (__APPLE__) - unsigned allocating_variadic; -#endif -}; - -/* Initialize a procedure call argument marshalling state. */ -static void -arg_init (struct arg_state *state) -{ - state->ngrn = 0; - state->nsrn = 0; - state->nsaa = 0; -#if defined (__APPLE__) - state->allocating_variadic = 0; -#endif -} - -/* Allocate an aligned slot on the stack and return a pointer to it. */ -static void * -allocate_to_stack (struct arg_state *state, void *stack, - size_t alignment, size_t size) -{ - size_t nsaa = state->nsaa; - - /* Round up the NSAA to the larger of 8 or the natural - alignment of the argument's type. */ -#if defined (__APPLE__) - if (state->allocating_variadic && alignment < 8) - alignment = 8; -#else - if (alignment < 8) - alignment = 8; -#endif - - nsaa = FFI_ALIGN (nsaa, alignment); - state->nsaa = nsaa + size; - - return (char *)stack + nsaa; -} - -static ffi_arg -extend_integer_type (void *source, int type) -{ - switch (type) - { - case FFI_TYPE_UINT8: - return *(UINT8 *) source; - case FFI_TYPE_SINT8: - return *(SINT8 *) source; - case FFI_TYPE_UINT16: - return *(UINT16 *) source; - case FFI_TYPE_SINT16: - return *(SINT16 *) source; - case FFI_TYPE_UINT32: - return *(UINT32 *) source; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - return *(SINT32 *) source; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - return *(UINT64 *) source; - break; - case FFI_TYPE_POINTER: - return *(uintptr_t *) source; - default: - abort(); - } -} - -static void -extend_hfa_type (void *dest, void *src, int h) -{ - ssize_t f = h - AARCH64_RET_S4; - void *x0; - - asm volatile ( - "adr %0, 0f\n" -" add %0, %0, %1\n" -" br %0\n" -"0: ldp s16, s17, [%3]\n" /* S4 */ -" ldp s18, s19, [%3, #8]\n" -" b 4f\n" -" ldp s16, s17, [%3]\n" /* S3 */ -" ldr s18, [%3, #8]\n" -" b 3f\n" -" ldp s16, s17, [%3]\n" /* S2 */ -" b 2f\n" -" nop\n" -" ldr s16, [%3]\n" /* S1 */ -" b 1f\n" -" nop\n" -" ldp d16, d17, [%3]\n" /* D4 */ -" ldp d18, d19, [%3, #16]\n" -" b 4f\n" -" ldp d16, d17, [%3]\n" /* D3 */ -" ldr d18, [%3, #16]\n" -" b 3f\n" -" ldp d16, d17, [%3]\n" /* D2 */ -" b 2f\n" -" nop\n" -" ldr d16, [%3]\n" /* D1 */ -" b 1f\n" -" nop\n" -" ldp q16, q17, [%3]\n" /* Q4 */ -" ldp q18, q19, [%3, #16]\n" -" b 4f\n" -" ldp q16, q17, [%3]\n" /* Q3 */ -" ldr q18, [%3, #16]\n" -" b 3f\n" -" ldp q16, q17, [%3]\n" /* Q2 */ -" b 2f\n" -" nop\n" -" ldr q16, [%3]\n" /* Q1 */ -" b 1f\n" -"4: str q19, [%2, #48]\n" -"3: str q18, [%2, #32]\n" -"2: str q17, [%2, #16]\n" -"1: str q16, [%2]" - : "=&r"(x0) - : "r"(f * 12), "r"(dest), "r"(src) - : "memory", "v16", "v17", "v18", "v19"); -} - -static void * -compress_hfa_type (void *dest, void *reg, int h) -{ - switch (h) - { - case AARCH64_RET_S1: - if (dest == reg) - { -#ifdef __AARCH64EB__ - dest += 12; -#endif - } - else - *(float *)dest = *(float *)reg; - break; - case AARCH64_RET_S2: - asm ("ldp q16, q17, [%1]\n\t" - "st2 { v16.s, v17.s }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); - break; - case AARCH64_RET_S3: - asm ("ldp q16, q17, [%1]\n\t" - "ldr q18, [%1, #32]\n\t" - "st3 { v16.s, v17.s, v18.s }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); - break; - case AARCH64_RET_S4: - asm ("ldp q16, q17, [%1]\n\t" - "ldp q18, q19, [%1, #32]\n\t" - "st4 { v16.s, v17.s, v18.s, v19.s }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); - break; - - case AARCH64_RET_D1: - if (dest == reg) - { -#ifdef __AARCH64EB__ - dest += 8; -#endif - } - else - *(double *)dest = *(double *)reg; - break; - case AARCH64_RET_D2: - asm ("ldp q16, q17, [%1]\n\t" - "st2 { v16.d, v17.d }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17"); - break; - case AARCH64_RET_D3: - asm ("ldp q16, q17, [%1]\n\t" - "ldr q18, [%1, #32]\n\t" - "st3 { v16.d, v17.d, v18.d }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18"); - break; - case AARCH64_RET_D4: - asm ("ldp q16, q17, [%1]\n\t" - "ldp q18, q19, [%1, #32]\n\t" - "st4 { v16.d, v17.d, v18.d, v19.d }[0], [%0]" - : : "r"(dest), "r"(reg) : "memory", "v16", "v17", "v18", "v19"); - break; - - default: - if (dest != reg) - return memcpy (dest, reg, 16 * (4 - (h & 3))); - break; - } - return dest; -} - -/* Either allocate an appropriate register for the argument type, or if - none are available, allocate a stack slot and return a pointer - to the allocated space. */ - -static void * -allocate_int_to_reg_or_stack (struct call_context *context, - struct arg_state *state, - void *stack, size_t size) -{ - if (state->ngrn < N_X_ARG_REG) - return &context->x[state->ngrn++]; - - state->ngrn = N_X_ARG_REG; - return allocate_to_stack (state, stack, size, size); -} - -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - ffi_type *rtype = cif->rtype; - size_t bytes = cif->bytes; - int flags, i, n; - - switch (rtype->type) - { - case FFI_TYPE_VOID: - flags = AARCH64_RET_VOID; - break; - case FFI_TYPE_UINT8: - flags = AARCH64_RET_UINT8; - break; - case FFI_TYPE_UINT16: - flags = AARCH64_RET_UINT16; - break; - case FFI_TYPE_UINT32: - flags = AARCH64_RET_UINT32; - break; - case FFI_TYPE_SINT8: - flags = AARCH64_RET_SINT8; - break; - case FFI_TYPE_SINT16: - flags = AARCH64_RET_SINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - flags = AARCH64_RET_SINT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = AARCH64_RET_INT64; - break; - case FFI_TYPE_POINTER: - flags = (sizeof(void *) == 4 ? AARCH64_RET_UINT32 : AARCH64_RET_INT64); - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - flags = is_vfp_type (rtype); - if (flags == 0) - { - size_t s = rtype->size; - if (s > 16) - { - flags = AARCH64_RET_VOID | AARCH64_RET_IN_MEM; - bytes += 8; - } - else if (s == 16) - flags = AARCH64_RET_INT128; - else if (s == 8) - flags = AARCH64_RET_INT64; - else - flags = AARCH64_RET_INT128 | AARCH64_RET_NEED_COPY; - } - break; - - default: - abort(); - } - - for (i = 0, n = cif->nargs; i < n; i++) - if (is_vfp_type (cif->arg_types[i])) - { - flags |= AARCH64_FLAG_ARG_V; - break; - } - - /* Round the stack up to a multiple of the stack alignment requirement. */ - cif->bytes = (unsigned) FFI_ALIGN(bytes, 16); - cif->flags = flags; -#if defined (__APPLE__) - cif->aarch64_nfixedargs = 0; -#endif - - return FFI_OK; -} - -#if defined (__APPLE__) -/* Perform Apple-specific cif processing for variadic calls */ -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs) -{ - ffi_status status = ffi_prep_cif_machdep (cif); - cif->aarch64_nfixedargs = nfixedargs; - return status; -} -#endif /* __APPLE__ */ - -extern void ffi_call_SYSV (struct call_context *context, void *frame, - void (*fn)(void), void *rvalue, int flags, - void *closure) FFI_HIDDEN; - -/* Call a function with the provided arguments and capture the return - value. */ -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *orig_rvalue, - void **avalue, void *closure) -{ - struct call_context *context; - void *stack, *frame, *rvalue; - struct arg_state state; - size_t stack_bytes, rtype_size, rsize; - int i, nargs, flags; - ffi_type *rtype; - - flags = cif->flags; - rtype = cif->rtype; - rtype_size = rtype->size; - stack_bytes = cif->bytes; - - /* If the target function returns a structure via hidden pointer, - then we cannot allow a null rvalue. Otherwise, mash a null - rvalue to void return type. */ - rsize = 0; - if (flags & AARCH64_RET_IN_MEM) - { - if (orig_rvalue == NULL) - rsize = rtype_size; - } - else if (orig_rvalue == NULL) - flags &= AARCH64_FLAG_ARG_V; - else if (flags & AARCH64_RET_NEED_COPY) - rsize = 16; - - /* Allocate consectutive stack for everything we'll need. */ - context = alloca (sizeof(struct call_context) + stack_bytes + 32 + rsize); - stack = context + 1; - frame = stack + stack_bytes; - rvalue = (rsize ? frame + 32 : orig_rvalue); - - arg_init (&state); - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = cif->arg_types[i]; - size_t s = ty->size; - void *a = avalue[i]; - int h, t; - - t = ty->type; - switch (t) - { - case FFI_TYPE_VOID: - FFI_ASSERT (0); - break; - - /* If the argument is a basic type the argument is allocated to an - appropriate register, or if none are available, to the stack. */ - case FFI_TYPE_INT: - 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: - do_pointer: - { - ffi_arg ext = extend_integer_type (a, t); - if (state.ngrn < N_X_ARG_REG) - context->x[state.ngrn++] = ext; - else - { - void *d = allocate_to_stack (&state, stack, ty->alignment, s); - state.ngrn = N_X_ARG_REG; - /* Note that the default abi extends each argument - to a full 64-bit slot, while the iOS abi allocates - only enough space. */ -#ifdef __APPLE__ - memcpy(d, a, s); -#else - *(ffi_arg *)d = ext; -#endif - } - } - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - { - void *dest; - - h = is_vfp_type (ty); - if (h) - { - int elems = 4 - (h & 3); - if (state.nsrn + elems <= N_V_ARG_REG) - { - dest = &context->v[state.nsrn]; - state.nsrn += elems; - extend_hfa_type (dest, a, h); - break; - } - state.nsrn = N_V_ARG_REG; - dest = allocate_to_stack (&state, stack, ty->alignment, s); - } - else if (s > 16) - { - /* If the argument is a composite type that is larger than 16 - bytes, then the argument has been copied to memory, and - the argument is replaced by a pointer to the copy. */ - a = &avalue[i]; - t = FFI_TYPE_POINTER; - s = sizeof (void *); - goto do_pointer; - } - else - { - size_t n = (s + 7) / 8; - if (state.ngrn + n <= N_X_ARG_REG) - { - /* If the argument is a composite type and the size in - double-words is not more than the number of available - X registers, then the argument is copied into - consecutive X registers. */ - dest = &context->x[state.ngrn]; - state.ngrn += n; - } - else - { - /* Otherwise, there are insufficient X registers. Further - X register allocations are prevented, the NSAA is - adjusted and the argument is copied to memory at the - adjusted NSAA. */ - state.ngrn = N_X_ARG_REG; - dest = allocate_to_stack (&state, stack, ty->alignment, s); - } - } - memcpy (dest, a, s); - } - break; - - default: - abort(); - } - -#if defined (__APPLE__) - if (i + 1 == cif->aarch64_nfixedargs) - { - state.ngrn = N_X_ARG_REG; - state.nsrn = N_V_ARG_REG; - state.allocating_variadic = 1; - } -#endif - } - - ffi_call_SYSV (context, frame, fn, rvalue, flags, closure); - - if (flags & AARCH64_RET_NEED_COPY) - memcpy (orig_rvalue, rvalue, rtype_size); -} - -void -ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -#ifdef FFI_GO_CLOSURES -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} -#endif /* FFI_GO_CLOSURES */ - -/* Build a trampoline. */ - -extern void ffi_closure_SYSV (void) FFI_HIDDEN; -extern void ffi_closure_SYSV_V (void) FFI_HIDDEN; - -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; - - void (*start)(void); - - if (cif->flags & AARCH64_FLAG_ARG_V) - start = ffi_closure_SYSV_V; - else - start = ffi_closure_SYSV; - -#if FFI_EXEC_TRAMPOLINE_TABLE -#ifdef __MACH__ - void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); - config[0] = closure; - config[1] = start; -#endif -#else - static const unsigned char trampoline[16] = { - 0x90, 0x00, 0x00, 0x58, /* ldr x16, tramp+16 */ - 0xf1, 0xff, 0xff, 0x10, /* adr x17, tramp+0 */ - 0x00, 0x02, 0x1f, 0xd6 /* br x16 */ - }; - char *tramp = closure->tramp; - - memcpy (tramp, trampoline, sizeof(trampoline)); - - *(UINT64 *)(tramp + 16) = (uintptr_t)start; - - ffi_clear_cache(tramp, tramp + FFI_TRAMPOLINE_SIZE); -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -#ifdef FFI_GO_CLOSURES -extern void ffi_go_closure_SYSV (void) FFI_HIDDEN; -extern void ffi_go_closure_SYSV_V (void) FFI_HIDDEN; - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - void (*start)(void); - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - if (cif->flags & AARCH64_FLAG_ARG_V) - start = ffi_go_closure_SYSV_V; - else - start = ffi_go_closure_SYSV; - - closure->tramp = start; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} -#endif /* FFI_GO_CLOSURES */ - -/* Primary handler to setup and invoke a function within a closure. - - A closure when invoked enters via the assembler wrapper - ffi_closure_SYSV(). The wrapper allocates a call context on the - stack, saves the interesting registers (from the perspective of - the calling convention) into the context then passes control to - ffi_closure_SYSV_inner() passing the saved context and a pointer to - the stack at the point ffi_closure_SYSV() was invoked. - - On the return path the assembler wrapper will reload call context - registers. - - ffi_closure_SYSV_inner() marshalls the call context into ffi value - descriptors, invokes the wrapped function, then marshalls the return - value back into the call context. */ - -int FFI_HIDDEN -ffi_closure_SYSV_inner (ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - struct call_context *context, - void *stack, void *rvalue, void *struct_rvalue) -{ - void **avalue = (void**) alloca (cif->nargs * sizeof (void*)); - int i, h, nargs, flags; - struct arg_state state; - - arg_init (&state); - - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = cif->arg_types[i]; - int t = ty->type; - size_t n, s = ty->size; - - switch (t) - { - case FFI_TYPE_VOID: - FFI_ASSERT (0); - break; - - case FFI_TYPE_INT: - 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: - avalue[i] = allocate_int_to_reg_or_stack (context, &state, stack, s); - break; - - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - h = is_vfp_type (ty); - if (h) - { - n = 4 - (h & 3); - if (state.nsrn + n <= N_V_ARG_REG) - { - void *reg = &context->v[state.nsrn]; - state.nsrn += n; - - /* Eeek! We need a pointer to the structure, however the - homogeneous float elements are being passed in individual - registers, therefore for float and double the structure - is not represented as a contiguous sequence of bytes in - our saved register context. We don't need the original - contents of the register storage, so we reformat the - structure into the same memory. */ - avalue[i] = compress_hfa_type (reg, reg, h); - } - else - { - state.nsrn = N_V_ARG_REG; - avalue[i] = allocate_to_stack (&state, stack, - ty->alignment, s); - } - } - else if (s > 16) - { - /* Replace Composite type of size greater than 16 with a - pointer. */ - avalue[i] = *(void **) - allocate_int_to_reg_or_stack (context, &state, stack, - sizeof (void *)); - } - else - { - n = (s + 7) / 8; - if (state.ngrn + n <= N_X_ARG_REG) - { - avalue[i] = &context->x[state.ngrn]; - state.ngrn += n; - } - else - { - state.ngrn = N_X_ARG_REG; - avalue[i] = allocate_to_stack (&state, stack, - ty->alignment, s); - } - } - break; - - default: - abort(); - } - -#if defined (__APPLE__) - if (i + 1 == cif->aarch64_nfixedargs) - { - state.ngrn = N_X_ARG_REG; - state.nsrn = N_V_ARG_REG; - state.allocating_variadic = 1; - } -#endif - } - - flags = cif->flags; - if (flags & AARCH64_RET_IN_MEM) - rvalue = struct_rvalue; - - fun (cif, rvalue, avalue, user_data); - - return flags; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffitarget.h deleted file mode 100644 index 65086cd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/ffitarget.h +++ /dev/null @@ -1,81 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -#ifdef __ILP32__ -#define FFI_SIZEOF_ARG 8 -#define FFI_SIZEOF_JAVA_RAW 4 -typedef unsigned long long ffi_arg; -typedef signed long long ffi_sarg; -#else -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; -#endif - -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_NATIVE_RAW_API 0 - -#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#define FFI_TRAMPOLINE_SIZE 16 -#define FFI_TRAMPOLINE_CLOSURE_OFFSET 16 -#else -#error "No trampoline table implementation" -#endif - -#else -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE -#endif - -/* ---- Internal ---- */ - -#if defined (__APPLE__) -#define FFI_TARGET_SPECIFIC_VARIADIC -#define FFI_EXTRA_CIF_FIELDS unsigned aarch64_nfixedargs -#else -/* iOS reserves x18 for the system. Disable Go closures until - a new static chain is chosen. */ -#define FFI_GO_CLOSURES 1 -#endif - -#define FFI_TARGET_HAS_COMPLEX_TYPE - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/internal.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/internal.h deleted file mode 100644 index 9c3e077..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/internal.h +++ /dev/null @@ -1,67 +0,0 @@ -/* -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 AARCH64_RET_VOID 0 -#define AARCH64_RET_INT64 1 -#define AARCH64_RET_INT128 2 - -#define AARCH64_RET_UNUSED3 3 -#define AARCH64_RET_UNUSED4 4 -#define AARCH64_RET_UNUSED5 5 -#define AARCH64_RET_UNUSED6 6 -#define AARCH64_RET_UNUSED7 7 - -/* Note that FFI_TYPE_FLOAT == 2, _DOUBLE == 3, _LONGDOUBLE == 4, - so _S4 through _Q1 are layed out as (TYPE * 4) + (4 - COUNT). */ -#define AARCH64_RET_S4 8 -#define AARCH64_RET_S3 9 -#define AARCH64_RET_S2 10 -#define AARCH64_RET_S1 11 - -#define AARCH64_RET_D4 12 -#define AARCH64_RET_D3 13 -#define AARCH64_RET_D2 14 -#define AARCH64_RET_D1 15 - -#define AARCH64_RET_Q4 16 -#define AARCH64_RET_Q3 17 -#define AARCH64_RET_Q2 18 -#define AARCH64_RET_Q1 19 - -/* Note that each of the sub-64-bit integers gets two entries. */ -#define AARCH64_RET_UINT8 20 -#define AARCH64_RET_UINT16 22 -#define AARCH64_RET_UINT32 24 - -#define AARCH64_RET_SINT8 26 -#define AARCH64_RET_SINT16 28 -#define AARCH64_RET_SINT32 30 - -#define AARCH64_RET_MASK 31 - -#define AARCH64_RET_IN_MEM (1 << 5) -#define AARCH64_RET_NEED_COPY (1 << 6) - -#define AARCH64_FLAG_ARG_V_BIT 7 -#define AARCH64_FLAG_ARG_V (1 << AARCH64_FLAG_ARG_V_BIT) - -#define N_X_ARG_REG 8 -#define N_V_ARG_REG 8 -#define CALL_CONTEXT_SIZE (N_V_ARG_REG * 16 + N_X_ARG_REG * 8) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/sysv.S deleted file mode 100644 index d12bf27..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/aarch64/sysv.S +++ /dev/null @@ -1,438 +0,0 @@ -/* Copyright (c) 2009, 2010, 2011, 2012 ARM Ltd. - -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 -#include "internal.h" - -#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 -#endif - -#ifdef __AARCH64EB__ -# define BE(X) X -#else -# define BE(X) 0 -#endif - -#ifdef __ILP32__ -#define PTR_REG(n) w##n -#else -#define PTR_REG(n) x##n -#endif - -#ifdef __ILP32__ -#define PTR_SIZE 4 -#else -#define PTR_SIZE 8 -#endif - - .text - .align 4 - -/* ffi_call_SYSV - extern void ffi_call_SYSV (void *stack, void *frame, - void (*fn)(void), void *rvalue, - int flags, void *closure); - - Therefore on entry we have: - - x0 stack - x1 frame - x2 fn - x3 rvalue - x4 flags - x5 closure -*/ - - cfi_startproc -CNAME(ffi_call_SYSV): - /* Use a stack frame allocated by our caller. */ - cfi_def_cfa(x1, 32); - stp x29, x30, [x1] - mov x29, x1 - mov sp, x0 - cfi_def_cfa_register(x29) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - mov x9, x2 /* save fn */ - mov x8, x3 /* install structure return */ -#ifdef FFI_GO_CLOSURES - mov x18, x5 /* install static chain */ -#endif - stp x3, x4, [x29, #16] /* save rvalue and flags */ - - /* Load the vector argument passing registers, if necessary. */ - tbz w4, #AARCH64_FLAG_ARG_V_BIT, 1f - ldp q0, q1, [sp, #0] - ldp q2, q3, [sp, #32] - ldp q4, q5, [sp, #64] - ldp q6, q7, [sp, #96] -1: - /* Load the core argument passing registers, including - the structure return pointer. */ - ldp x0, x1, [sp, #16*N_V_ARG_REG + 0] - ldp x2, x3, [sp, #16*N_V_ARG_REG + 16] - ldp x4, x5, [sp, #16*N_V_ARG_REG + 32] - ldp x6, x7, [sp, #16*N_V_ARG_REG + 48] - - /* Deallocate the context, leaving the stacked arguments. */ - add sp, sp, #CALL_CONTEXT_SIZE - - blr x9 /* call fn */ - - ldp x3, x4, [x29, #16] /* reload rvalue and flags */ - - /* Partially deconstruct the stack frame. */ - mov sp, x29 - cfi_def_cfa_register (sp) - ldp x29, x30, [x29] - - /* Save the return value as directed. */ - adr x5, 0f - and w4, w4, #AARCH64_RET_MASK - add x5, x5, x4, lsl #3 - br x5 - - /* Note that each table entry is 2 insns, and thus 8 bytes. - For integer data, note that we're storing into ffi_arg - and therefore we want to extend to 64 bits; these types - have two consecutive entries allocated for them. */ - .align 4 -0: ret /* VOID */ - nop -1: str x0, [x3] /* INT64 */ - ret -2: stp x0, x1, [x3] /* INT128 */ - ret -3: brk #1000 /* UNUSED */ - ret -4: brk #1000 /* UNUSED */ - ret -5: brk #1000 /* UNUSED */ - ret -6: brk #1000 /* UNUSED */ - ret -7: brk #1000 /* UNUSED */ - ret -8: st4 { v0.s, v1.s, v2.s, v3.s }[0], [x3] /* S4 */ - ret -9: st3 { v0.s, v1.s, v2.s }[0], [x3] /* S3 */ - ret -10: stp s0, s1, [x3] /* S2 */ - ret -11: str s0, [x3] /* S1 */ - ret -12: st4 { v0.d, v1.d, v2.d, v3.d }[0], [x3] /* D4 */ - ret -13: st3 { v0.d, v1.d, v2.d }[0], [x3] /* D3 */ - ret -14: stp d0, d1, [x3] /* D2 */ - ret -15: str d0, [x3] /* D1 */ - ret -16: str q3, [x3, #48] /* Q4 */ - nop -17: str q2, [x3, #32] /* Q3 */ - nop -18: stp q0, q1, [x3] /* Q2 */ - ret -19: str q0, [x3] /* Q1 */ - ret -20: uxtb w0, w0 /* UINT8 */ - str x0, [x3] -21: ret /* reserved */ - nop -22: uxth w0, w0 /* UINT16 */ - str x0, [x3] -23: ret /* reserved */ - nop -24: mov w0, w0 /* UINT32 */ - str x0, [x3] -25: ret /* reserved */ - nop -26: sxtb x0, w0 /* SINT8 */ - str x0, [x3] -27: ret /* reserved */ - nop -28: sxth x0, w0 /* SINT16 */ - str x0, [x3] -29: ret /* reserved */ - nop -30: sxtw x0, w0 /* SINT32 */ - str x0, [x3] -31: ret /* reserved */ - nop - - cfi_endproc - - .globl CNAME(ffi_call_SYSV) -#ifdef __ELF__ - .type CNAME(ffi_call_SYSV), #function - .hidden CNAME(ffi_call_SYSV) - .size CNAME(ffi_call_SYSV), .-CNAME(ffi_call_SYSV) -#endif - -/* ffi_closure_SYSV - - Closure invocation glue. This is the low level code invoked directly by - the closure trampoline to setup and call a closure. - - On entry x17 points to a struct ffi_closure, x16 has been clobbered - all other registers are preserved. - - We allocate a call context and save the argument passing registers, - then invoked the generic C ffi_closure_SYSV_inner() function to do all - the real work, on return we load the result passing registers back from - the call context. -*/ - -#define ffi_closure_SYSV_FS (8*2 + CALL_CONTEXT_SIZE + 64) - - .align 4 -CNAME(ffi_closure_SYSV_V): - cfi_startproc - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - /* Save the argument passing vector registers. */ - stp q0, q1, [sp, #16 + 0] - stp q2, q3, [sp, #16 + 32] - stp q4, q5, [sp, #16 + 64] - stp q6, q7, [sp, #16 + 96] - b 0f - cfi_endproc - - .globl CNAME(ffi_closure_SYSV_V) -#ifdef __ELF__ - .type CNAME(ffi_closure_SYSV_V), #function - .hidden CNAME(ffi_closure_SYSV_V) - .size CNAME(ffi_closure_SYSV_V), . - CNAME(ffi_closure_SYSV_V) -#endif - - .align 4 - cfi_startproc -CNAME(ffi_closure_SYSV): - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) -0: - mov x29, sp - - /* Save the argument passing core registers. */ - stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] - stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] - stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] - stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] - - /* Load ffi_closure_inner arguments. */ - ldp PTR_REG(0), PTR_REG(1), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET] /* load cif, fn */ - ldr PTR_REG(2), [x17, #FFI_TRAMPOLINE_CLOSURE_OFFSET+PTR_SIZE*2] /* load user_data */ -.Ldo_closure: - add x3, sp, #16 /* load context */ - add x4, sp, #ffi_closure_SYSV_FS /* load stack */ - add x5, sp, #16+CALL_CONTEXT_SIZE /* load rvalue */ - mov x6, x8 /* load struct_rval */ - bl CNAME(ffi_closure_SYSV_inner) - - /* Load the return value as directed. */ - adr x1, 0f - and w0, w0, #AARCH64_RET_MASK - add x1, x1, x0, lsl #3 - add x3, sp, #16+CALL_CONTEXT_SIZE - br x1 - - /* Note that each table entry is 2 insns, and thus 8 bytes. */ - .align 4 -0: b 99f /* VOID */ - nop -1: ldr x0, [x3] /* INT64 */ - b 99f -2: ldp x0, x1, [x3] /* INT128 */ - b 99f -3: brk #1000 /* UNUSED */ - nop -4: brk #1000 /* UNUSED */ - nop -5: brk #1000 /* UNUSED */ - nop -6: brk #1000 /* UNUSED */ - nop -7: brk #1000 /* UNUSED */ - nop -8: ldr s3, [x3, #12] /* S4 */ - nop -9: ldr s2, [x3, #8] /* S3 */ - nop -10: ldp s0, s1, [x3] /* S2 */ - b 99f -11: ldr s0, [x3] /* S1 */ - b 99f -12: ldr d3, [x3, #24] /* D4 */ - nop -13: ldr d2, [x3, #16] /* D3 */ - nop -14: ldp d0, d1, [x3] /* D2 */ - b 99f -15: ldr d0, [x3] /* D1 */ - b 99f -16: ldr q3, [x3, #48] /* Q4 */ - nop -17: ldr q2, [x3, #32] /* Q3 */ - nop -18: ldp q0, q1, [x3] /* Q2 */ - b 99f -19: ldr q0, [x3] /* Q1 */ - b 99f -20: ldrb w0, [x3, #BE(7)] /* UINT8 */ - b 99f -21: brk #1000 /* reserved */ - nop -22: ldrh w0, [x3, #BE(6)] /* UINT16 */ - b 99f -23: brk #1000 /* reserved */ - nop -24: ldr w0, [x3, #BE(4)] /* UINT32 */ - b 99f -25: brk #1000 /* reserved */ - nop -26: ldrsb x0, [x3, #BE(7)] /* SINT8 */ - b 99f -27: brk #1000 /* reserved */ - nop -28: ldrsh x0, [x3, #BE(6)] /* SINT16 */ - b 99f -29: brk #1000 /* reserved */ - nop -30: ldrsw x0, [x3, #BE(4)] /* SINT32 */ - nop -31: /* reserved */ -99: ldp x29, x30, [sp], #ffi_closure_SYSV_FS - cfi_adjust_cfa_offset (-ffi_closure_SYSV_FS) - cfi_restore (x29) - cfi_restore (x30) - ret - cfi_endproc - - .globl CNAME(ffi_closure_SYSV) -#ifdef __ELF__ - .type CNAME(ffi_closure_SYSV), #function - .hidden CNAME(ffi_closure_SYSV) - .size CNAME(ffi_closure_SYSV), . - CNAME(ffi_closure_SYSV) -#endif - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#include - .align PAGE_MAX_SHIFT -CNAME(ffi_closure_trampoline_table_page): - .rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE - adr x16, -PAGE_MAX_SIZE - ldp x17, x16, [x16] - br x16 - nop /* each entry in the trampoline config page is 2*sizeof(void*) so the trampoline itself cannot be smaller that 16 bytes */ - .endr - - .globl CNAME(ffi_closure_trampoline_table_page) - #ifdef __ELF__ - .type CNAME(ffi_closure_trampoline_table_page), #function - .hidden CNAME(ffi_closure_trampoline_table_page) - .size CNAME(ffi_closure_trampoline_table_page), . - CNAME(ffi_closure_trampoline_table_page) - #endif -#endif - -#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ - -#ifdef FFI_GO_CLOSURES - .align 4 -CNAME(ffi_go_closure_SYSV_V): - cfi_startproc - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) - - /* Save the argument passing vector registers. */ - stp q0, q1, [sp, #16 + 0] - stp q2, q3, [sp, #16 + 32] - stp q4, q5, [sp, #16 + 64] - stp q6, q7, [sp, #16 + 96] - b 0f - cfi_endproc - - .globl CNAME(ffi_go_closure_SYSV_V) -#ifdef __ELF__ - .type CNAME(ffi_go_closure_SYSV_V), #function - .hidden CNAME(ffi_go_closure_SYSV_V) - .size CNAME(ffi_go_closure_SYSV_V), . - CNAME(ffi_go_closure_SYSV_V) -#endif - - .align 4 - cfi_startproc -CNAME(ffi_go_closure_SYSV): - stp x29, x30, [sp, #-ffi_closure_SYSV_FS]! - cfi_adjust_cfa_offset (ffi_closure_SYSV_FS) - cfi_rel_offset (x29, 0) - cfi_rel_offset (x30, 8) -0: - mov x29, sp - - /* Save the argument passing core registers. */ - stp x0, x1, [sp, #16 + 16*N_V_ARG_REG + 0] - stp x2, x3, [sp, #16 + 16*N_V_ARG_REG + 16] - stp x4, x5, [sp, #16 + 16*N_V_ARG_REG + 32] - stp x6, x7, [sp, #16 + 16*N_V_ARG_REG + 48] - - /* Load ffi_closure_inner arguments. */ - ldp PTR_REG(0), PTR_REG(1), [x18, #PTR_SIZE]/* load cif, fn */ - mov x2, x18 /* load user_data */ - b .Ldo_closure - cfi_endproc - - .globl CNAME(ffi_go_closure_SYSV) -#ifdef __ELF__ - .type CNAME(ffi_go_closure_SYSV), #function - .hidden CNAME(ffi_go_closure_SYSV) - .size CNAME(ffi_go_closure_SYSV), . - CNAME(ffi_go_closure_SYSV) -#endif -#endif /* FFI_GO_CLOSURES */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",%progbits -#endif - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffi.c deleted file mode 100644 index 7a95e97..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffi.c +++ /dev/null @@ -1,521 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Anthony Green - 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 -#include "internal.h" - -/* 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 *stack, void *frame, unsigned flags, - void *raddr, void (*fn)(void), void *closure) - FFI_HIDDEN; -extern void ffi_closure_osf(void) FFI_HIDDEN; -extern void ffi_go_closure_osf(void) FFI_HIDDEN; - -/* Promote a float value to its in-register double representation. - Unlike actually casting to double, this does not trap on NaN. */ -static inline UINT64 lds(void *ptr) -{ - UINT64 ret; - asm("lds %0,%1" : "=f"(ret) : "m"(*(UINT32 *)ptr)); - return ret; -} - -/* And the reverse. */ -static inline void sts(void *ptr, UINT64 val) -{ - asm("sts %1,%0" : "=m"(*(UINT32 *)ptr) : "f"(val)); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - size_t bytes = 0; - int flags, i, avn; - ffi_type *rtype, *itype; - - if (cif->abi != FFI_OSF) - return FFI_BAD_ABI; - - /* Compute the size of the argument area. */ - for (i = 0, avn = cif->nargs; i < avn; i++) - { - itype = cif->arg_types[i]; - switch (itype->type) - { - case FFI_TYPE_INT: - 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_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - /* All take one 8 byte slot. */ - bytes += 8; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - /* Passed by value in N slots. */ - bytes += FFI_ALIGN(itype->size, FFI_SIZEOF_ARG); - break; - - case FFI_TYPE_COMPLEX: - /* _Complex long double passed by reference; others in 2 slots. */ - if (itype->elements[0]->type == FFI_TYPE_LONGDOUBLE) - bytes += 8; - else - bytes += 16; - break; - - default: - abort(); - } - } - - /* Set the return type flag */ - rtype = cif->rtype; - switch (rtype->type) - { - case FFI_TYPE_VOID: - flags = ALPHA_FLAGS(ALPHA_ST_VOID, ALPHA_LD_VOID); - break; - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT32); - break; - case FFI_TYPE_FLOAT: - flags = ALPHA_FLAGS(ALPHA_ST_FLOAT, ALPHA_LD_FLOAT); - break; - case FFI_TYPE_DOUBLE: - flags = ALPHA_FLAGS(ALPHA_ST_DOUBLE, ALPHA_LD_DOUBLE); - break; - case FFI_TYPE_UINT8: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT8); - break; - case FFI_TYPE_SINT8: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT8); - break; - case FFI_TYPE_UINT16: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_UINT16); - break; - case FFI_TYPE_SINT16: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_SINT16); - break; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64); - break; - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - /* Passed in memory, with a hidden pointer. */ - flags = ALPHA_RET_IN_MEM; - break; - case FFI_TYPE_COMPLEX: - itype = rtype->elements[0]; - switch (itype->type) - { - case FFI_TYPE_FLOAT: - flags = ALPHA_FLAGS(ALPHA_ST_CPLXF, ALPHA_LD_CPLXF); - break; - case FFI_TYPE_DOUBLE: - flags = ALPHA_FLAGS(ALPHA_ST_CPLXD, ALPHA_LD_CPLXD); - break; - default: - if (rtype->size <= 8) - flags = ALPHA_FLAGS(ALPHA_ST_INT, ALPHA_LD_INT64); - else - flags = ALPHA_RET_IN_MEM; - break; - } - break; - default: - abort(); - } - cif->flags = flags; - - /* Include the hidden structure pointer in args requirement. */ - if (flags == ALPHA_RET_IN_MEM) - bytes += 8; - /* Minimum size is 6 slots, so that ffi_call_osf can pop them. */ - if (bytes < 6*8) - bytes = 6*8; - cif->bytes = bytes; - - return FFI_OK; -} - -static unsigned long -extend_basic_type(void *valp, int type, int argn) -{ - switch (type) - { - case FFI_TYPE_SINT8: - return *(SINT8 *)valp; - case FFI_TYPE_UINT8: - return *(UINT8 *)valp; - case FFI_TYPE_SINT16: - return *(SINT16 *)valp; - case FFI_TYPE_UINT16: - return *(UINT16 *)valp; - - case FFI_TYPE_FLOAT: - if (argn < 6) - return lds(valp); - /* FALLTHRU */ - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - /* Note that unsigned 32-bit quantities are sign extended. */ - return *(SINT32 *)valp; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_DOUBLE: - return *(UINT64 *)valp; - - default: - abort(); - } -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - unsigned long *argp; - long i, avn, argn, flags = cif->flags; - ffi_type **arg_types; - void *frame; - - /* 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 && flags == ALPHA_RET_IN_MEM) - rvalue = alloca(cif->rtype->size); - - /* Allocate the space for the arguments, plus 4 words of temp - space for ffi_call_osf. */ - argp = frame = alloca(cif->bytes + 4*FFI_SIZEOF_ARG); - frame += cif->bytes; - - argn = 0; - if (flags == ALPHA_RET_IN_MEM) - argp[argn++] = (unsigned long)rvalue; - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0, avn = cif->nargs; i < avn; i++) - { - ffi_type *ty = arg_types[i]; - void *valp = avalue[i]; - int type = ty->type; - size_t size; - - switch (type) - { - case FFI_TYPE_INT: - 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_FLOAT: - case FFI_TYPE_DOUBLE: - argp[argn] = extend_basic_type(valp, type, argn); - argn++; - break; - - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* Note that 128-bit long double is passed by reference. */ - argp[argn++] = (unsigned long)valp; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - size = ty->size; - memcpy(argp + argn, valp, size); - argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - break; - - case FFI_TYPE_COMPLEX: - type = ty->elements[0]->type; - if (type == FFI_TYPE_LONGDOUBLE) - goto by_reference; - - /* Most complex types passed as two separate arguments. */ - size = ty->elements[0]->size; - argp[argn] = extend_basic_type(valp, type, argn); - argp[argn + 1] = extend_basic_type(valp + size, type, argn + 1); - argn += 2; - break; - - default: - abort(); - } - } - - flags = (flags >> ALPHA_ST_SHIFT) & 0xff; - ffi_call_osf(argp, frame, flags, rvalue, fn, closure); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int(cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int(cif, fn, rvalue, avalue, 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) -{ - unsigned int *tramp; - - if (cif->abi != FFI_OSF) - return FFI_BAD_ABI; - - 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; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - if (cif->abi != FFI_OSF) - return FFI_BAD_ABI; - - closure->tramp = (void *)ffi_go_closure_osf; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -long FFI_HIDDEN -ffi_closure_osf_inner (ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, unsigned long *argp) -{ - void **avalue; - ffi_type **arg_types; - long i, avn, argn, flags; - - avalue = alloca(cif->nargs * sizeof(void *)); - flags = cif->flags; - argn = 0; - - /* Copy the caller's structure return address to that the closure - returns the data directly to the caller. */ - if (flags == ALPHA_RET_IN_MEM) - { - rvalue = (void *) argp[0]; - argn = 1; - } - - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0, avn = cif->nargs; i < avn; i++) - { - ffi_type *ty = arg_types[i]; - int type = ty->type; - void *valp = &argp[argn]; - size_t size; - - switch (type) - { - case FFI_TYPE_INT: - 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: - argn += 1; - break; - - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - size = ty->size; - argn += FFI_ALIGN(size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - break; - - case FFI_TYPE_FLOAT: - /* Floats coming from registers need conversion from double - back to float format. */ - if (argn < 6) - { - valp = &argp[argn - 6]; - sts(valp, argp[argn - 6]); - } - argn += 1; - break; - - case FFI_TYPE_DOUBLE: - if (argn < 6) - valp = &argp[argn - 6]; - argn += 1; - break; - - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* 128-bit long double is passed by reference. */ - valp = (void *)argp[argn]; - argn += 1; - break; - - case FFI_TYPE_COMPLEX: - type = ty->elements[0]->type; - switch (type) - { - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - /* Passed as separate arguments, but they wind up sequential. */ - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - /* Passed as separate arguments. Disjoint, but there's room - enough in one slot to hold the pair. */ - size = ty->elements[0]->size; - memcpy(valp + size, valp + 8, size); - break; - - case FFI_TYPE_FLOAT: - /* Passed as separate arguments. Disjoint, and each piece - may need conversion back to float. */ - if (argn < 6) - { - valp = &argp[argn - 6]; - sts(valp, argp[argn - 6]); - } - if (argn + 1 < 6) - sts(valp + 4, argp[argn + 1 - 6]); - else - *(UINT32 *)(valp + 4) = argp[argn + 1]; - break; - - case FFI_TYPE_DOUBLE: - /* Passed as separate arguments. Only disjoint if one part - is in fp regs and the other is on the stack. */ - if (argn < 5) - valp = &argp[argn - 6]; - else if (argn == 5) - { - valp = alloca(16); - ((UINT64 *)valp)[0] = argp[5 - 6]; - ((UINT64 *)valp)[1] = argp[6]; - } - break; - - case FFI_TYPE_LONGDOUBLE: - goto by_reference; - - default: - abort(); - } - argn += 2; - break; - - default: - abort (); - } - - avalue[i] = valp; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_osf how to perform return type promotions. */ - return (flags >> ALPHA_LD_SHIFT) & 0xff; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffitarget.h deleted file mode 100644 index a02dbd0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/ffitarget.h +++ /dev/null @@ -1,57 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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 - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION -#define FFI_TARGET_HAS_COMPLEX_TYPE - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_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.25/ext/ffi_c/libffi/src/alpha/internal.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/internal.h deleted file mode 100644 index 44da192..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/internal.h +++ /dev/null @@ -1,23 +0,0 @@ -#define ALPHA_ST_VOID 0 -#define ALPHA_ST_INT 1 -#define ALPHA_ST_FLOAT 2 -#define ALPHA_ST_DOUBLE 3 -#define ALPHA_ST_CPLXF 4 -#define ALPHA_ST_CPLXD 5 - -#define ALPHA_LD_VOID 0 -#define ALPHA_LD_INT64 1 -#define ALPHA_LD_INT32 2 -#define ALPHA_LD_UINT16 3 -#define ALPHA_LD_SINT16 4 -#define ALPHA_LD_UINT8 5 -#define ALPHA_LD_SINT8 6 -#define ALPHA_LD_FLOAT 7 -#define ALPHA_LD_DOUBLE 8 -#define ALPHA_LD_CPLXF 9 -#define ALPHA_LD_CPLXD 10 - -#define ALPHA_ST_SHIFT 0 -#define ALPHA_LD_SHIFT 8 -#define ALPHA_RET_IN_MEM 0x10000 -#define ALPHA_FLAGS(S, L) (((L) << ALPHA_LD_SHIFT) | (S)) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/osf.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/osf.S deleted file mode 100644 index b031828..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/alpha/osf.S +++ /dev/null @@ -1,282 +0,0 @@ -/* ----------------------------------------------------------------------- - osf.S - Copyright (c) 1998, 2001, 2007, 2008, 2011, 2014 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 -#include -#include "internal.h" - - .arch ev6 - .text - -/* Aid in building a direct addressed jump table, 4 insns per entry. */ -.macro E index - .align 4 - .org 99b + \index * 16 -.endm - -/* ffi_call_osf (void *stack, void *frame, unsigned flags, - void *raddr, void (*fnaddr)(void), void *closure) - - Bit o trickiness here -- FRAME 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 4 - .globl ffi_call_osf - .ent ffi_call_osf - FFI_HIDDEN(ffi_call_osf) - -ffi_call_osf: - cfi_startproc - cfi_def_cfa($17, 32) - mov $16, $30 - stq $26, 0($17) - stq $15, 8($17) - mov $17, $15 - .prologue 0 - cfi_def_cfa_register($15) - cfi_rel_offset($26, 0) - cfi_rel_offset($15, 8) - - stq $18, 16($17) # save flags into frame - stq $19, 24($17) # save rvalue into frame - mov $20, $27 # fn into place for call - mov $21, $1 # closure into static chain - - # 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 -0: - ldah $29, 0($26) !gpdisp!1 - ldq $2, 24($15) # reload rvalue - lda $29, 0($29) !gpdisp!1 - ldq $3, 16($15) # reload flags - lda $1, 99f-0b($26) - ldq $26, 0($15) - ldq $15, 8($15) - cfi_restore($26) - cfi_restore($15) - cfi_def_cfa($sp, 0) - cmoveq $2, ALPHA_ST_VOID, $3 # mash null rvalue to void - addq $3, $3, $3 - s8addq $3, $1, $1 # 99f + stcode * 16 - jmp $31, ($1), $st_int - - .align 4 -99: -E ALPHA_ST_VOID - ret -E ALPHA_ST_INT -$st_int: - stq $0, 0($2) - ret -E ALPHA_ST_FLOAT - sts $f0, 0($2) - ret -E ALPHA_ST_DOUBLE - stt $f0, 0($2) - ret -E ALPHA_ST_CPLXF - sts $f0, 0($2) - sts $f1, 4($2) - ret -E ALPHA_ST_CPLXD - stt $f0, 0($2) - stt $f1, 8($2) - ret - - cfi_endproc - .end ffi_call_osf - -/* ffi_closure_osf(...) - - Receives the closure argument in $1. */ - -#define CLOSURE_FS (16*8) - - .align 4 - .globl ffi_go_closure_osf - .ent ffi_go_closure_osf - FFI_HIDDEN(ffi_go_closure_osf) - -ffi_go_closure_osf: - cfi_startproc - ldgp $29, 0($27) - subq $30, CLOSURE_FS, $30 - cfi_adjust_cfa_offset(CLOSURE_FS) - stq $26, 0($30) - .prologue 1 - cfi_rel_offset($26, 0) - - stq $16, 10*8($30) - stq $17, 11*8($30) - stq $18, 12*8($30) - - ldq $16, 8($1) # load cif - ldq $17, 16($1) # load fun - mov $1, $18 # closure is user_data - br $do_closure - - cfi_endproc - .end ffi_go_closure_osf - - .align 4 - .globl ffi_closure_osf - .ent ffi_closure_osf - FFI_HIDDEN(ffi_closure_osf) - -ffi_closure_osf: - cfi_startproc - ldgp $29, 0($27) - subq $30, CLOSURE_FS, $30 - cfi_adjust_cfa_offset(CLOSURE_FS) - stq $26, 0($30) - .prologue 1 - cfi_rel_offset($26, 0) - - # Store all of the potential argument registers in va_list format. - stq $16, 10*8($30) - stq $17, 11*8($30) - stq $18, 12*8($30) - - ldq $16, 24($1) # load cif - ldq $17, 32($1) # load fun - ldq $18, 40($1) # load user_data - -$do_closure: - stq $19, 13*8($30) - stq $20, 14*8($30) - stq $21, 15*8($30) - 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) - - # Call ffi_closure_osf_inner to do the bulk of the work. - lda $19, 2*8($30) - lda $20, 10*8($30) - jsr $26, ffi_closure_osf_inner -0: - ldah $29, 0($26) !gpdisp!2 - lda $2, 99f-0b($26) - s4addq $0, 0, $1 # ldcode * 4 - ldq $0, 16($30) # preload return value - s4addq $1, $2, $1 # 99f + ldcode * 16 - lda $29, 0($29) !gpdisp!2 - ldq $26, 0($30) - cfi_restore($26) - jmp $31, ($1), $load_32 - -.macro epilogue - addq $30, CLOSURE_FS, $30 - cfi_adjust_cfa_offset(-CLOSURE_FS) - ret - .align 4 - cfi_adjust_cfa_offset(CLOSURE_FS) -.endm - - .align 4 -99: -E ALPHA_LD_VOID - epilogue - -E ALPHA_LD_INT64 - epilogue - -E ALPHA_LD_INT32 -$load_32: - sextl $0, $0 - epilogue - -E ALPHA_LD_UINT16 - zapnot $0, 3, $0 - epilogue - -E ALPHA_LD_SINT16 -#ifdef __alpha_bwx__ - sextw $0, $0 -#else - sll $0, 48, $0 - sra $0, 48, $0 -#endif - epilogue - -E ALPHA_LD_UINT8 - and $0, 0xff, $0 - epilogue - -E ALPHA_LD_SINT8 -#ifdef __alpha_bwx__ - sextb $0, $0 -#else - sll $0, 56, $0 - sra $0, 56, $0 -#endif - epilogue - -E ALPHA_LD_FLOAT - lds $f0, 16($sp) - epilogue - -E ALPHA_LD_DOUBLE - ldt $f0, 16($sp) - epilogue - -E ALPHA_LD_CPLXF - lds $f0, 16($sp) - lds $f1, 20($sp) - epilogue - -E ALPHA_LD_CPLXD - ldt $f0, 16($sp) - ldt $f1, 24($sp) - epilogue - - cfi_endproc - .end ffi_closure_osf - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/arcompact.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/arcompact.S deleted file mode 100644 index 03715fd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/arcompact.S +++ /dev/null @@ -1,135 +0,0 @@ -/* ----------------------------------------------------------------------- - arcompact.S - Copyright (c) 2013 Synposys, Inc. (www.synopsys.com) - - ARCompact 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 -#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 */ - /* R4: ecif.rvalue */ - /* R5: fn */ -ENTRY(ffi_call_ARCompact) - /* Save registers. */ - st.a fp, [sp, -4] /* fp + 20, fp */ - push_s blink /* fp + 16, blink */ - st.a r4, [sp, -4] /* fp + 12, ecif.rvalue */ - push_s r3 /* fp + 8, fig->flags */ - st.a r5, [sp, -4] /* fp + 4, fn */ - push_s r2 /* fp + 0, cif->bytes */ - mov fp, sp - - /* Make room for all of the new args. */ - sub sp, sp, r2 - - /* Place all of the ffi_prep_args in position. */ - /* ffi_prep_args(char *stack, extended_cif *ecif) */ - /* R1 already set. */ - - /* And call. */ - jl_s.d [r0] - mov_s r0, sp - - ld.ab r12, [fp, 4] /* cif->bytes */ - ld.ab r11, [fp, 4] /* fn */ - - /* Move first 8 parameters in registers... */ - ld_s r0, [sp] - ld_s r1, [sp, 4] - ld_s r2, [sp, 8] - ld_s r3, [sp, 12] - ld r4, [sp, 16] - ld r5, [sp, 20] - ld r6, [sp, 24] - ld r7, [sp, 28] - - /* ...and adjust the stack. */ - min r12, r12, 32 - - /* Call the function. */ - jl.d [r11] - add sp, sp, r12 - - mov sp, fp - pop_s r3 /* fig->flags, return type */ - pop_s r2 /* ecif.rvalue, pointer for return value */ - - /* If the return value pointer is NULL, assume no return value. */ - breq.d r2, 0, epilogue - pop_s blink - - /* Return INT. */ - brne r3, FFI_TYPE_INT, return_double - b.d epilogue - st_s r0, [r2] - -return_double: - brne r3, FFI_TYPE_DOUBLE, epilogue - st_s r0, [r2] - st_s r1, [r2,4] - -epilogue: - j_s.d [blink] - ld.ab fp, [sp, 4] - -ENTRY(ffi_closure_ARCompact) - st.a r0, [sp, -32] - st_s r1, [sp, 4] - st_s r2, [sp, 8] - st_s r3, [sp, 12] - st r4, [sp, 16] - st r5, [sp, 20] - st r6, [sp, 24] - st r7, [sp, 28] - - /* pointer to arguments */ - mov_s r2, sp - - /* return value goes here */ - sub sp, sp, 8 - mov_s r1, sp - - push_s blink - - bl.d ffi_closure_inner_ARCompact - mov_s r0, r8 /* codeloc, set by trampoline */ - - pop_s blink - - /* set return value to r1:r0 */ - pop_s r0 - pop_s r1 - j_s.d [blink] - add_s sp, sp, 32 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffi.c deleted file mode 100644 index 4d10b21..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffi.c +++ /dev/null @@ -1,266 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) - - ARC 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 -#include - -#include - -/* for little endian ARC, the code is in fact stored as mixed endian for - performance reasons */ -#if __BIG_ENDIAN__ -#define CODE_ENDIAN(x) (x) -#else -#define CODE_ENDIAN(x) ( (((uint32_t) (x)) << 16) | (((uint32_t) (x)) >> 16)) -#endif - -/* 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; - void **p_argv; - char *argp; - ffi_type **p_arg; - - argp = stack; - - if (ecif->cif->rtype->type == 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; - int alignment; - - /* align alignment to 4 */ - alignment = (((*p_arg)->alignment - 1) | 3) + 1; - - /* Align if necessary. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - 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 - { - if ((*p_arg)->type == FFI_TYPE_STRUCT) - { - memcpy (argp, *p_argv, z); - } - 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: - 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_ARCompact (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_ARCOMPACT: - ffi_call_ARCompact (ffi_prep_args, &ecif, cif->bytes, - cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -int -ffi_closure_inner_ARCompact (ffi_closure * closure, void *rvalue, - ffi_arg * args) -{ - void **arg_area, **p_argv; - ffi_cif *cif = closure->cif; - char *argp = (char *) args; - ffi_type **p_argt; - int i; - - arg_area = (void **) alloca (cif->nargs * sizeof (void *)); - - /* handle hidden argument */ - if (cif->flags == FFI_TYPE_STRUCT) - { - rvalue = *(void **) argp; - argp += 4; - } - - p_argv = arg_area; - - for (i = 0, p_argt = cif->arg_types; i < cif->nargs; - i++, p_argt++, p_argv++) - { - size_t z; - int alignment; - - /* align alignment to 4 */ - alignment = (((*p_argt)->alignment - 1) | 3) + 1; - - /* Align if necessary. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - z = (*p_argt)->size; - *p_argv = (void *) argp; - argp += z; - } - - (closure->fun) (cif, rvalue, arg_area, closure->user_data); - - return cif->flags; -} - -extern void ffi_closure_ARCompact (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_t *tramp = (uint32_t *) & (closure->tramp[0]); - - switch (cif->abi) - { - case FFI_ARCOMPACT: - FFI_ASSERT (tramp == codeloc); - tramp[0] = CODE_ENDIAN (0x200a1fc0); /* mov r8, pcl */ - tramp[1] = CODE_ENDIAN (0x20200f80); /* j [long imm] */ - tramp[2] = CODE_ENDIAN (ffi_closure_ARCompact); - break; - - default: - return FFI_BAD_ABI; - } - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - cacheflush (codeloc, FFI_TRAMPOLINE_SIZE, BCACHE); - - return FFI_OK; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffitarget.h deleted file mode 100644 index bf8311b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arc/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2013 Synopsys, Inc. (www.synopsys.com) - Target configuration macros for ARC. - - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- 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_ARCOMPACT, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_ARCOMPACT -} ffi_abi; -#endif - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 12 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffi.c deleted file mode 100644 index d838271..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffi.c +++ /dev/null @@ -1,819 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011 Timothy Wall - 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 -#include -#include -#include "internal.h" - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#include -#endif - -#else -extern unsigned int ffi_arm_trampoline[2] FFI_HIDDEN; -#endif - -/* Forward declares. */ -static int vfp_type_p (const ffi_type *); -static void layout_vfp_args (ffi_cif *); - -static void * -ffi_align (ffi_type *ty, void *p) -{ - /* Align if necessary */ - size_t alignment; -#ifdef _WIN32_WCE - alignment = 4; -#else - alignment = ty->alignment; - if (alignment < 4) - alignment = 4; -#endif - return (void *) FFI_ALIGN (p, alignment); -} - -static size_t -ffi_put_arg (ffi_type *ty, void *src, void *dst) -{ - size_t z = ty->size; - - switch (ty->type) - { - case FFI_TYPE_SINT8: - *(UINT32 *)dst = *(SINT8 *)src; - break; - case FFI_TYPE_UINT8: - *(UINT32 *)dst = *(UINT8 *)src; - break; - case FFI_TYPE_SINT16: - *(UINT32 *)dst = *(SINT16 *)src; - break; - case FFI_TYPE_UINT16: - *(UINT32 *)dst = *(UINT16 *)src; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - case FFI_TYPE_FLOAT: - *(UINT32 *)dst = *(UINT32 *)src; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - *(UINT64 *)dst = *(UINT64 *)src; - break; - - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - memcpy (dst, src, z); - break; - - default: - abort(); - } - - return FFI_ALIGN (z, 4); -} - -/* ffi_prep_args is called 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. -*/ -static void -ffi_prep_args_SYSV (ffi_cif *cif, int flags, void *rvalue, - void **avalue, char *argp) -{ - ffi_type **arg_types = cif->arg_types; - int i, n; - - if (flags == ARM_TYPE_STRUCT) - { - *(void **) argp = rvalue; - argp += 4; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - argp = ffi_align (ty, argp); - argp += ffi_put_arg (ty, avalue[i], argp); - } -} - -static void -ffi_prep_args_VFP (ffi_cif *cif, int flags, void *rvalue, - void **avalue, char *stack, char *vfp_space) -{ - ffi_type **arg_types = cif->arg_types; - int i, n, vi = 0; - char *argp, *regp, *eo_regp; - char stack_used = 0; - char done_with_regs = 0; - - /* The first 4 words on the stack are used for values - passed in core registers. */ - regp = stack; - eo_regp = argp = regp + 16; - - /* If the function returns an FFI_TYPE_STRUCT in memory, - that address is passed in r0 to the function. */ - if (flags == ARM_TYPE_STRUCT) - { - *(void **) regp = rvalue; - regp += 4; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - void *a = avalue[i]; - int is_vfp_type = vfp_type_p (ty); - - /* Allocated in VFP registers. */ - if (vi < cif->vfp_nargs && is_vfp_type) - { - char *vfp_slot = vfp_space + cif->vfp_args[vi++] * 4; - ffi_put_arg (ty, a, vfp_slot); - continue; - } - /* Try allocating in core registers. */ - else if (!done_with_regs && !is_vfp_type) - { - char *tregp = ffi_align (ty, regp); - size_t size = ty->size; - size = (size < 4) ? 4 : size; // pad - /* Check if there is space left in the aligned register - area to place the argument. */ - if (tregp + size <= eo_regp) - { - regp = tregp + ffi_put_arg (ty, a, tregp); - done_with_regs = (regp == argp); - // ensure we did not write into the stack area - FFI_ASSERT (regp <= argp); - continue; - } - /* In case there are no arguments in the stack area yet, - the argument is passed in the remaining core registers - and on the stack. */ - else if (!stack_used) - { - stack_used = 1; - done_with_regs = 1; - argp = tregp + ffi_put_arg (ty, a, tregp); - FFI_ASSERT (eo_regp < argp); - continue; - } - } - /* Base case, arguments are passed on the stack */ - stack_used = 1; - argp = ffi_align (ty, argp); - argp += ffi_put_arg (ty, a, argp); - } -} - -/* Perform machine dependent cif processing */ -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - int flags = 0, cabi = cif->abi; - size_t bytes = cif->bytes; - - /* 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 (cabi == FFI_VFP) - layout_vfp_args (cif); - - /* Set the return type flag */ - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - flags = ARM_TYPE_VOID; - break; - - case FFI_TYPE_INT: - 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_POINTER: - flags = ARM_TYPE_INT; - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = ARM_TYPE_INT64; - break; - - case FFI_TYPE_FLOAT: - flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_S : ARM_TYPE_INT); - break; - case FFI_TYPE_DOUBLE: - flags = (cabi == FFI_VFP ? ARM_TYPE_VFP_D : ARM_TYPE_INT64); - break; - - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - if (cabi == FFI_VFP) - { - int h = vfp_type_p (cif->rtype); - - flags = ARM_TYPE_VFP_N; - if (h == 0x100 + FFI_TYPE_FLOAT) - flags = ARM_TYPE_VFP_S; - if (h == 0x100 + FFI_TYPE_DOUBLE) - flags = ARM_TYPE_VFP_D; - if (h != 0) - break; - } - - /* A Composite Type not larger than 4 bytes is returned in r0. - A Composite Type larger than 4 bytes, or whose size cannot - be determined statically ... is stored in memory at an - address passed [in r0]. */ - if (cif->rtype->size <= 4) - flags = ARM_TYPE_INT; - else - { - flags = ARM_TYPE_STRUCT; - bytes += 4; - } - break; - - default: - abort(); - } - - /* 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. */ - bytes = FFI_ALIGN (bytes, 8); - - /* Minimum stack space is the 4 register arguments that we pop. */ - if (bytes < 4*4) - bytes = 4*4; - - cif->bytes = bytes; - cif->flags = flags; - - return FFI_OK; -} - -/* Perform machine dependent cif processing for variadic calls */ -ffi_status -ffi_prep_cif_machdep_var (ffi_cif * cif, - unsigned int nfixedargs, unsigned int ntotalargs) -{ - /* VFP variadic calls actually use the SYSV ABI */ - if (cif->abi == FFI_VFP) - cif->abi = FFI_SYSV; - - return ffi_prep_cif_machdep (cif); -} - -/* Prototypes for assembly functions, in sysv.S. */ - -struct call_frame -{ - void *fp; - void *lr; - void *rvalue; - int flags; - void *closure; -}; - -extern void ffi_call_SYSV (void *stack, struct call_frame *, - void (*fn) (void)) FFI_HIDDEN; -extern void ffi_call_VFP (void *vfp_space, struct call_frame *, - void (*fn) (void), unsigned vfp_used) FFI_HIDDEN; - -static void -ffi_call_int (ffi_cif * cif, void (*fn) (void), void *rvalue, - void **avalue, void *closure) -{ - int flags = cif->flags; - ffi_type *rtype = cif->rtype; - size_t bytes, rsize, vfp_size; - char *stack, *vfp_space, *new_rvalue; - struct call_frame *frame; - - rsize = 0; - if (rvalue == NULL) - { - /* If the return value is a struct and we don't have a return - value address then we need to make one. Otherwise the return - value is in registers and we can ignore them. */ - if (flags == ARM_TYPE_STRUCT) - rsize = rtype->size; - else - flags = ARM_TYPE_VOID; - } - else if (flags == ARM_TYPE_VFP_N) - { - /* Largest case is double x 4. */ - rsize = 32; - } - else if (flags == ARM_TYPE_INT && rtype->type == FFI_TYPE_STRUCT) - rsize = 4; - - /* Largest case. */ - vfp_size = (cif->abi == FFI_VFP && cif->vfp_used ? 8*8: 0); - - bytes = cif->bytes; - stack = alloca (vfp_size + bytes + sizeof(struct call_frame) + rsize); - - vfp_space = NULL; - if (vfp_size) - { - vfp_space = stack; - stack += vfp_size; - } - - frame = (struct call_frame *)(stack + bytes); - - new_rvalue = rvalue; - if (rsize) - new_rvalue = (void *)(frame + 1); - - frame->rvalue = new_rvalue; - frame->flags = flags; - frame->closure = closure; - - if (vfp_space) - { - ffi_prep_args_VFP (cif, flags, new_rvalue, avalue, stack, vfp_space); - ffi_call_VFP (vfp_space, frame, fn, cif->vfp_used); - } - else - { - ffi_prep_args_SYSV (cif, flags, new_rvalue, avalue, stack); - ffi_call_SYSV (stack, frame, fn); - } - - if (rvalue && rvalue != new_rvalue) - memcpy (rvalue, new_rvalue, rtype->size); -} - -void -ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - -static void * -ffi_prep_incoming_args_SYSV (ffi_cif *cif, void *rvalue, - char *argp, void **avalue) -{ - ffi_type **arg_types = cif->arg_types; - int i, n; - - if (cif->flags == ARM_TYPE_STRUCT) - { - rvalue = *(void **) argp; - argp += 4; - } - else - { - if (cif->rtype->size && cif->rtype->size < 4) - *(uint32_t *) rvalue = 0; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - size_t z = ty->size; - - argp = ffi_align (ty, argp); - avalue[i] = (void *) argp; - argp += z; - } - - return rvalue; -} - -static void * -ffi_prep_incoming_args_VFP (ffi_cif *cif, void *rvalue, char *stack, - char *vfp_space, void **avalue) -{ - ffi_type **arg_types = cif->arg_types; - int i, n, vi = 0; - char *argp, *regp, *eo_regp; - char done_with_regs = 0; - char stack_used = 0; - - regp = stack; - eo_regp = argp = regp + 16; - - if (cif->flags == ARM_TYPE_STRUCT) - { - rvalue = *(void **) regp; - regp += 4; - } - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - int is_vfp_type = vfp_type_p (ty); - size_t z = ty->size; - - if (vi < cif->vfp_nargs && is_vfp_type) - { - avalue[i] = vfp_space + cif->vfp_args[vi++] * 4; - continue; - } - else if (!done_with_regs && !is_vfp_type) - { - char *tregp = ffi_align (ty, regp); - - z = (z < 4) ? 4 : z; // pad - - /* If the arguments either fits into the registers or uses registers - and stack, while we haven't read other things from the stack */ - if (tregp + z <= eo_regp || !stack_used) - { - /* Because we're little endian, this is what it turns into. */ - avalue[i] = (void *) tregp; - regp = tregp + z; - - /* If we read past the last core register, make sure we - have not read from the stack before and continue - reading after regp. */ - if (regp > eo_regp) - { - FFI_ASSERT (!stack_used); - argp = regp; - } - if (regp >= eo_regp) - { - done_with_regs = 1; - stack_used = 1; - } - continue; - } - } - - stack_used = 1; - argp = ffi_align (ty, argp); - avalue[i] = (void *) argp; - argp += z; - } - - return rvalue; -} - -struct closure_frame -{ - char vfp_space[8*8] __attribute__((aligned(8))); - char result[8*4]; - char argp[]; -}; - -int FFI_HIDDEN -ffi_closure_inner_SYSV (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - struct closure_frame *frame) -{ - void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); - void *rvalue = ffi_prep_incoming_args_SYSV (cif, frame->result, - frame->argp, avalue); - fun (cif, rvalue, avalue, user_data); - return cif->flags; -} - -int FFI_HIDDEN -ffi_closure_inner_VFP (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - struct closure_frame *frame) -{ - void **avalue = (void **) alloca (cif->nargs * sizeof (void *)); - void *rvalue = ffi_prep_incoming_args_VFP (cif, frame->result, frame->argp, - frame->vfp_space, avalue); - fun (cif, rvalue, avalue, user_data); - return cif->flags; -} - -void ffi_closure_SYSV (void) FFI_HIDDEN; -void ffi_closure_VFP (void) FFI_HIDDEN; -void ffi_go_closure_SYSV (void) FFI_HIDDEN; -void ffi_go_closure_VFP (void) FFI_HIDDEN; - -/* 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) (void) = ffi_closure_SYSV; - - if (cif->abi == FFI_VFP) - { - /* We only need take the vfp path if there are vfp arguments. */ - if (cif->vfp_used) - closure_func = ffi_closure_VFP; - } - else if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - -#if FFI_EXEC_TRAMPOLINE_TABLE - void **config = (void **)((uint8_t *)codeloc - PAGE_MAX_SIZE); - config[0] = closure; - config[1] = closure_func; -#else - memcpy (closure->tramp, ffi_arm_trampoline, 8); -#if defined (__QNX__) - msync(closure->tramp, 8, 0x1000000); /* clear data map */ - msync(codeloc, 8, 0x1000000); /* clear insn map */ -#else - __clear_cache(closure->tramp, closure->tramp + 8); /* clear data map */ - __clear_cache(codeloc, codeloc + 8); /* clear insn map */ -#endif - *(void (**)(void))(closure->tramp + 8) = closure_func; -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *)) -{ - void (*closure_func) (void) = ffi_go_closure_SYSV; - - if (cif->abi == FFI_VFP) - { - /* We only need take the vfp path if there are vfp arguments. */ - if (cif->vfp_used) - closure_func = ffi_go_closure_VFP; - } - else if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - closure->tramp = closure_func; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -/* Below are routines for VFP hard-float support. */ - -/* A subroutine of vfp_type_p. Given a structure type, return the type code - of the first non-structure element. Recurse for structure elements. - Return -1 if the structure is in fact empty, i.e. no nested elements. */ - -static int -is_hfa0 (const ffi_type *ty) -{ - ffi_type **elements = ty->elements; - int i, ret = -1; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - ret = elements[i]->type; - if (ret == FFI_TYPE_STRUCT || ret == FFI_TYPE_COMPLEX) - { - ret = is_hfa0 (elements[i]); - if (ret < 0) - continue; - } - break; - } - - return ret; -} - -/* A subroutine of vfp_type_p. Given a structure type, return true if all - of the non-structure elements are the same as CANDIDATE. */ - -static int -is_hfa1 (const ffi_type *ty, int candidate) -{ - ffi_type **elements = ty->elements; - int i; - - if (elements != NULL) - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - return 1; -} - -/* Determine if TY is an homogenous floating point aggregate (HFA). - That is, a structure consisting of 1 to 4 members of all the same type, - where that type is a floating point scalar. - - Returns non-zero iff TY is an HFA. The result is an encoded value where - bits 0-7 contain the type code, and bits 8-10 contain the element count. */ - -static int -vfp_type_p (const ffi_type *ty) -{ - ffi_type **elements; - int candidate, i; - size_t size, ele_count; - - /* Quickest tests first. */ - candidate = ty->type; - switch (ty->type) - { - default: - return 0; - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - ele_count = 1; - goto done; - case FFI_TYPE_COMPLEX: - candidate = ty->elements[0]->type; - if (candidate != FFI_TYPE_FLOAT && candidate != FFI_TYPE_DOUBLE) - return 0; - ele_count = 2; - goto done; - case FFI_TYPE_STRUCT: - break; - } - - /* No HFA types are smaller than 4 bytes, or larger than 32 bytes. */ - size = ty->size; - if (size < 4 || size > 32) - return 0; - - /* Find the type of the first non-structure member. */ - elements = ty->elements; - candidate = elements[0]->type; - if (candidate == FFI_TYPE_STRUCT || candidate == FFI_TYPE_COMPLEX) - { - for (i = 0; ; ++i) - { - candidate = is_hfa0 (elements[i]); - if (candidate >= 0) - break; - } - } - - /* If the first member is not a floating point type, it's not an HFA. - Also quickly re-check the size of the structure. */ - switch (candidate) - { - case FFI_TYPE_FLOAT: - ele_count = size / sizeof(float); - if (size != ele_count * sizeof(float)) - return 0; - break; - case FFI_TYPE_DOUBLE: - ele_count = size / sizeof(double); - if (size != ele_count * sizeof(double)) - return 0; - break; - default: - return 0; - } - if (ele_count > 4) - return 0; - - /* Finally, make sure that all scalar elements are the same type. */ - for (i = 0; elements[i]; ++i) - { - int t = elements[i]->type; - if (t == FFI_TYPE_STRUCT || t == FFI_TYPE_COMPLEX) - { - if (!is_hfa1 (elements[i], candidate)) - return 0; - } - else if (t != candidate) - return 0; - } - - /* All tests succeeded. Encode the result. */ - done: - return (ele_count << 8) | candidate; -} - -static int -place_vfp_arg (ffi_cif *cif, int h) -{ - unsigned short reg = cif->vfp_reg_free; - int align = 1, nregs = h >> 8; - - if ((h & 0xff) == FFI_TYPE_DOUBLE) - align = 2, nregs *= 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 0; - next_reg:; - } - // done, mark all regs as used - cif->vfp_reg_free = 16; - cif->vfp_used = 0xFFFF; - return 1; -} - -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++) - { - int h = vfp_type_p (cif->arg_types[i]); - if (h && place_vfp_arg (cif, h) == 1) - break; - } -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffitarget.h deleted file mode 100644 index 1cf1036..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/ffitarget.h +++ /dev/null @@ -1,82 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (c) 2010 CodeSourcery - Copyright (c) 1996-2003 Red Hat, Inc. - - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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; \ - unsigned short vfp_reg_free, vfp_nargs; \ - signed char vfp_args[16] \ - -#define FFI_TARGET_SPECIFIC_VARIADIC -#define FFI_TARGET_HAS_COMPLEX_TYPE - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#if defined (FFI_EXEC_TRAMPOLINE_TABLE) && FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#define FFI_TRAMPOLINE_SIZE 12 -#define FFI_TRAMPOLINE_CLOSURE_OFFSET 8 -#else -#error "No trampoline table implementation" -#endif - -#else -#define FFI_TRAMPOLINE_SIZE 12 -#define FFI_TRAMPOLINE_CLOSURE_OFFSET FFI_TRAMPOLINE_SIZE -#endif - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/internal.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/internal.h deleted file mode 100644 index 6cf0b2a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/internal.h +++ /dev/null @@ -1,7 +0,0 @@ -#define ARM_TYPE_VFP_S 0 -#define ARM_TYPE_VFP_D 1 -#define ARM_TYPE_VFP_N 2 -#define ARM_TYPE_INT64 3 -#define ARM_TYPE_INT 4 -#define ARM_TYPE_VOID 5 -#define ARM_TYPE_STRUCT 6 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/sysv.S deleted file mode 100644 index 7bda640..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/arm/sysv.S +++ /dev/null @@ -1,383 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 -#include -#include "internal.h" - -/* GCC 4.8 provides __ARM_ARCH; construct it otherwise. */ -#ifndef __ARM_ARCH -# if defined(__ARM_ARCH_7__) || defined(__ARM_ARCH_7A__) \ - || defined(__ARM_ARCH_7R__) || defined(__ARM_ARCH_7M__) \ - || defined(__ARM_ARCH_7EM__) -# define __ARM_ARCH 7 -# elif 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__) -# define __ARM_ARCH 6 -# elif defined(__ARM_ARCH_5__) || defined(__ARM_ARCH_5T__) \ - || defined(__ARM_ARCH_5E__) || defined(__ARM_ARCH_5TE__) \ - || defined(__ARM_ARCH_5TEJ__) -# define __ARM_ARCH 5 -# else -# define __ARM_ARCH 4 -# endif -#endif - -/* Conditionally compile unwinder directives. */ -#ifdef __ARM_EABI__ -# define UNWIND(...) __VA_ARGS__ -#else -# define UNWIND(...) -#endif - -#if defined(HAVE_AS_CFI_PSEUDO_OP) && defined(__ARM_EABI__) - .cfi_sections .debug_frame -#endif - -#define CONCAT(a, b) CONCAT2(a, b) -#define CONCAT2(a, b) a ## b - -#ifdef __USER_LABEL_PREFIX__ -# define CNAME(X) CONCAT (__USER_LABEL_PREFIX__, X) -#else -# define CNAME(X) X -#endif -#ifdef __ELF__ -# define SIZE(X) .size CNAME(X), . - CNAME(X) -# define TYPE(X, Y) .type CNAME(X), Y -#else -# define SIZE(X) -# define TYPE(X, Y) -#endif - -#define ARM_FUNC_START_LOCAL(name) \ - .align 3; \ - TYPE(CNAME(name), %function); \ - CNAME(name): - -#define ARM_FUNC_START(name) \ - .globl CNAME(name); \ - FFI_HIDDEN(CNAME(name)); \ - ARM_FUNC_START_LOCAL(name) - -#define ARM_FUNC_END(name) \ - SIZE(name) - -/* Aid in defining a jump table with 8 bytes between entries. */ -/* ??? The clang assembler doesn't handle .if with symbolic expressions. */ -#ifdef __clang__ -# define E(index) -#else -# define E(index) \ - .if . - 0b - 8*index; \ - .error "type table out of sync"; \ - .endif -#endif - - .text - .syntax unified - .arm - -#ifndef __clang__ - /* We require interworking on LDM, which implies ARMv5T, - which implies the existance of BLX. */ - .arch armv5t -#endif - - /* Note that we use STC and LDC to encode VFP instructions, - so that we do not need ".fpu vfp", nor get that added to - the object file attributes. These will not be executed - unless the FFI_VFP abi is used. */ - - @ r0: stack - @ r1: frame - @ r2: fn - @ r3: vfp_used - -ARM_FUNC_START(ffi_call_VFP) - UNWIND(.fnstart) - cfi_startproc - - cmp r3, #3 @ load only d0 if possible -#ifdef __clang__ - vldrle d0, [sp] - vldmgt sp, {d0-d7} -#else - ldcle p11, cr0, [r0] @ vldrle d0, [sp] - ldcgt p11, cr0, [r0], {16} @ vldmgt sp, {d0-d7} -#endif - add r0, r0, #64 @ discard the vfp register args - /* FALLTHRU */ -ARM_FUNC_END(ffi_call_VFP) - -ARM_FUNC_START(ffi_call_SYSV) - stm r1, {fp, lr} - mov fp, r1 - - @ This is a bit of a lie wrt the origin of the unwind info, but - @ now we've got the usual frame pointer and two saved registers. - UNWIND(.save {fp,lr}) - UNWIND(.setfp fp, sp) - cfi_def_cfa(fp, 8) - cfi_rel_offset(fp, 0) - cfi_rel_offset(lr, 4) - - mov sp, r0 @ install the stack pointer - mov lr, r2 @ move the fn pointer out of the way - ldr ip, [fp, #16] @ install the static chain - ldmia sp!, {r0-r3} @ move first 4 parameters in registers. - blx lr @ call fn - - @ Load r2 with the pointer to storage for the return value - @ Load r3 with the return type code - ldr r2, [fp, #8] - ldr r3, [fp, #12] - - @ Deallocate the stack with the arguments. - mov sp, fp - cfi_def_cfa_register(sp) - - @ Store values stored in registers. - .align 3 - add pc, pc, r3, lsl #3 - nop -0: -E(ARM_TYPE_VFP_S) -#ifdef __clang__ - vstr s0, [r2] -#else - stc p10, cr0, [r2] @ vstr s0, [r2] -#endif - pop {fp,pc} -E(ARM_TYPE_VFP_D) -#ifdef __clang__ - vstr d0, [r2] -#else - stc p11, cr0, [r2] @ vstr d0, [r2] -#endif - pop {fp,pc} -E(ARM_TYPE_VFP_N) -#ifdef __clang__ - vstm r2, {d0-d3} -#else - stc p11, cr0, [r2], {8} @ vstm r2, {d0-d3} -#endif - pop {fp,pc} -E(ARM_TYPE_INT64) - str r1, [r2, #4] - nop -E(ARM_TYPE_INT) - str r0, [r2] - pop {fp,pc} -E(ARM_TYPE_VOID) - pop {fp,pc} - nop -E(ARM_TYPE_STRUCT) - pop {fp,pc} - - cfi_endproc - UNWIND(.fnend) -ARM_FUNC_END(ffi_call_SYSV) - - -/* - int ffi_closure_inner_* (cif, fun, user_data, frame) -*/ - -ARM_FUNC_START(ffi_go_closure_SYSV) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - ldr r0, [ip, #4] @ load cif - ldr r1, [ip, #8] @ load fun - mov r2, ip @ load user_data - b 0f - cfi_endproc -ARM_FUNC_END(ffi_go_closure_SYSV) - -ARM_FUNC_START(ffi_closure_SYSV) - UNWIND(.fnstart) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - -#if FFI_EXEC_TRAMPOLINE_TABLE - ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* -#endif - ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif - ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun - ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data -0: - add ip, sp, #16 @ compute entry sp - sub sp, sp, #64+32 @ allocate frame - cfi_adjust_cfa_offset(64+32) - stmdb sp!, {ip,lr} - - /* Remember that EABI unwind info only applies at call sites. - We need do nothing except note the save of the stack pointer - and the link registers. */ - UNWIND(.save {sp,lr}) - cfi_adjust_cfa_offset(8) - cfi_rel_offset(lr, 4) - - add r3, sp, #8 @ load frame - bl CNAME(ffi_closure_inner_SYSV) - - @ Load values returned in registers. - add r2, sp, #8+64 @ load result - adr r3, CNAME(ffi_closure_ret) - add pc, r3, r0, lsl #3 - cfi_endproc - UNWIND(.fnend) -ARM_FUNC_END(ffi_closure_SYSV) - -ARM_FUNC_START(ffi_go_closure_VFP) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - ldr r0, [ip, #4] @ load cif - ldr r1, [ip, #8] @ load fun - mov r2, ip @ load user_data - b 0f - cfi_endproc -ARM_FUNC_END(ffi_go_closure_VFP) - -ARM_FUNC_START(ffi_closure_VFP) - UNWIND(.fnstart) - cfi_startproc - stmdb sp!, {r0-r3} @ save argument regs - cfi_adjust_cfa_offset(16) - -#if FFI_EXEC_TRAMPOLINE_TABLE - ldr ip, [ip] @ ip points to the config page, dereference to get the ffi_closure* -#endif - ldr r0, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET] @ load cif - ldr r1, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+4] @ load fun - ldr r2, [ip, #FFI_TRAMPOLINE_CLOSURE_OFFSET+8] @ load user_data -0: - add ip, sp, #16 - sub sp, sp, #64+32 @ allocate frame - cfi_adjust_cfa_offset(64+32) -#ifdef __clang__ - vstm sp, {d0-d7} -#else - stc p11, cr0, [sp], {16} @ vstm sp, {d0-d7} -#endif - stmdb sp!, {ip,lr} - - /* See above. */ - UNWIND(.save {sp,lr}) - cfi_adjust_cfa_offset(8) - cfi_rel_offset(lr, 4) - - add r3, sp, #8 @ load frame - bl CNAME(ffi_closure_inner_VFP) - - @ Load values returned in registers. - add r2, sp, #8+64 @ load result - adr r3, CNAME(ffi_closure_ret) - add pc, r3, r0, lsl #3 - cfi_endproc - UNWIND(.fnend) -ARM_FUNC_END(ffi_closure_VFP) - -/* Load values returned in registers for both closure entry points. - Note that we use LDM with SP in the register set. This is deprecated - by ARM, but not yet unpredictable. */ - -ARM_FUNC_START_LOCAL(ffi_closure_ret) - cfi_startproc - cfi_rel_offset(sp, 0) - cfi_rel_offset(lr, 4) -0: -E(ARM_TYPE_VFP_S) -#ifdef __clang__ - vldr s0, [r2] -#else - ldc p10, cr0, [r2] @ vldr s0, [r2] -#endif - ldm sp, {sp,pc} -E(ARM_TYPE_VFP_D) -#ifdef __clang__ - vldr d0, [r2] -#else - ldc p11, cr0, [r2] @ vldr d0, [r2] -#endif - ldm sp, {sp,pc} -E(ARM_TYPE_VFP_N) -#ifdef __clang__ - vldm r2, {d0-d3} -#else - ldc p11, cr0, [r2], {8} @ vldm r2, {d0-d3} -#endif - ldm sp, {sp,pc} -E(ARM_TYPE_INT64) - ldr r1, [r2, #4] - nop -E(ARM_TYPE_INT) - ldr r0, [r2] - ldm sp, {sp,pc} -E(ARM_TYPE_VOID) - ldm sp, {sp,pc} - nop -E(ARM_TYPE_STRUCT) - ldm sp, {sp,pc} - cfi_endproc -ARM_FUNC_END(ffi_closure_ret) - -#if FFI_EXEC_TRAMPOLINE_TABLE - -#ifdef __MACH__ -#include - -.align PAGE_MAX_SHIFT -ARM_FUNC_START(ffi_closure_trampoline_table_page) -.rept PAGE_MAX_SIZE / FFI_TRAMPOLINE_SIZE - adr ip, #-PAGE_MAX_SIZE @ the config page is PAGE_MAX_SIZE behind the trampoline page - sub ip, #8 @ account for pc bias - ldr pc, [ip, #4] @ jump to ffi_closure_SYSV or ffi_closure_VFP -.endr -ARM_FUNC_END(ffi_closure_trampoline_table_page) -#endif - -#else - -ARM_FUNC_START(ffi_arm_trampoline) -0: adr ip, 0b - ldr pc, 1f -1: .long 0 -ARM_FUNC_END(ffi_arm_trampoline) - -#endif /* FFI_EXEC_TRAMPOLINE_TABLE */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",%progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/ffi.c deleted file mode 100644 index 3d43397..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/ffi.c +++ /dev/null @@ -1,423 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/avr32/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/ffitarget.h deleted file mode 100644 index d0c7586..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/ffitarget.h +++ /dev/null @@ -1,55 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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.25/ext/ffi_c/libffi/src/avr32/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/sysv.S deleted file mode 100644 index a984b3c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/avr32/sysv.S +++ /dev/null @@ -1,208 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/bfin/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/ffi.c deleted file mode 100644 index 22a2acd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/ffi.c +++ /dev/null @@ -1,196 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Alexandre K. I. de Mendonca , - Paulo Pizarro - - Blackfin 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 - -/* Maximum number of GPRs available for argument passing. */ -#define MAX_GPRARGS 3 - -/* - * Return types - */ -#define FFIBFIN_RET_VOID 0 -#define FFIBFIN_RET_BYTE 1 -#define FFIBFIN_RET_HALFWORD 2 -#define FFIBFIN_RET_INT64 3 -#define FFIBFIN_RET_INT32 4 - -/*====================================================================*/ -/* PROTOTYPE * - /*====================================================================*/ -void ffi_prep_args(unsigned char *, extended_cif *); - -/*====================================================================*/ -/* Externals */ -/* (Assembly) */ -/*====================================================================*/ - -extern void ffi_call_SYSV(unsigned, extended_cif *, void(*)(unsigned char *, extended_cif *), unsigned, void *, void(*fn)(void)); - -/*====================================================================*/ -/* Implementation */ -/* */ -/*====================================================================*/ - - -/* - * This function calculates the return type (size) based on type. - */ - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* --------------------------------------* - * Return handling * - * --------------------------------------*/ - switch (cif->rtype->type) { - case FFI_TYPE_VOID: - cif->flags = FFIBFIN_RET_VOID; - break; - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - cif->flags = FFIBFIN_RET_HALFWORD; - break; - case FFI_TYPE_UINT8: - cif->flags = FFIBFIN_RET_BYTE; - break; - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - case FFI_TYPE_SINT8: - cif->flags = FFIBFIN_RET_INT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - cif->flags = FFIBFIN_RET_INT64; - break; - case FFI_TYPE_STRUCT: - if (cif->rtype->size <= 4){ - cif->flags = FFIBFIN_RET_INT32; - }else if (cif->rtype->size == 8){ - cif->flags = FFIBFIN_RET_INT64; - }else{ - //it will return via a hidden pointer in P0 - cif->flags = FFIBFIN_RET_VOID; - } - break; - default: - FFI_ASSERT(0); - break; - } - return FFI_OK; -} - -/* - * This will prepare the arguments and will call the assembly routine - * cif = the call interface - * fn = the function to be called - * rvalue = the return value - * avalue = the arguments - */ -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; - - 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; - } -} - - -/* -* This function prepares the parameters (copies them from the ecif to the stack) -* to call the function (ffi_prep_args is called by the assembly routine in file -* sysv.S, which also calls the actual function) -*/ -void ffi_prep_args(unsigned char *stack, extended_cif *ecif) -{ - register unsigned int i = 0; - void **p_argv; - unsigned 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; - z = (*p_arg)->size; - if (z < sizeof(int)) { - z = sizeof(int); - switch ((*p_arg)->type) { - case FFI_TYPE_SINT8: { - signed char v = *(SINT8 *)(* p_argv); - signed int t = v; - *(signed int *) argp = t; - } - break; - case FFI_TYPE_UINT8: { - unsigned char v = *(UINT8 *)(* p_argv); - unsigned int t = v; - *(unsigned int *) argp = t; - } - 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); - break; - } - } else if (z == sizeof(int)) { - *(unsigned int *) argp = (unsigned int) * (UINT32 *)(* p_argv); - } else { - memcpy(argp, *p_argv, z); - } - p_argv++; - argp += z; - } -} - - - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/ffitarget.h deleted file mode 100644 index 2175c01..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/ffitarget.h +++ /dev/null @@ -1,43 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012 Alexandre K. I. de Mendonca - - Blackfin 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 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 - -#endif - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/sysv.S deleted file mode 100644 index f4278be..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/bfin/sysv.S +++ /dev/null @@ -1,179 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2012 Alexandre K. I. de Mendonca , - Paulo Pizarro - - Blackfin 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 - -.text -.align 4 - - /* - There is a "feature" in the bfin toolchain that it puts a _ before function names - that's why the function here it's called _ffi_call_SYSV and not ffi_call_SYSV - */ - .global _ffi_call_SYSV; - .type _ffi_call_SYSV, STT_FUNC; - .func ffi_call_SYSV - - /* - cif->bytes = R0 (fp+8) - &ecif = R1 (fp+12) - ffi_prep_args = R2 (fp+16) - ret_type = stack (fp+20) - ecif.rvalue = stack (fp+24) - fn = stack (fp+28) - got (fp+32) - - There is room for improvement here (we can use temporary registers - instead of saving the values in the memory) - REGS: - P5 => Stack pointer (function arguments) - R5 => cif->bytes - R4 => ret->type - - FP-20 = P3 - FP-16 = SP (parameters area) - FP-12 = SP (temp) - FP-08 = function return part 1 [R0] - FP-04 = function return part 2 [R1] - */ - -_ffi_call_SYSV: -.prologue: - LINK 20; - [FP-20] = P3; - [FP+8] = R0; - [FP+12] = R1; - [FP+16] = R2; - -.allocate_stack: - //alocate cif->bytes into the stack - R1 = [FP+8]; - R0 = SP; - R0 = R0 - R1; - R1 = 4; - R0 = R0 - R1; - [FP-12] = SP; - SP = R0; - [FP-16] = SP; - -.call_prep_args: - //get the addr of prep_args - P0 = [P3 + _ffi_prep_args@FUNCDESC_GOT17M4]; - P1 = [P0]; - P3 = [P0+4]; - R0 = [FP-16];//SP (parameter area) - R1 = [FP+12];//ecif - call (P1); - -.call_user_function: - //ajust SP so as to allow the user function access the parameters on the stack - SP = [FP-16]; //point to function parameters - R0 = [SP]; - R1 = [SP+4]; - R2 = [SP+8]; - //load user function address - P0 = FP; - P0 +=28; - P1 = [P0]; - P1 = [P1]; - P3 = [P0+4]; - /* - For functions returning aggregate values (struct) occupying more than 8 bytes, - the caller allocates the return value object on the stack and the address - of this object is passed to the callee as a hidden argument in register P0. - */ - P0 = [FP+24]; - - call (P1); - SP = [FP-12]; -.compute_return: - P2 = [FP-20]; - [FP-8] = R0; - [FP-4] = R1; - - R0 = [FP+20]; - R1 = R0 << 2; - - R0 = [P2+.rettable@GOT17M4]; - R0 = R1 + R0; - P2 = R0; - R1 = [P2]; - - P2 = [FP+-20]; - R0 = [P2+.rettable@GOT17M4]; - R0 = R1 + R0; - P2 = R0; - R0 = [FP-8]; - R1 = [FP-4]; - jump (P2); - -/* -#define FFIBFIN_RET_VOID 0 -#define FFIBFIN_RET_BYTE 1 -#define FFIBFIN_RET_HALFWORD 2 -#define FFIBFIN_RET_INT64 3 -#define FFIBFIN_RET_INT32 4 -*/ -.align 4 -.align 4 -.rettable: - .dd .epilogue - .rettable - .dd .rbyte - .rettable; - .dd .rhalfword - .rettable; - .dd .rint64 - .rettable; - .dd .rint32 - .rettable; - -.rbyte: - P0 = [FP+24]; - R0 = R0.B (Z); - [P0] = R0; - JUMP .epilogue -.rhalfword: - P0 = [FP+24]; - R0 = R0.L; - [P0] = R0; - JUMP .epilogue -.rint64: - P0 = [FP+24];// &rvalue - [P0] = R0; - [P0+4] = R1; - JUMP .epilogue -.rint32: - P0 = [FP+24]; - [P0] = R0; -.epilogue: - R0 = [FP+8]; - R1 = [FP+12]; - R2 = [FP+16]; - P3 = [FP-20]; - UNLINK; - RTS; - -.size _ffi_call_SYSV,.-_ffi_call_SYSV; -.endfunc diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c deleted file mode 100644 index 15e6e0f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/closures.c +++ /dev/null @@ -1,966 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 -#include - -#ifdef __NetBSD__ -#include -#endif - -#if __NetBSD_Version__ - 0 >= 799007200 -/* NetBSD with PROT_MPROTECT */ -#include - -#include -#include - -static const size_t overhead = - (sizeof(max_align_t) > sizeof(void *) + sizeof(size_t)) ? - sizeof(max_align_t) - : sizeof(void *) + sizeof(size_t); - -#define ADD_TO_POINTER(p, d) ((void *)((uintptr_t)(p) + (d))) - -void * -ffi_closure_alloc (size_t size, void **code) -{ - static size_t page_size; - size_t rounded_size; - void *codeseg, *dataseg; - int prot; - - /* Expect that PAX mprotect is active and a separate code mapping is necessary. */ - if (!code) - return NULL; - - /* Obtain system page size. */ - if (!page_size) - page_size = sysconf(_SC_PAGESIZE); - - /* Round allocation size up to the next page, keeping in mind the size field and pointer to code map. */ - rounded_size = (size + overhead + page_size - 1) & ~(page_size - 1); - - /* Primary mapping is RW, but request permission to switch to PROT_EXEC later. */ - prot = PROT_READ | PROT_WRITE | PROT_MPROTECT(PROT_EXEC); - dataseg = mmap(NULL, rounded_size, prot, MAP_ANON | MAP_PRIVATE, -1, 0); - if (dataseg == MAP_FAILED) - return NULL; - - /* Create secondary mapping and switch it to RX. */ - codeseg = mremap(dataseg, rounded_size, NULL, rounded_size, MAP_REMAPDUP); - if (codeseg == MAP_FAILED) { - munmap(dataseg, rounded_size); - return NULL; - } - if (mprotect(codeseg, rounded_size, PROT_READ | PROT_EXEC) == -1) { - munmap(codeseg, rounded_size); - munmap(dataseg, rounded_size); - return NULL; - } - - /* Remember allocation size and location of the secondary mapping for ffi_closure_free. */ - memcpy(dataseg, &rounded_size, sizeof(rounded_size)); - memcpy(ADD_TO_POINTER(dataseg, sizeof(size_t)), &codeseg, sizeof(void *)); - *code = ADD_TO_POINTER(codeseg, overhead); - return ADD_TO_POINTER(dataseg, overhead); -} - -void -ffi_closure_free (void *ptr) -{ - void *codeseg, *dataseg; - size_t rounded_size; - - dataseg = ADD_TO_POINTER(ptr, -overhead); - memcpy(&rounded_size, dataseg, sizeof(rounded_size)); - memcpy(&codeseg, ADD_TO_POINTER(dataseg, sizeof(size_t)), sizeof(void *)); - munmap(dataseg, rounded_size); - munmap(codeseg, rounded_size); -} -#else /* !NetBSD with PROT_MPROTECT */ - -#if !FFI_MMAP_EXEC_WRIT && !FFI_EXEC_TRAMPOLINE_TABLE -# if __linux__ && !defined(__ANDROID__) -/* 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 -# if defined(__linux__) && !defined(__ANDROID__) -/* 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 - -#ifdef __MACH__ - -#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 -{ - /* contiguous 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; -}; - -/* Total number of trampolines that fit in one trampoline table */ -#define FFI_TRAMPOLINE_COUNT (PAGE_MAX_SIZE / 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 (void) -{ - ffi_trampoline_table *table; - vm_address_t config_page; - vm_address_t trampoline_page; - vm_address_t trampoline_page_template; - vm_prot_t cur_prot; - vm_prot_t max_prot; - kern_return_t kt; - uint16_t i; - - /* Allocate two pages -- a config page and a placeholder page */ - config_page = 0x0; - kt = vm_allocate (mach_task_self (), &config_page, PAGE_MAX_SIZE * 2, - VM_FLAGS_ANYWHERE); - if (kt != KERN_SUCCESS) - return NULL; - - /* Remap the trampoline table on top of the placeholder page */ - trampoline_page = config_page + PAGE_MAX_SIZE; - trampoline_page_template = (vm_address_t)&ffi_closure_trampoline_table_page; -#ifdef __arm__ - /* ffi_closure_trampoline_table_page can be thumb-biased on some ARM archs */ - trampoline_page_template &= ~1UL; -#endif - kt = vm_remap (mach_task_self (), &trampoline_page, PAGE_MAX_SIZE, 0x0, - VM_FLAGS_OVERWRITE, mach_task_self (), trampoline_page_template, - FALSE, &cur_prot, &max_prot, VM_INHERIT_SHARE); - if (kt != KERN_SUCCESS) - { - vm_deallocate (mach_task_self (), config_page, PAGE_MAX_SIZE * 2); - return NULL; - } - - /* 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)); - - 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; -} - -static void -ffi_trampoline_table_free (ffi_trampoline_table *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 */ - vm_deallocate (mach_task_self (), table->config_page, PAGE_MAX_SIZE * 2); - - /* Deallocate free list */ - free (table->free_list_pool); - free (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) - { - pthread_mutex_unlock (&ffi_trampoline_lock); - 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) - { - ffi_trampoline_table_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); -} - -#endif - -// 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) - -#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 */ - -/* On PaX enable kernels that have MPROTECT enable we can't use PROT_EXEC. */ -#ifdef FFI_MMAP_EXEC_EMUTRAMP_PAX -#include - -static int emutramp_enabled = -1; - -static int -emutramp_enabled_check (void) -{ - char *buf = NULL; - size_t len = 0; - FILE *f; - int ret; - f = fopen ("/proc/self/status", "r"); - if (f == NULL) - return 0; - ret = 0; - - while (getline (&buf, &len, f) != -1) - if (!strncmp (buf, "PaX:", 4)) - { - char emutramp; - if (sscanf (buf, "%*s %*c%c", &emutramp) == 1) - ret = (emutramp == 'E'); - break; - } - free (buf); - fclose (f); - return ret; -} - -#define is_emutramp_enabled() (emutramp_enabled >= 0 ? emutramp_enabled \ - : (emutramp_enabled = emutramp_enabled_check ())) -#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ - -#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) */ - -#ifndef FFI_MMAP_EXEC_EMUTRAMP_PAX -#define is_emutramp_enabled() 0 -#endif /* FFI_MMAP_EXEC_EMUTRAMP_PAX */ - -/* 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 flags) -{ - int fd; - -#ifdef HAVE_MKOSTEMP - fd = mkostemp (name, flags); -#else - fd = mkstemp (name); -#endif - - 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, flags; - char *tempname; -#ifdef O_TMPFILE - int fd; -#endif - -#ifdef O_CLOEXEC - flags = O_CLOEXEC; -#else - flags = 0; -#endif - -#ifdef O_TMPFILE - fd = open (dir, flags | O_RDWR | O_EXCL | O_TMPFILE, 0700); - /* If the running system does not support the O_TMPFILE flag then retry without it. */ - if (fd != -1 || (errno != EINVAL && errno != EISDIR && errno != EOPNOTSUPP)) { - return fd; - } else { - errno = 0; - } -#endif - - lendir = (int) strlen (dir); - 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, flags); -} - -/* 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 executable 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; -} - -/* We need to allocate space in a file that will be backing a writable - mapping. Several problems exist with the usual approaches: - - fallocate() is Linux-only - - posix_fallocate() is not available on all platforms - - ftruncate() does not allocate space on filesystems with sparse files - Failure to allocate the space will cause SIGBUS to be thrown when - the mapping is subsequently written to. */ -static int -allocate_space (int fd, off_t offset, off_t len) -{ - static size_t page_size; - - /* Obtain system page size. */ - if (!page_size) - page_size = sysconf(_SC_PAGESIZE); - - unsigned char buf[page_size]; - memset (buf, 0, page_size); - - while (len > 0) - { - off_t to_write = (len < page_size) ? len : page_size; - if (write (fd, buf, to_write) < to_write) - return -1; - len -= to_write; - } - - return 0; -} - -/* 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 (allocate_space (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 (execfd == -1 && is_emutramp_enabled ()) - { - ptr = mmap (start, length, prot & ~PROT_EXEC, flags, fd, offset); - return ptr; - } - - 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 (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); -} - -# 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 */ - -#endif /* NetBSD with PROT_MPROTECT */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/ffi.c deleted file mode 100644 index 9011fde..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/ffi.c +++ /dev/null @@ -1,386 +0,0 @@ -/* ----------------------------------------------------------------------- - 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) FFI_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_HIDDEN -ffi_prep_cif_core (ffi_cif * cif, - ffi_abi abi, unsigned int isvariadic, - unsigned int nfixedargs, unsigned int ntotalargs, - ffi_type * rtype, ffi_type ** atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT (cif != NULL); - FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); - FFI_ASSERT(nfixedargs <= ntotalargs); - FFI_ASSERT (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI); - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = ntotalargs; - 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 = FFI_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.25/ext/ffi_c/libffi/src/cris/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/ffitarget.h deleted file mode 100644 index b837e97..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/ffitarget.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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.25/ext/ffi_c/libffi/src/cris/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/sysv.S deleted file mode 100644 index 79abaee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/cris/sysv.S +++ /dev/null @@ -1,215 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/debug.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/debug.c deleted file mode 100644 index f3172b1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/debug.c +++ /dev/null @@ -1,64 +0,0 @@ -/* ----------------------------------------------------------------------- - 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->type != FFI_TYPE_COMPLEX) - || a->elements != NULL, file, line); - FFI_ASSERT_AT(a->type != FFI_TYPE_COMPLEX - || (a->elements != NULL - && a->elements[0] != NULL && a->elements[1] == NULL), - file, line); - -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/dlmalloc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/dlmalloc.c deleted file mode 100644 index d63dd36..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/dlmalloc.c +++ /dev/null @@ -1,5166 +0,0 @@ -/* - 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. - -*/ - -#if defined __linux__ && !defined _GNU_SOURCE -/* mremap() on Linux requires this via sys/mman.h */ -#define _GNU_SOURCE 1 -#endif - -#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 platforms */ -#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 contiguous 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 size_t 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 descendants - correspond properly to bit masks. We use the rightmost descendant - 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; - (void)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; - (void)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 threshold - * Eliminate block-local decls to simplify tracing and debugging. - * Support another case of realloc via move into top - * Fix error occurring 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.25/ext/ffi_c/libffi/src/frv/eabi.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/eabi.S deleted file mode 100644 index 379ea4b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/eabi.S +++ /dev/null @@ -1,128 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/frv/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/ffi.c deleted file mode 100644 index 62ae652..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/ffi.c +++ /dev/null @@ -1,292 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 = FFI_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.25/ext/ffi_c/libffi/src/frv/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/ffitarget.h deleted file mode 100644 index d42540e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/frv/ffitarget.h +++ /dev/null @@ -1,62 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#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_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.25/ext/ffi_c/libffi/src/ia64/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ffi.c deleted file mode 100644 index b1d04c3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ffi.c +++ /dev/null @@ -1,604 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 1998, 2007, 2008, 2012 Red Hat, Inc. - Copyright (c) 2000 Hewlett Packard Company - Copyright (c) 2011 Anthony Green - - 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. */ - -static ffi_status -ffi_prep_cif_machdep_core(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; -} - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - cif->nfixedargs = cif->nargs; - return ffi_prep_cif_machdep_core(cif); -} - -ffi_status -ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs MAYBE_UNUSED) -{ - cif->nfixedargs = nfixedargs; - return ffi_prep_cif_machdep_core(cif); -} - -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]); - { - UINT32 tmp; - memcpy (&tmp, avalue[i], sizeof (UINT32)); - stack->gp_regs[gpcount++] = tmp; - } - break; - - case FFI_TYPE_DOUBLE: - if (gpcount < 8 && fpcount < 8) - stf_spill (&stack->fp_regs[fpcount++], *(double *)avalue[i]); - memcpy (&stack->gp_regs[gpcount++], avalue[i], sizeof (UINT64)); - 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 restore 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, nfixedargs; - - cif = closure->cif; - avn = cif->nargs; - nfixedargs = cif->nfixedargs; - 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++) - { - int named = i < nfixedargs; - 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 (named && 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 (named && 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 && named && 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.25/ext/ffi_c/libffi/src/ia64/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ffitarget.h deleted file mode 100644 index fd5b9a0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ffitarget.h +++ /dev/null @@ -1,56 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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: */ -#define FFI_TARGET_SPECIFIC_VARIADIC 1 -#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ia64_flags.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ia64_flags.h deleted file mode 100644 index 9d652ce..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/ia64_flags.h +++ /dev/null @@ -1,40 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/ia64/unix.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/unix.S deleted file mode 100644 index e2547e0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/ia64/unix.S +++ /dev/null @@ -1,567 +0,0 @@ -/* ----------------------------------------------------------------------- - 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: - 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 - ;; - // ia64 software calling convention requires - // top 16 bytes of stack to be scratch space - // PLT resolver uses that scratch space at - // 'memcpy' symbol reolution time - add sp = -16, sp - 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_void) // FFI_TYPE_COMPLEX (not implemented) - 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_void) // FFI_TYPE_COMPLEX (not implemented) - 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.25/ext/ffi_c/libffi/src/java_raw_api.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c deleted file mode 100644 index 114d3e4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/java_raw_api.c +++ /dev/null @@ -1,374 +0,0 @@ -/* ----------------------------------------------------------------------- - 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) - -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(); - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - 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; - - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - - default: - *args = raw; - raw += - FFI_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; - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - default: - *args = (void*) raw++; - } -#else /* FFI_SIZEOF_JAVA_RAW != 8 */ - *args = (void*) raw; - raw += - FFI_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 += - FFI_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; - - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - - 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; - - case FFI_TYPE_COMPLEX: - /* Not supported yet. */ - abort(); - - 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 /* !NO_JAVA_RAW_API */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/ffi.c deleted file mode 100644 index ab8fc4e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/ffi.c +++ /dev/null @@ -1,232 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 *) FFI_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.25/ext/ffi_c/libffi/src/m32r/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/ffitarget.h deleted file mode 100644 index 6c34801..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- 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.25/ext/ffi_c/libffi/src/m32r/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/sysv.S deleted file mode 100644 index 06b75c2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m32r/sysv.S +++ /dev/null @@ -1,121 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/m68k/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/ffi.c deleted file mode 100644 index 0330184..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/ffi.c +++ /dev/null @@ -1,362 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 -#ifdef __MINT__ -#include -#include -#else -#include -#endif -#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 ( -#ifdef __MINT__ - (ecif->cif->rtype->type == FFI_TYPE_LONGDOUBLE) || -#endif - (((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 = (*p_arg)->size; - int type = (*p_arg)->type; - - if (z < sizeof (int)) - { - switch (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: -#ifdef __MINT__ - if (z == 1 || z == 2) - memcpy (argp + 2, *p_argv, z); - else - memcpy (argp, *p_argv, z); -#else - memcpy (argp + sizeof (int) - z, *p_argv, z); -#endif - break; - - default: - FFI_ASSERT (0); - } - z = sizeof (int); - } - else - { - memcpy (argp, *p_argv, z); - - /* Align if necessary. */ - if ((sizeof(int) - 1) & z) - z = FFI_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 -#define CIF_FLAGS_SINT8 256 -#define CIF_FLAGS_SINT16 512 - -/* 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: - if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && - cif->rtype->elements[1]) - { - cif->flags = 0; - break; - } - - switch (cif->rtype->size) - { - case 1: -#ifdef __MINT__ - cif->flags = CIF_FLAGS_STRUCT2; -#else - cif->flags = CIF_FLAGS_STRUCT1; -#endif - break; - case 2: - cif->flags = CIF_FLAGS_STRUCT2; - break; -#ifdef __MINT__ - case 3: -#endif - case 4: - cif->flags = CIF_FLAGS_INT; - break; -#ifdef __MINT__ - case 7: -#endif - 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: -#ifdef __MINT__ - cif->flags = 0; -#else - cif->flags = CIF_FLAGS_LDOUBLE; -#endif - 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; - - case FFI_TYPE_SINT16: - cif->flags = CIF_FLAGS_SINT16; - break; - - case FFI_TYPE_SINT8: - cif->flags = CIF_FLAGS_SINT8; - 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; -#ifdef __MINT__ - if (cif->flags && - cif->rtype->type == FFI_TYPE_STRUCT && - (z == 1 || z == 2)) - { - *p_argv = (void *) (argp + 2); - - z = 4; - } - else - if (cif->flags && - cif->rtype->type == FFI_TYPE_STRUCT && - (z == 3 || z == 4)) - { - *p_argv = (void *) (argp); - - z = 4; - } - else -#endif - 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 = FFI_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) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - *(unsigned short *)closure->tramp = 0x207c; - *(void **)(closure->tramp + 2) = codeloc; - *(unsigned short *)(closure->tramp + 6) = 0x4ef9; - - if ( -#ifdef __MINT__ - (cif->rtype->type == FFI_TYPE_LONGDOUBLE) || -#endif - (((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 ); -#elif defined(__MINT__) - Ssystem(S_FLUSHCACHE, 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.25/ext/ffi_c/libffi/src/m68k/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/ffitarget.h deleted file mode 100644 index e81dde2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/ffitarget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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.25/ext/ffi_c/libffi/src/m68k/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/sysv.S deleted file mode 100644 index ea40f11..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m68k/sysv.S +++ /dev/null @@ -1,357 +0,0 @@ -/* ----------------------------------------------------------------------- - - sysv.S - Copyright (c) 2012 Alan Hourihane - Copyright (c) 1998, 2012 Andreas Schwab - Copyright (c) 2008 Red Hat, Inc. - Copyright (c) 2012, 2016 Thorsten Glaser - - 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 - -#ifdef __MINT__ -#define CALLFUNC(funcname) _ ## funcname -#else -#define CALLFUNC(funcname) funcname -#endif - - .text - - .globl CALLFUNC(ffi_call_SYSV) - .type CALLFUNC(ffi_call_SYSV),@function - .align 4 - -CALLFUNC(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 CALLFUNC(ffi_prep_args) -#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) - move.l _current_shared_library_a5_offset_(%a5),%a0 - move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 - jsr (%a0) -#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) - move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 - lea (-6,%pc,%a0),%a0 - move.l CALLFUNC(ffi_prep_args@GOT)(%a0),%a0 - jsr (%a0) -#else - bsr.l CALLFUNC(ffi_prep_args@PLTPC) -#endif - addq.l #8,%sp - - | Pass pointer to struct value, if any -#ifdef __MINT__ - move.l %d0,%a1 -#else - move.l %a0,%a1 -#endif - - | 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(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !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__) || defined(__HAVE_68881__) - fmove.s %fp0,(%a1) -#else - move.l %d0,(%a1) -#endif - jbra epilogue - -retdouble: - btst #3,%d2 - jbeq retlongdouble -#if defined(__MC68881__) || defined(__HAVE_68881__) - 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__) || defined(__HAVE_68881__) - 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 -#ifdef __MINT__ - move.l %d0,(%a1) -#else - move.l %a0,(%a1) -#endif - jbra epilogue - -retstruct1: - btst #6,%d2 - jbeq retstruct2 - move.b %d0,(%a1) - jbra epilogue - -retstruct2: - btst #7,%d2 - jbeq retsint8 - move.w %d0,(%a1) - jbra epilogue - -retsint8: - btst #8,%d2 - jbeq retsint16 - | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - ext.w %d0 - ext.l %d0 -#else - extb.l %d0 -#endif - move.l %d0,(%a1) - jbra epilogue - -retsint16: - btst #9,%d2 - jbeq noretval - ext.l %d0 - move.l %d0,(%a1) - -noretval: -epilogue: - move.l (%sp)+,%d2 - unlk %fp - rts - CFI_ENDPROC() - .size CALLFUNC(ffi_call_SYSV),.-CALLFUNC(ffi_call_SYSV) - - .globl CALLFUNC(ffi_closure_SYSV) - .type CALLFUNC(ffi_closure_SYSV), @function - .align 4 - -CALLFUNC(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 CALLFUNC(ffi_closure_SYSV_inner) -#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) - move.l _current_shared_library_a5_offset_(%a5),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) - move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 - lea (-6,%pc,%a0),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#else - bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) -#endif - - lsr.l #1,%d0 - jne 1f - jcc .Lcls_epilogue - | CIF_FLAGS_INT - move.l -12(%fp),%d0 -.Lcls_epilogue: - | no CIF_FLAGS_* - unlk %fp - rts -1: - lea -12(%fp),%a0 - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_float - | CIF_FLAGS_DINT - move.l (%a0)+,%d0 - move.l (%a0),%d1 - jra .Lcls_epilogue -.Lcls_ret_float: -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.s (%a0),%fp0 -#else - move.l (%a0),%d0 -#endif - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_ldouble - | CIF_FLAGS_DOUBLE -#if defined(__MC68881__) || defined(__HAVE_68881__) - fmove.d (%a0),%fp0 -#else - move.l (%a0)+,%d0 - move.l (%a0),%d1 -#endif - jra .Lcls_epilogue -.Lcls_ret_ldouble: -#if defined(__MC68881__) || defined(__HAVE_68881__) - 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 1f - jcs .Lcls_ret_struct1 - | CIF_FLAGS_POINTER - move.l (%a0),%a0 - move.l %a0,%d0 - jra .Lcls_epilogue -.Lcls_ret_struct1: - move.b (%a0),%d0 - jra .Lcls_epilogue -1: - lsr.l #2,%d0 - jne 1f - jcs .Lcls_ret_sint8 - | CIF_FLAGS_STRUCT2 - move.w (%a0),%d0 - jra .Lcls_epilogue -.Lcls_ret_sint8: - move.l (%a0),%d0 - | NOTE: On the mc68000, extb is not supported. 8->16, then 16->32. -#if !defined(__mc68020__) && !defined(__mc68030__) && !defined(__mc68040__) && !defined(__mc68060__) && !defined(__mcoldfire__) - ext.w %d0 - ext.l %d0 -#else - extb.l %d0 -#endif - jra .Lcls_epilogue -1: - | CIF_FLAGS_SINT16 - move.l (%a0),%d0 - ext.l %d0 - jra .Lcls_epilogue - CFI_ENDPROC() - - .size CALLFUNC(ffi_closure_SYSV),.-CALLFUNC(ffi_closure_SYSV) - - .globl CALLFUNC(ffi_closure_struct_SYSV) - .type CALLFUNC(ffi_closure_struct_SYSV), @function - .align 4 - -CALLFUNC(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 CALLFUNC(ffi_closure_SYSV_inner) -#elif defined(__uClinux__) && defined(__ID_SHARED_LIBRARY__) - move.l _current_shared_library_a5_offset_(%a5),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#elif defined(__mcoldfire__) && !defined(__mcfisab__) && !defined(__mcfisac__) - move.l #_GLOBAL_OFFSET_TABLE_@GOTPC,%a0 - lea (-6,%pc,%a0),%a0 - move.l CALLFUNC(ffi_closure_SYSV_inner@GOT)(%a0),%a0 - jsr (%a0) -#else - bsr.l CALLFUNC(ffi_closure_SYSV_inner@PLTPC) -#endif - unlk %fp - rts - CFI_ENDPROC() - .size CALLFUNC(ffi_closure_struct_SYSV),.-CALLFUNC(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.25/ext/ffi_c/libffi/src/m88k/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/ffi.c deleted file mode 100644 index 57b344f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/ffi.c +++ /dev/null @@ -1,400 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * m88k Foreign Function Interface - * - * This file attempts to provide all the FFI entry points which can reliably - * be implemented in C. - * - * Only OpenBSD/m88k is currently supported; other platforms (such as - * Motorola's SysV/m88k) could be supported with the following tweaks: - * - * - non-OpenBSD systems use an `outgoing parameter area' as part of the - * 88BCS calling convention, which is not supported under OpenBSD from - * release 3.6 onwards. Supporting it should be as easy as taking it - * into account when adjusting the stack, in the assembly code. - * - * - the logic deciding whether a function argument gets passed through - * registers, or on the stack, has changed several times in OpenBSD in - * edge cases (especially for structs larger than 32 bytes being passed - * by value). The code below attemps to match the logic used by the - * system compiler of OpenBSD 5.3, i.e. gcc 3.3.6 with many m88k backend - * fixes. - */ - -#include -#include - -#include -#include - -void ffi_call_OBSD (unsigned int, extended_cif *, unsigned int, void *, - void (*fn) ()); -void *ffi_prep_args (void *, extended_cif *); -void ffi_closure_OBSD (ffi_closure *); -void ffi_closure_struct_OBSD (ffi_closure *); -unsigned int ffi_closure_OBSD_inner (ffi_closure *, void *, unsigned int *, - char *); -void ffi_cacheflush_OBSD (unsigned int, unsigned int); - -#define CIF_FLAGS_INT (1 << 0) -#define CIF_FLAGS_DINT (1 << 1) - -/* - * Foreign Function Interface API - */ - -/* 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, *stackp; - unsigned int *regp; - unsigned int regused; - ffi_type **p_arg; - void *struct_value_ptr; - - regp = (unsigned int *)stack; - stackp = (char *)(regp + 8); - regused = 0; - - 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; - unsigned short t, a; - - z = (*p_arg)->size; - t = (*p_arg)->type; - a = (*p_arg)->alignment; - - /* - * Figure out whether the argument can be passed through registers - * or on the stack. - * The rule is that registers can only receive simple types not larger - * than 64 bits, or structs the exact size of a register and aligned to - * the size of a register. - */ - if (t == FFI_TYPE_STRUCT) - { - if (z == sizeof (int) && a == sizeof (int) && regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - else - { - if (z > sizeof (int) && regused < 8 - 1) - { - /* align to an even register pair */ - if (regused & 1) - { - regp++; - regused++; - } - } - if (regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - - /* Enforce proper stack alignment of 64-bit types */ - if (argp == stackp && a > sizeof (int)) - { - stackp = (char *) FFI_ALIGN(stackp, a); - argp = stackp; - } - - switch (t) - { - 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_INT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *(unsigned int *) argp = *(unsigned int *) *p_argv; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_STRUCT: - memcpy (argp, *p_argv, z); - break; - - default: - FFI_ASSERT (0); - } - - /* Align if necessary. */ - if ((sizeof (int) - 1) & z) - z = FFI_ALIGN(z, sizeof (int)); - - p_argv++; - - /* Be careful, once all registers are filled, and about to continue - on stack, regp == stackp. Therefore the check for regused as well. */ - if (argp == (char *)regp && regused < 8) - { - regp += z / sizeof (int); - regused += z / sizeof (int); - } - else - stackp += z; - } - - return struct_value_ptr; -} - -/* 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: - if (cif->rtype->size == sizeof (int) && - cif->rtype->alignment == sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else - cif->flags = 0; - break; - - case FFI_TYPE_DOUBLE: - 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 != sizeof (int) - || cif->rtype->alignment != sizeof (int))) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_OBSD: - ffi_call_OBSD (cif->bytes, &ecif, cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/* - * Closure API - */ - -static void -ffi_prep_closure_args_OBSD (ffi_cif *cif, void **avalue, unsigned int *regp, - char *stackp) -{ - unsigned int i; - void **p_argv; - char *argp; - unsigned int regused; - ffi_type **p_arg; - - regused = 0; - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - unsigned short t, a; - - z = (*p_arg)->size; - t = (*p_arg)->type; - a = (*p_arg)->alignment; - - /* - * Figure out whether the argument has been passed through registers - * or on the stack. - * The rule is that registers can only receive simple types not larger - * than 64 bits, or structs the exact size of a register and aligned to - * the size of a register. - */ - if (t == FFI_TYPE_STRUCT) - { - if (z == sizeof (int) && a == sizeof (int) && regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - else - { - if (z > sizeof (int) && regused < 8 - 1) - { - /* align to an even register pair */ - if (regused & 1) - { - regp++; - regused++; - } - } - if (regused < 8) - argp = (char *)regp; - else - argp = stackp; - } - - /* Enforce proper stack alignment of 64-bit types */ - if (argp == stackp && a > sizeof (int)) - { - stackp = (char *) FFI_ALIGN(stackp, a); - argp = stackp; - } - - if (z < sizeof (int) && t != FFI_TYPE_STRUCT) - *p_argv = (void *) (argp + sizeof (int) - z); - else - *p_argv = (void *) argp; - - /* Align if necessary */ - if ((sizeof (int) - 1) & z) - z = FFI_ALIGN(z, sizeof (int)); - - p_argv++; - - /* Be careful, once all registers are exhausted, and about to fetch from - stack, regp == stackp. Therefore the check for regused as well. */ - if (argp == (char *)regp && regused < 8) - { - regp += z / sizeof (int); - regused += z / sizeof (int); - } - else - stackp += z; - } -} - -unsigned int -ffi_closure_OBSD_inner (ffi_closure *closure, void *resp, unsigned int *regp, - char *stackp) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void**) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_closure_args_OBSD(cif, arg_area, regp, stackp); - - (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) -{ - unsigned int *tramp = (unsigned int *) codeloc; - void *fn; - - FFI_ASSERT (cif->abi == FFI_OBSD); - - if (cif->rtype->type == FFI_TYPE_STRUCT && !cif->flags) - fn = &ffi_closure_struct_OBSD; - else - fn = &ffi_closure_OBSD; - - /* or.u %r10, %r0, %hi16(fn) */ - tramp[0] = 0x5d400000 | (((unsigned int)fn) >> 16); - /* or.u %r13, %r0, %hi16(closure) */ - tramp[1] = 0x5da00000 | ((unsigned int)closure >> 16); - /* or %r10, %r10, %lo16(fn) */ - tramp[2] = 0x594a0000 | (((unsigned int)fn) & 0xffff); - /* jmp.n %r10 */ - tramp[3] = 0xf400c40a; - /* or %r13, %r13, %lo16(closure) */ - tramp[4] = 0x59ad0000 | ((unsigned int)closure & 0xffff); - - ffi_cacheflush_OBSD((unsigned int)codeloc, FFI_TRAMPOLINE_SIZE); - - 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.25/ext/ffi_c/libffi/src/m88k/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/ffitarget.h deleted file mode 100644 index e52bf9f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/ffitarget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * m88k Foreign Function Interface - */ - -#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_OBSD, - FFI_DEFAULT_ABI = FFI_OBSD, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 0x14 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/obsd.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/obsd.S deleted file mode 100644 index 1944a23..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/m88k/obsd.S +++ /dev/null @@ -1,209 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * m88k Foreign Function Interface - */ - -#define LIBFFI_ASM -#include -#include - - .text - -/* - * ffi_cacheflush_OBSD(unsigned int addr, %r2 - * unsigned int size); %r3 - */ - .align 4 - .globl ffi_cacheflush_OBSD - .type ffi_cacheflush_OBSD,@function -ffi_cacheflush_OBSD: - tb0 0, %r0, 451 - or %r0, %r0, %r0 - jmp %r1 - .size ffi_cacheflush_OBSD, . - ffi_cacheflush_OBSD - -/* - * ffi_call_OBSD(unsigned bytes, %r2 - * extended_cif *ecif, %r3 - * unsigned flags, %r4 - * void *rvalue, %r5 - * void (*fn)()); %r6 - */ - .align 4 - .globl ffi_call_OBSD - .type ffi_call_OBSD,@function -ffi_call_OBSD: - subu %r31, %r31, 32 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 32 - - | Save the few arguments we'll need after ffi_prep_args() - st.d %r4, %r31, 8 - st %r6, %r31, 16 - - | Allocate room for the image of r2-r9, and the stack space for - | the args (rounded to a 16-byte boundary) - addu %r2, %r2, (8 * 4) + 15 - clr %r2, %r2, 4<0> - subu %r31, %r31, %r2 - - | Fill register and stack image - or %r2, %r31, %r0 -#ifdef PIC - bsr ffi_prep_args#plt -#else - bsr ffi_prep_args -#endif - - | Save pointer to return struct address, if any - or %r12, %r2, %r0 - - | Get function pointer - subu %r4, %r30, 32 - ld %r1, %r4, 16 - - | Fetch the register arguments - ld.d %r2, %r31, (0 * 4) - ld.d %r4, %r31, (2 * 4) - ld.d %r6, %r31, (4 * 4) - ld.d %r8, %r31, (6 * 4) - addu %r31, %r31, (8 * 4) - - | Invoke the function - jsr %r1 - - | Restore stack now that we don't need the args anymore - subu %r31, %r30, 32 - - | Figure out what to return as the function's return value - ld %r5, %r31, 12 | rvalue - ld %r4, %r31, 8 | flags - - bcnd eq0, %r5, 9f - - bb0 0, %r4, 1f | CIF_FLAGS_INT - st %r2, %r5, 0 - br 9f - -1: - bb0 1, %r4, 1f | CIF_FLAGS_DINT - st.d %r2, %r5, 0 - br 9f - -1: -9: - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 32 - .size ffi_call_OBSD, . - ffi_call_OBSD - -/* - * ffi_closure_OBSD(ffi_closure *closure); %r13 - */ - .align 4 - .globl ffi_closure_OBSD - .type ffi_closure_OBSD, @function -ffi_closure_OBSD: - subu %r31, %r31, 16 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 16 - - | Make room on the stack for saved register arguments and return - | value - subu %r31, %r31, (8 * 4) + (2 * 4) - st.d %r2, %r31, (0 * 4) - st.d %r4, %r31, (2 * 4) - st.d %r6, %r31, (4 * 4) - st.d %r8, %r31, (6 * 4) - - | Invoke the closure function - or %r5, %r30, 0 | calling stack - addu %r4, %r31, 0 | saved registers - addu %r3, %r31, (8 * 4) | return value - or %r2, %r13, %r0 | closure -#ifdef PIC - bsr ffi_closure_OBSD_inner#plt -#else - bsr ffi_closure_OBSD_inner -#endif - - | Figure out what to return as the function's return value - bb0 0, %r2, 1f | CIF_FLAGS_INT - ld %r2, %r31, (8 * 4) - br 9f - -1: - bb0 1, %r2, 1f | CIF_FLAGS_DINT - ld.d %r2, %r31, (8 * 4) - br 9f - -1: -9: - subu %r31, %r30, 16 - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 16 - .size ffi_closure_OBSD,.-ffi_closure_OBSD - -/* - * ffi_closure_struct_OBSD(ffi_closure *closure); %r13 - */ - .align 4 - .globl ffi_closure_struct_OBSD - .type ffi_closure_struct_OBSD, @function -ffi_closure_struct_OBSD: - subu %r31, %r31, 16 - st %r30, %r31, 4 - st %r1, %r31, 0 - addu %r30, %r31, 16 - - | Make room on the stack for saved register arguments - subu %r31, %r31, (8 * 4) - st.d %r2, %r31, (0 * 4) - st.d %r4, %r31, (2 * 4) - st.d %r6, %r31, (4 * 4) - st.d %r8, %r31, (6 * 4) - - | Invoke the closure function - or %r5, %r30, 0 | calling stack - addu %r4, %r31, 0 | saved registers - or %r3, %r12, 0 | return value - or %r2, %r13, %r0 | closure -#ifdef PIC - bsr ffi_closure_OBSD_inner#plt -#else - bsr ffi_closure_OBSD_inner -#endif - - subu %r31, %r30, 16 - ld %r1, %r31, 0 - ld %r30, %r31, 4 - jmp.n %r1 - addu %r31, %r31, 16 - .size ffi_closure_struct_OBSD,.-ffi_closure_struct_OBSD diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffi.c deleted file mode 100644 index dfc1e39..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffi.c +++ /dev/null @@ -1,330 +0,0 @@ -/* ---------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Imagination Technologies - - Meta 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 - -#include - -#define MIN(a,b) (((a) < (b)) ? (a) : (b)) - -/* - * ffi_prep_args is called by the assembly routine once stack space has been - * allocated for the function's arguments - */ - -unsigned int 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; - - /* Store return value */ - if ( ecif->cif->flags == FFI_TYPE_STRUCT ) { - argp -= 4; - *(void **) argp = ecif->rvalue; - } - - p_argv = ecif->avalue; - - /* point to next location */ - for (i = ecif->cif->nargs, p_arg = ecif->cif->arg_types; (i != 0); i--, p_arg++, p_argv++) - { - size_t z; - - /* Move argp to address of argument */ - z = (*p_arg)->size; - argp -= z; - - /* Align if necessary */ - argp = (char *) ALIGN_DOWN(ALIGN_DOWN(argp, (*p_arg)->alignment), 4); - - 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); - 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); - } - } - - /* return the size of the arguments to be passed in registers, - padded to an 8 byte boundary to preserve stack alignment */ - return FFI_ALIGN(MIN(stack - argp, 6*4), 8); -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - ffi_type **ptr; - unsigned i, bytes = 0; - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) { - if ((*ptr)->size == 0) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = FFI_ALIGN(bytes, (*ptr)->alignment); - - bytes += FFI_ALIGN((*ptr)->size, 4); - } - - /* Ensure arg space is aligned to an 8-byte boundary */ - bytes = FFI_ALIGN(bytes, 8); - - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT) { - bytes += sizeof(void*); - - /* Ensure stack is aligned to an 8-byte boundary */ - bytes = FFI_ALIGN(bytes, 8); - } - - cif->bytes = bytes; - - /* 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: - /* Meta can store return values which are <= 64 bits */ - if (cif->rtype->size <= 4) - /* Returned to D0Re0 as 32-bit value */ - cif->flags = (unsigned)FFI_TYPE_INT; - else if ((cif->rtype->size > 4) && (cif->rtype->size <= 8)) - /* Returned valued is stored to D1Re0|R0Re0 */ - cif->flags = (unsigned)FFI_TYPE_DOUBLE; - else - /* value stored in memory */ - cif->flags = (unsigned)FFI_TYPE_STRUCT; - break; - default: - cif->flags = (unsigned)FFI_TYPE_INT; - break; - } - return FFI_OK; -} - -extern void ffi_call_SYSV(void (*fn)(void), extended_cif *, unsigned, unsigned, double *); - -/* - * Exported in API. Entry point - * cif -> ffi_cif object - * fn -> function pointer - * rvalue -> pointer to return value - * avalue -> vector of void * pointers pointing to memory locations holding the - * arguments - */ -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->flags == FFI_TYPE_DOUBLE)) && (cif->rtype->type == FFI_TYPE_STRUCT)); - ecif.cif = cif; - ecif.avalue = avalue; - - double 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 - ecif.rvalue = rvalue; - - switch (cif->abi) { - case FFI_SYSV: - ffi_call_SYSV(fn, &ecif, cif->bytes, cif->flags, ecif.rvalue); - break; - default: - FFI_ASSERT(0); - break; - } - - if (small_struct) - memcpy (rvalue, &temp, cif->rtype->size); -} - -/* private members */ - -static void ffi_prep_incoming_args_SYSV (char *, void **, void **, - ffi_cif*, float *); - -void ffi_closure_SYSV (ffi_closure *); - -/* Do NOT change that without changing the FFI_TRAMPOLINE_SIZE */ -extern unsigned int ffi_metag_trampoline[10]; /* 10 instructions */ - -/* end of private members */ - -/* - * __tramp: trampoline memory location - * __fun: assembly routine - * __ctx: memory location for wrapper - * - * At this point, tramp[0] == __ctx ! - */ -void ffi_init_trampoline(unsigned char *__tramp, unsigned int __fun, unsigned int __ctx) { - memcpy (__tramp, ffi_metag_trampoline, sizeof(ffi_metag_trampoline)); - *(unsigned int*) &__tramp[40] = __ctx; - *(unsigned int*) &__tramp[44] = __fun; - /* This will flush the instruction cache */ - __builtin_meta2_cachewd(&__tramp[0], 1); - __builtin_meta2_cachewd(&__tramp[47], 1); -} - - - -/* the cif must already be prepared */ - -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 - return FFI_BAD_ABI; - - ffi_init_trampoline( - (unsigned char*)&closure->tramp[0], - (unsigned int)closure_func, - (unsigned int)codeloc); - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - return FFI_OK; -} - - -/* 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; -{ - 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; -} - -static void ffi_prep_incoming_args_SYSV(char *stack, void **rvalue, - void **avalue, ffi_cif *cif, - float *vfp_stack) -{ - register unsigned int i; - register void **p_argv; - register char *argp; - register ffi_type **p_arg; - - /* stack points to original arguments */ - argp = stack; - - /* Store return value */ - if ( cif->flags == FFI_TYPE_STRUCT ) { - argp -= 4; - *rvalue = *(void **) argp; - } - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++) { - size_t z; - size_t alignment; - - alignment = (*p_arg)->alignment; - if (alignment < 4) - alignment = 4; - if ((alignment - 1) & (unsigned)argp) - argp = (char *) FFI_ALIGN(argp, alignment); - - z = (*p_arg)->size; - *p_argv = (void*) argp; - p_argv++; - argp -= z; - } - return; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffitarget.h deleted file mode 100644 index 7b9dbeb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2013 Imagination Technologies Ltd. - Target configuration macros for Meta - - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_DEFAULT_ABI = FFI_SYSV, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1, -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 48 -#define FFI_NATIVE_RAW_API 0 - -#endif - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/sysv.S deleted file mode 100644 index b4b2a3b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/metag/sysv.S +++ /dev/null @@ -1,311 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2013 Imagination Technologies Ltd. - - Meta 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 -#define ENTRY(x) .globl CNAME(x); .type CNAME(x), %function; CNAME(x): -#endif - -#ifdef __ELF__ -#define LSYM(x) .x -#else -#define LSYM(x) x -#endif - -.macro call_reg x= - .text - .balign 4 - mov D1RtP, \x - swap D1RtP, PC -.endm - -! Save register arguments -.macro SAVE_ARGS - .text - .balign 4 - setl [A0StP++], D0Ar6, D1Ar5 - setl [A0StP++], D0Ar4, D1Ar3 - setl [A0StP++], D0Ar2, D1Ar1 -.endm - -! Save retrun, frame pointer and other regs -.macro SAVE_REGS regs= - .text - .balign 4 - setl [A0StP++], D0FrT, D1RtP - ! Needs to be a pair of regs - .ifnc "\regs","" - setl [A0StP++], \regs - .endif -.endm - -! Declare a global function -.macro METAG_FUNC_START name - .text - .balign 4 - ENTRY(\name) -.endm - -! Return registers from the stack. Reverse SAVE_REGS operation -.macro RET_REGS regs=, cond= - .ifnc "\regs", "" - getl \regs, [--A0StP] - .endif - getl D0FrT, D1RtP, [--A0StP] -.endm - -! Return arguments -.macro RET_ARGS - getl D0Ar2, D1Ar1, [--A0StP] - getl D0Ar4, D1Ar3, [--A0StP] - getl D0Ar6, D1Ar5, [--A0StP] -.endm - - - ! D1Ar1: fn - ! D0Ar2: &ecif - ! D1Ar3: cif->bytes - ! D0Ar4: fig->flags - ! D1Ar5: ecif.rvalue - - ! This assumes we are using GNU as -METAG_FUNC_START ffi_call_SYSV - ! Save argument registers - - SAVE_ARGS - - ! new frame - mov D0FrT, A0FrP - add A0FrP, A0StP, #0 - - ! Preserve the old frame pointer - SAVE_REGS "D1.5, D0.5" - - ! Make room for new args. cifs->bytes is the total space for input - ! and return arguments - - add A0StP, A0StP, D1Ar3 - - ! Preserve cifs->bytes & fn - mov D0.5, D1Ar3 - mov D1.5, D1Ar1 - - ! Place all of the ffi_prep_args in position - mov D1Ar1, A0StP - - ! Call ffi_prep_args(stack, &ecif) -#ifdef __PIC__ - callr D1RtP, CNAME(ffi_prep_args@PLT) -#else - callr D1RtP, CNAME(ffi_prep_args) -#endif - - ! Restore fn pointer - - ! The foreign stack should look like this - ! XXXXX XXXXXX <--- stack pointer - ! FnArgN rvalue - ! FnArgN+2 FnArgN+1 - ! FnArgN+4 FnArgN+3 - ! .... - ! - - ! A0StP now points to the first (or return) argument + 4 - - ! Preserve cif->bytes - getl D0Ar2, D1Ar1, [--A0StP] - getl D0Ar4, D1Ar3, [--A0StP] - getl D0Ar6, D1Ar5, [--A0StP] - - ! Place A0StP to the first argument again - add A0StP, A0StP, #24 ! That's because we loaded 6 regs x 4 byte each - - ! A0FrP points to the initial stack without the reserved space for the - ! cifs->bytes, whilst A0StP points to the stack after the space allocation - - ! fn was the first argument of ffi_call_SYSV. - ! The stack at this point looks like this: - ! - ! A0StP(on entry to _SYSV) -> Arg6 Arg5 | low - ! Arg4 Arg3 | - ! Arg2 Arg1 | - ! A0FrP ----> D0FrtP D1RtP | - ! D1.5 D0.5 | - ! A0StP(bf prep_args) -> FnArgn FnArgn-1 | - ! FnArgn-2FnArgn-3 | - ! ................ | <= cifs->bytes - ! FnArg4 FnArg3 | - ! A0StP (prv_A0StP+cifs->bytes) FnArg2 FnArg1 | high - ! - ! fn was in Arg1 so it's located in in A0FrP+#-0xC - ! - - ! D0Re0 contains the size of arguments stored in registers - sub A0StP, A0StP, D0Re0 - - ! Arg1 is the function pointer for the foreign call. This has been - ! preserved in D1.5 - - ! Time to call (fn). Arguments should be like this: - ! Arg1-Arg6 are loaded to regs - ! The rest of the arguments are stored in stack pointed by A0StP - - call_reg D1.5 - - ! Reset stack. - - mov A0StP, A0FrP - - ! Load Arg1 with the pointer to storage for the return type - ! This was stored in Arg5 - - getd D1Ar1, [A0FrP+#-20] - - ! Load D0Ar2 with the return type code. This was stored in Arg4 (flags) - - getd D0Ar2, [A0FrP+#-16] - - ! We are ready to start processing the return value - ! D0Re0 (and D1Re0) hold the return value - - ! If the return value is NULL, assume no return value - cmp D1Ar1, #0 - beq LSYM(Lepilogue) - - ! return INT - cmp D0Ar2, #FFI_TYPE_INT - ! Sadly, there is no setd{cc} instruction so we need to workaround that - bne .INT64 - setd [D1Ar1], D0Re0 - b LSYM(Lepilogue) - - ! return INT64 -.INT64: - cmp D0Ar2, #FFI_TYPE_SINT64 - setleq [D1Ar1], D0Re0, D1Re0 - - ! return DOUBLE - cmp D0Ar2, #FFI_TYPE_DOUBLE - setl [D1AR1++], D0Re0, D1Re0 - -LSYM(Lepilogue): - ! At this point, the stack pointer points right after the argument - ! saved area. We need to restore 4 regs, therefore we need to move - ! 16 bytes ahead. - add A0StP, A0StP, #16 - RET_REGS "D1.5, D0.5" - RET_ARGS - getd D0Re0, [A0StP] - mov A0FrP, D0FrT - swap D1RtP, PC - -.ffi_call_SYSV_end: - .size CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV) - - -/* - (called by ffi_metag_trampoline) - void ffi_closure_SYSV (ffi_closure*) - - (called by ffi_closure_SYSV) - unsigned int FFI_HIDDEN - ffi_closure_SYSV_inner (closure,respp, args) - ffi_closure *closure; - void **respp; - void *args; -*/ - -METAG_FUNC_START ffi_closure_SYSV - ! We assume that D1Ar1 holds the address of the - ! ffi_closure struct. We will use that to fetch the - ! arguments. The stack pointer points to an empty space - ! and it is ready to store more data. - - ! D1Ar1 is ready - ! Allocate stack space for return value - add A0StP, A0StP, #8 - ! Store it to D0Ar2 - sub D0Ar2, A0StP, #8 - - sub D1Ar3, A0FrP, #4 - - ! D1Ar3 contains the address of the original D1Ar1 argument - ! We need to subtract #4 later on - - ! Preverve D0Ar2 - mov D0.5, D0Ar2 - -#ifdef __PIC__ - callr D1RtP, CNAME(ffi_closure_SYSV_inner@PLT) -#else - callr D1RtP, CNAME(ffi_closure_SYSV_inner) -#endif - - ! Check the return value and store it to D0.5 - cmp D0Re0, #FFI_TYPE_INT - beq .Lretint - cmp D0Re0, #FFI_TYPE_DOUBLE - beq .Lretdouble -.Lclosure_epilogue: - sub A0StP, A0StP, #8 - RET_REGS "D1.5, D0.5" - RET_ARGS - swap D1RtP, PC - -.Lretint: - setd [D0.5], D0Re0 - b .Lclosure_epilogue -.Lretdouble: - setl [D0.5++], D0Re0, D1Re0 - b .Lclosure_epilogue -.ffi_closure_SYSV_end: -.size CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV) - - -ENTRY(ffi_metag_trampoline) - SAVE_ARGS - ! New frame - mov A0FrP, A0StP - SAVE_REGS "D1.5, D0.5" - mov D0.5, PC - ! Load D1Ar1 the value of ffi_metag_trampoline - getd D1Ar1, [D0.5 + #8] - ! Jump to ffi_closure_SYSV - getd PC, [D0.5 + #12] diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffi.c deleted file mode 100644 index df6e33c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffi.c +++ /dev/null @@ -1,321 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012, 2013 Xilinx, Inc - - MicroBlaze 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 - -extern void ffi_call_SYSV(void (*)(void*, extended_cif*), extended_cif*, - unsigned int, unsigned int, unsigned int*, void (*fn)(void), - unsigned int, unsigned int); - -extern void ffi_closure_SYSV(void); - -#define WORD_SIZE sizeof(unsigned int) -#define ARGS_REGISTER_SIZE (WORD_SIZE * 6) -#define WORD_FFI_ALIGN(x) FFI_ALIGN(x, WORD_SIZE) - -/* 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; - ffi_type** p_arg; - void** p_argv; - void* stack_args_p = stack; - - if (ecif == NULL || ecif->cif == NULL) { - return; /* no description to prepare */ - } - - p_argv = ecif->avalue; - - if ((ecif->cif->rtype != NULL) && - (ecif->cif->rtype->type == FFI_TYPE_STRUCT)) - { - /* if return type is a struct which is referenced on the stack/reg5, - * by a pointer. Stored the return value pointer in r5. - */ - char* addr = stack_args_p; - memcpy(addr, &(ecif->rvalue), WORD_SIZE); - stack_args_p += WORD_SIZE; - } - - if (ecif->avalue == NULL) { - return; /* no arguments to prepare */ - } - - for (i = 0, p_arg = ecif->cif->arg_types; i < ecif->cif->nargs; - i++, p_arg++) - { - size_t size = (*p_arg)->size; - int type = (*p_arg)->type; - void* value = p_argv[i]; - char* addr = stack_args_p; - int aligned_size = WORD_FFI_ALIGN(size); - - /* force word alignment on the stack */ - stack_args_p += aligned_size; - - switch (type) - { - case FFI_TYPE_UINT8: - *(unsigned int *)addr = (unsigned int)*(UINT8*)(value); - break; - case FFI_TYPE_SINT8: - *(signed int *)addr = (signed int)*(SINT8*)(value); - break; - case FFI_TYPE_UINT16: - *(unsigned int *)addr = (unsigned int)*(UINT16*)(value); - break; - case FFI_TYPE_SINT16: - *(signed int *)addr = (signed int)*(SINT16*)(value); - break; - case FFI_TYPE_STRUCT: -#if __BIG_ENDIAN__ - /* - * MicroBlaze toolchain appears to emit: - * bsrli r5, r5, 8 (caller) - * ... - * - * ... - * bslli r5, r5, 8 (callee) - * - * For structs like "struct a { uint8_t a[3]; };", when passed - * by value. - * - * Structs like "struct b { uint16_t a; };" are also expected - * to be packed strangely in registers. - * - * This appears to be because the microblaze toolchain expects - * "struct b == uint16_t", which is only any issue for big - * endian. - * - * The following is a work around for big-endian only, for the - * above mentioned case, it will re-align the contents of a - * <= 3-byte struct value. - */ - if (size < WORD_SIZE) - { - memcpy (addr + (WORD_SIZE - size), value, size); - break; - } -#endif - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: - default: - memcpy(addr, value, aligned_size); - } - } -} - -ffi_status ffi_prep_cif_machdep(ffi_cif* cif) -{ - /* check ABI */ - switch (cif->abi) - { - case FFI_SYSV: - break; - default: - return FFI_BAD_ABI; - } - return FFI_OK; -} - -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, cif->rtype->type, cif->rtype->size); - break; - default: - FFI_ASSERT(0); - break; - } -} - -void ffi_closure_call_SYSV(void* register_args, void* stack_args, - ffi_closure* closure, void* rvalue, - unsigned int* rtype, unsigned int* rsize) -{ - /* prepare arguments for closure call */ - ffi_cif* cif = closure->cif; - ffi_type** arg_types = cif->arg_types; - - /* re-allocate data for the args. This needs to be done in order to keep - * multi-word objects (e.g. structs) in contiguous memory. Callers are not - * required to store the value of args in the lower 6 words in the stack - * (although they are allocated in the stack). - */ - char* stackclone = alloca(cif->bytes); - void** avalue = alloca(cif->nargs * sizeof(void*)); - void* struct_rvalue = NULL; - char* ptr = stackclone; - int i; - - /* copy registers into stack clone */ - int registers_used = cif->bytes; - if (registers_used > ARGS_REGISTER_SIZE) { - registers_used = ARGS_REGISTER_SIZE; - } - memcpy(stackclone, register_args, registers_used); - - /* copy stack allocated args into stack clone */ - if (cif->bytes > ARGS_REGISTER_SIZE) { - int stack_used = cif->bytes - ARGS_REGISTER_SIZE; - memcpy(stackclone + ARGS_REGISTER_SIZE, stack_args, stack_used); - } - - /* preserve struct type return pointer passing */ - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - struct_rvalue = *((void**)ptr); - ptr += WORD_SIZE; - } - - /* populate arg pointer list */ - for (i = 0; i < cif->nargs; i++) - { - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifdef __BIG_ENDIAN__ - avalue[i] = ptr + 3; -#else - avalue[i] = ptr; -#endif - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifdef __BIG_ENDIAN__ - avalue[i] = ptr + 2; -#else - avalue[i] = ptr; -#endif - break; - case FFI_TYPE_STRUCT: -#if __BIG_ENDIAN__ - /* - * Work around strange ABI behaviour. - * (see info in ffi_prep_args) - */ - if (arg_types[i]->size < WORD_SIZE) - { - memcpy (ptr, ptr + (WORD_SIZE - arg_types[i]->size), arg_types[i]->size); - } -#endif - avalue[i] = (void*)ptr; - break; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_DOUBLE: - avalue[i] = ptr; - break; - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - default: - /* default 4-byte argument */ - avalue[i] = ptr; - break; - } - ptr += WORD_FFI_ALIGN(arg_types[i]->size); - } - - /* set the return type info passed back to the wrapper */ - *rsize = cif->rtype->size; - *rtype = cif->rtype->type; - if (struct_rvalue != NULL) { - closure->fun(cif, struct_rvalue, avalue, closure->user_data); - /* copy struct return pointer value into function return value */ - *((void**)rvalue) = struct_rvalue; - } else { - closure->fun(cif, rvalue, avalue, closure->user_data); - } -} - -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 long* tramp = (unsigned long*)&(closure->tramp[0]); - unsigned long cls = (unsigned long)codeloc; - unsigned long fn = 0; - unsigned long fn_closure_call_sysv = (unsigned long)ffi_closure_call_SYSV; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - switch (cif->abi) - { - case FFI_SYSV: - fn = (unsigned long)ffi_closure_SYSV; - - /* load r11 (temp) with fn */ - /* imm fn(upper) */ - tramp[0] = 0xb0000000 | ((fn >> 16) & 0xffff); - /* addik r11, r0, fn(lower) */ - tramp[1] = 0x31600000 | (fn & 0xffff); - - /* load r12 (temp) with cls */ - /* imm cls(upper) */ - tramp[2] = 0xb0000000 | ((cls >> 16) & 0xffff); - /* addik r12, r0, cls(lower) */ - tramp[3] = 0x31800000 | (cls & 0xffff); - - /* load r3 (temp) with ffi_closure_call_SYSV */ - /* imm fn_closure_call_sysv(upper) */ - tramp[4] = 0xb0000000 | ((fn_closure_call_sysv >> 16) & 0xffff); - /* addik r3, r0, fn_closure_call_sysv(lower) */ - tramp[5] = 0x30600000 | (fn_closure_call_sysv & 0xffff); - /* branch/jump to address stored in r11 (fn) */ - tramp[6] = 0x98085800; /* bra r11 */ - - break; - default: - return FFI_BAD_ABI; - } - return FFI_OK; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffitarget.h deleted file mode 100644 index c6fa5a4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2012, 2013 Xilinx, Inc - - Target configuration macros for MicroBlaze. - - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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_NATIVE_RAW_API 0 - -#define FFI_TRAMPOLINE_SIZE (4*8) - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/sysv.S deleted file mode 100644 index ea43e9d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/microblaze/sysv.S +++ /dev/null @@ -1,302 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2012, 2013 Xilinx, Inc - - MicroBlaze 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 - - /* - * arg[0] (r5) = ffi_prep_args, - * arg[1] (r6) = &ecif, - * arg[2] (r7) = cif->bytes, - * arg[3] (r8) = cif->flags, - * arg[4] (r9) = ecif.rvalue, - * arg[5] (r10) = fn - * arg[6] (sp[0]) = cif->rtype->type - * arg[7] (sp[4]) = cif->rtype->size - */ - .text - .globl ffi_call_SYSV - .type ffi_call_SYSV, @function -ffi_call_SYSV: - /* push callee saves */ - addik r1, r1, -20 - swi r19, r1, 0 /* Frame Pointer */ - swi r20, r1, 4 /* PIC register */ - swi r21, r1, 8 /* PIC register */ - swi r22, r1, 12 /* save for locals */ - swi r23, r1, 16 /* save for locals */ - - /* save the r5-r10 registers in the stack */ - addik r1, r1, -24 /* increment sp to store 6x 32-bit words */ - swi r5, r1, 0 - swi r6, r1, 4 - swi r7, r1, 8 - swi r8, r1, 12 - swi r9, r1, 16 - swi r10, r1, 20 - - /* save function pointer */ - addik r3, r5, 0 /* copy ffi_prep_args into r3 */ - addik r22, r1, 0 /* save sp for unallocated args into r22 (callee-saved) */ - addik r23, r10, 0 /* save function address into r23 (callee-saved) */ - - /* prepare stack with allocation for n (bytes = r7) args */ - rsub r1, r7, r1 /* subtract bytes from sp */ - - /* prep args for ffi_prep_args call */ - addik r5, r1, 0 /* store stack pointer into arg[0] */ - /* r6 still holds ecif for arg[1] */ - - /* Call ffi_prep_args(stack, &ecif). */ - addik r1, r1, -4 - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r3 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 4 /* restore the link register from the frame */ - /* returns calling stack pointer location */ - - /* prepare args for fn call, prep_args populates them onto the stack */ - lwi r5, r1, 0 /* arg[0] */ - lwi r6, r1, 4 /* arg[1] */ - lwi r7, r1, 8 /* arg[2] */ - lwi r8, r1, 12 /* arg[3] */ - lwi r9, r1, 16 /* arg[4] */ - lwi r10, r1, 20 /* arg[5] */ - - /* call (fn) (...). */ - addik r1, r1, -4 - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r23 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 4 /* restore the link register from the frame */ - - /* Remove the space we pushed for the args. */ - addik r1, r22, 0 /* restore old SP */ - - /* restore this functions parameters */ - lwi r5, r1, 0 /* arg[0] */ - lwi r6, r1, 4 /* arg[1] */ - lwi r7, r1, 8 /* arg[2] */ - lwi r8, r1, 12 /* arg[3] */ - lwi r9, r1, 16 /* arg[4] */ - lwi r10, r1, 20 /* arg[5] */ - addik r1, r1, 24 /* decrement sp to de-allocate 6x 32-bit words */ - - /* If the return value pointer is NULL, assume no return value. */ - beqi r9, ffi_call_SYSV_end - - lwi r22, r1, 48 /* get return type (20 for locals + 28 for arg[6]) */ - lwi r23, r1, 52 /* get return size (20 for locals + 32 for arg[7]) */ - - /* Check if return type is actually a struct, do nothing */ - rsubi r11, r22, FFI_TYPE_STRUCT - beqi r11, ffi_call_SYSV_end - - /* Return 8bit */ - rsubi r11, r23, 1 - beqi r11, ffi_call_SYSV_store8 - - /* Return 16bit */ - rsubi r11, r23, 2 - beqi r11, ffi_call_SYSV_store16 - - /* Return 32bit */ - rsubi r11, r23, 4 - beqi r11, ffi_call_SYSV_store32 - - /* Return 64bit */ - rsubi r11, r23, 8 - beqi r11, ffi_call_SYSV_store64 - - /* Didn't match anything */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store64: - swi r3, r9, 0 /* store word r3 into return value */ - swi r4, r9, 4 /* store word r4 into return value */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store32: - swi r3, r9, 0 /* store word r3 into return value */ - bri ffi_call_SYSV_end - -ffi_call_SYSV_store16: -#ifdef __BIG_ENDIAN__ - shi r3, r9, 2 /* store half-word r3 into return value */ -#else - shi r3, r9, 0 /* store half-word r3 into return value */ -#endif - bri ffi_call_SYSV_end - -ffi_call_SYSV_store8: -#ifdef __BIG_ENDIAN__ - sbi r3, r9, 3 /* store byte r3 into return value */ -#else - sbi r3, r9, 0 /* store byte r3 into return value */ -#endif - bri ffi_call_SYSV_end - -ffi_call_SYSV_end: - /* callee restores */ - lwi r19, r1, 0 /* frame pointer */ - lwi r20, r1, 4 /* PIC register */ - lwi r21, r1, 8 /* PIC register */ - lwi r22, r1, 12 - lwi r23, r1, 16 - addik r1, r1, 20 - - /* return from sub-routine (with delay slot) */ - rtsd r15, 8 - nop - - .size ffi_call_SYSV, . - ffi_call_SYSV - -/* ------------------------------------------------------------------------- */ - - /* - * args passed into this function, are passed down to the callee. - * this function is the target of the closure trampoline, as such r12 is - * a pointer to the closure object. - */ - .text - .globl ffi_closure_SYSV - .type ffi_closure_SYSV, @function -ffi_closure_SYSV: - /* push callee saves */ - addik r11, r1, 28 /* save stack args start location (excluding regs/link) */ - addik r1, r1, -12 - swi r19, r1, 0 /* Frame Pointer */ - swi r20, r1, 4 /* PIC register */ - swi r21, r1, 8 /* PIC register */ - - /* store register args on stack */ - addik r1, r1, -24 - swi r5, r1, 0 - swi r6, r1, 4 - swi r7, r1, 8 - swi r8, r1, 12 - swi r9, r1, 16 - swi r10, r1, 20 - - /* setup args */ - addik r5, r1, 0 /* register_args */ - addik r6, r11, 0 /* stack_args */ - addik r7, r12, 0 /* closure object */ - addik r1, r1, -8 /* allocate return value */ - addik r8, r1, 0 /* void* rvalue */ - addik r1, r1, -8 /* allocate for return type/size values */ - addik r9, r1, 0 /* void* rtype */ - addik r10, r1, 4 /* void* rsize */ - - /* call the wrap_call function */ - addik r1, r1, -28 /* allocate args + link reg */ - swi r15, r1, 0 /* store the link register in the frame */ - brald r15, r3 - nop /* branch has delay slot */ - lwi r15, r1, 0 - addik r1, r1, 28 /* restore the link register from the frame */ - -ffi_closure_SYSV_prepare_return: - lwi r9, r1, 0 /* rtype */ - lwi r10, r1, 4 /* rsize */ - addik r1, r1, 8 /* de-allocate return info values */ - - /* Check if return type is actually a struct, store 4 bytes */ - rsubi r11, r9, FFI_TYPE_STRUCT - beqi r11, ffi_closure_SYSV_store32 - - /* Return 8bit */ - rsubi r11, r10, 1 - beqi r11, ffi_closure_SYSV_store8 - - /* Return 16bit */ - rsubi r11, r10, 2 - beqi r11, ffi_closure_SYSV_store16 - - /* Return 32bit */ - rsubi r11, r10, 4 - beqi r11, ffi_closure_SYSV_store32 - - /* Return 64bit */ - rsubi r11, r10, 8 - beqi r11, ffi_closure_SYSV_store64 - - /* Didn't match anything */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store64: - lwi r3, r1, 0 /* store word r3 into return value */ - lwi r4, r1, 4 /* store word r4 into return value */ - /* 64 bits == 2 words, no sign extend occurs */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store32: - lwi r3, r1, 0 /* store word r3 into return value */ - /* 32 bits == 1 word, no sign extend occurs */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store16: -#ifdef __BIG_ENDIAN__ - lhui r3, r1, 2 /* store half-word r3 into return value */ -#else - lhui r3, r1, 0 /* store half-word r3 into return value */ -#endif - rsubi r11, r9, FFI_TYPE_SINT16 - bnei r11, ffi_closure_SYSV_end - sext16 r3, r3 /* fix sign extend of sint8 */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_store8: -#ifdef __BIG_ENDIAN__ - lbui r3, r1, 3 /* store byte r3 into return value */ -#else - lbui r3, r1, 0 /* store byte r3 into return value */ -#endif - rsubi r11, r9, FFI_TYPE_SINT8 - bnei r11, ffi_closure_SYSV_end - sext8 r3, r3 /* fix sign extend of sint8 */ - bri ffi_closure_SYSV_end - -ffi_closure_SYSV_end: - addik r1, r1, 8 /* de-allocate return value */ - - /* de-allocate stored args */ - addik r1, r1, 24 - - /* callee restores */ - lwi r19, r1, 0 /* frame pointer */ - lwi r20, r1, 4 /* PIC register */ - lwi r21, r1, 8 /* PIC register */ - addik r1, r1, 12 - - /* return from sub-routine (with delay slot) */ - rtsd r15, 8 - nop - - .size ffi_closure_SYSV, . - ffi_closure_SYSV diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffi.c deleted file mode 100644 index 057b046..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffi.c +++ /dev/null @@ -1,1130 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 -#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; - -#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 - if ( ecif->cif->rstruct_flag != 0 ) -#else - if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) -#endif - { - *(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 *) FFI_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: -#ifdef FFI_MIPS_N32 - /* The N32 ABI requires that 32-bit integers - be sign-extended to 64-bits, regardless of - whether they are signed or unsigned. */ - *(ffi_arg *)argp = *(SINT32 *)(* p_argv); -#else - *(ffi_arg *)argp = *(UINT32 *)(* p_argv); -#endif - 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 = FFI_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 = FFI_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 */ -static ffi_status ffi_prep_cif_machdep_int(ffi_cif *cif, unsigned nfixedargs) -{ - cif->flags = 0; - cif->mips_nfixedargs = nfixedargs; - -#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 && cif->nargs == nfixedargs) - { - 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; - - // Pass variadic arguments in integer registers even if they're floats - if (soft_float || index >= nfixedargs) - { - 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 = FFI_ALIGN(arg_reg, 2); - /* Treat it as two adjacent doubles. */ - if (soft_float || index >= nfixedargs) - { - 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 || index >= nfixedargs, - (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; -} - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - return ffi_prep_cif_machdep_int(cif, cif->nargs); -} - -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned nfixedargs, - unsigned ntotalargs MAYBE_UNUSED) -{ - return ffi_prep_cif_machdep_int(cif, nfixedargs); -} - -/* 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), void *closure); - -/* 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 *closure); - -void ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - 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, closure); - 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, closure); - if (copy_rvalue) - memcpy(ecif.rvalue, rvalue_copy + copy_offset, cif->rtype->size); - } - break; -#endif - - default: - FFI_ASSERT(0); - break; - } -} - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - - -#if FFI_CLOSURES -#if defined(FFI_MIPS_O32) -extern void ffi_closure_O32(void); -extern void ffi_go_closure_O32(void); -#else -extern void ffi_closure_N32(void); -extern void ffi_go_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 -#if _MIPS_SIM ==_ABIN32 - if (cif->abi != FFI_N32 - && cif->abi != FFI_N32_SOFT_FLOAT) - return FFI_BAD_ABI; -#else - if (cif->abi != FFI_N64 - && cif->abi != FFI_N64_SOFT_FLOAT) - return FFI_BAD_ABI; -#endif - 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 */ -#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) - tramp[3] = 0x03200008; -#else - tramp[3] = 0x03200009; -#endif - /* 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 */ -#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) - tramp[11] = 0x03200008; -#else - tramp[11] = 0x03200009; -#endif - /* 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_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, ffi_arg *ar, - double *fpr) -{ - void **avaluep; - ffi_arg *avalue; - ffi_type **arg_types; - int i, avn, argn, seen_int; - - avalue = alloca (cif->nargs * sizeof (ffi_arg)); - avaluep = alloca (cif->nargs * sizeof (ffi_arg)); - - seen_int = (cif->abi == FFI_O32_SOFT_FLOAT) || (cif->mips_nfixedargs != cif->nargs); - argn = 0; - - if ((cif->flags >> (FFI_FLAG_BITS * 2)) == FFI_TYPE_STRUCT) - { - rvalue = (void *)(uintptr_t)ar[0]; - argn = 1; - seen_int = 1; - } - - i = 0; - avn = cif->nargs; - arg_types = cif->arg_types; - - while (i < avn) - { - if (arg_types[i]->alignment == 8 && (argn & 0x1)) - argn++; - 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 - { - 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 += FFI_ALIGN(arg_types[i]->size, FFI_SIZEOF_ARG) / FFI_SIZEOF_ARG; - i++; - } - - /* Invoke the closure. */ - fun(cif, rvalue, avaluep, 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 = FFI_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_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, ffi_arg *ar, - ffi_arg *fpr) -{ - void **avaluep; - ffi_arg *avalue; - ffi_type **arg_types; - int i, avn, argn; - int soft_float; - ffi_arg *argp; - - 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 || i >= cif->mips_nfixedargs || soft_float) ? ar + argn : fpr + argn; - if ((arg_types[i]->type == FFI_TYPE_LONGDOUBLE) && ((uintptr_t)argp & (arg_types[i]->alignment-1))) - { - argp=(ffi_arg*)FFI_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 = FFI_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, i >= cif->mips_nfixedargs || soft_float); - - break; - } - /* Else fall through. */ - default: - avaluep[i] = (char *) argp; - break; - } - } - argn += FFI_ALIGN(arg_types[i]->size, sizeof(ffi_arg)) / sizeof(ffi_arg); - i++; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avaluep, user_data); - - return cif->flags >> (FFI_FLAG_BITS * 8); -} - -#endif /* FFI_MIPS_N32 */ - -#if defined(FFI_MIPS_O32) -extern void ffi_closure_O32(void); -extern void ffi_go_closure_O32(void); -#else -extern void ffi_closure_N32(void); -extern void ffi_go_closure_N32(void); -#endif /* FFI_MIPS_O32 */ - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - void * fn; - -#if defined(FFI_MIPS_O32) - if (cif->abi != FFI_O32 && cif->abi != FFI_O32_SOFT_FLOAT) - return FFI_BAD_ABI; - fn = ffi_go_closure_O32; -#else -#if _MIPS_SIM ==_ABIN32 - if (cif->abi != FFI_N32 - && cif->abi != FFI_N32_SOFT_FLOAT) - return FFI_BAD_ABI; -#else - if (cif->abi != FFI_N64 - && cif->abi != FFI_N64_SOFT_FLOAT) - return FFI_BAD_ABI; -#endif - fn = ffi_go_closure_N32; -#endif /* FFI_MIPS_O32 */ - - closure->tramp = (void *)fn; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -#endif /* FFI_CLOSURES */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffitarget.h deleted file mode 100644 index fffdb97..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/ffitarget.h +++ /dev/null @@ -1,244 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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; unsigned mips_nfixedargs -#define FFI_TARGET_SPECIFIC_VARIADIC -#endif /* !LIBFFI_ASM */ - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -#if defined(FFI_MIPS_O32) || (_MIPS_SIM ==_ABIN32) -# define FFI_TRAMPOLINE_SIZE 20 -#else -# define FFI_TRAMPOLINE_SIZE 56 -#endif - -#endif - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/n32.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/n32.S deleted file mode 100644 index 1a940b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/mips/n32.S +++ /dev/null @@ -1,663 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 closure a6 - -/* Note: to keep stack 16 byte aligned we need even number slots - used 9 slots here -*/ -#define SIZEOF_FRAME ( 10 * FFI_SIZEOF_ARG ) - -#ifdef __GNUC__ - .abicalls -#endif -#if !defined(__mips_isa_rev) || (__mips_isa_rev<6) - .set mips4 -#endif - .text - .align 2 - .globl ffi_call_N32 - .ent ffi_call_N32 -ffi_call_N32: -.LFB0: - .frame $fp, SIZEOF_FRAME, ra - .mask 0xc0000000,-FFI_SIZEOF_ARG - .fmask 0x00000000,0 - - # Prologue - SUBU $sp, SIZEOF_FRAME # Frame size -.LCFI00: - 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 -.LCFI01: - move $fp, $sp -.LCFI02: - 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 - REG_S closure, 6*FFI_SIZEOF_ARG($fp) # closure - - # 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. - -#ifdef __mips_soft_float - REG_L a0, 0*FFI_SIZEOF_ARG(t9) - REG_L a1, 1*FFI_SIZEOF_ARG(t9) - REG_L a2, 2*FFI_SIZEOF_ARG(t9) - REG_L a3, 3*FFI_SIZEOF_ARG(t9) - REG_L a4, 4*FFI_SIZEOF_ARG(t9) - REG_L a5, 5*FFI_SIZEOF_ARG(t9) - REG_L a6, 6*FFI_SIZEOF_ARG(t9) - REG_L a7, 7*FFI_SIZEOF_ARG(t9) -#else - 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 -$LCFI00: - REG_S $fp, FP_OFF($sp) # Save frame pointer -$LCFI01: - REG_S ra, RA_OFF($sp) # Save return address -$LCFI02: - move $fp, $sp - -$LCFI03: - 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 - -#ifndef __mips_soft_float - bnez t0, pass_d # make it quick for int -#endif - 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 - -#ifndef __mips_soft_float -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 -#endif - -call_it: - # Load the static chain pointer - REG_L t7, SIZEOF_FRAME + 6*FFI_SIZEOF_ARG($fp) - - # 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) -#ifndef __mips_soft_float - s.s $f0, 0(t0) -#else - REG_S v0, 0(t0) -#endif - b epilogue - -retdouble: - bne t2, FFI_TYPE_DOUBLE, noretval - jalr t9 - REG_L t0, SIZEOF_FRAME + 4*FFI_SIZEOF_ARG($fp) -#ifndef __mips_soft_float - s.d $f0, 0(t0) -#else - REG_S v1, 4(t0) - REG_S v0, 0(t0) -#endif - 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 a5 save - -12 - Called function a4 save - -13 - Called function a3 save - -14 - Called function a2 save - -15 - Called function a1 save - -16 - Called function a0 save, our sp and fp point here - */ - -#define SIZEOF_FRAME2 (16 * 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) -#define CALLED_A5_OFF2 (SIZEOF_FRAME2 - 11 * FFI_SIZEOF_ARG) -#define CALLED_A4_OFF2 (SIZEOF_FRAME2 - 12 * FFI_SIZEOF_ARG) - - .text - - .align 2 - .globl ffi_go_closure_O32 - .ent ffi_go_closure_O32 -ffi_go_closure_O32: -$LFB1: - # Prologue - .frame $fp, SIZEOF_FRAME2, ra - .set noreorder - .cpload t9 - .set reorder - SUBU $sp, SIZEOF_FRAME2 - .cprestore GP_OFF2 -$LCFI10: - - 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 -$LCFI11: - - move $fp, $sp -$LCFI12: - - 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, 4($15) # cif - 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: - # prepare arguments for ffi_closure_mips_inner_O32 - REG_L a0, 4($15) # cif - REG_L a1, 8($15) # fun - move a2, $15 # user_data = go closure - addu a3, $fp, V0_OFF2 # rvalue - - addu t9, $fp, A0_OFF2 # ar - REG_S t9, CALLED_A4_OFF2($fp) - - addu t9, $fp, FA_0_0_OFF2 #fpr - REG_S t9, CALLED_A5_OFF2($fp) - - b $do_closure - -$LFE1: - .end ffi_go_closure_O32 - - .align 2 - .globl ffi_closure_O32 - .ent ffi_closure_O32 -ffi_closure_O32: -$LFB2: - # Prologue - .frame $fp, SIZEOF_FRAME2, ra - .set noreorder - .cpload t9 - .set reorder - SUBU $sp, SIZEOF_FRAME2 - .cprestore GP_OFF2 -$LCFI20: - 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 -$LCFI21: - move $fp, $sp - -$LCFI22: - # 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 - -#ifndef __mips_soft_float - # Store all possible float/double registers. - s.d $f12, FA_0_0_OFF2($fp) - s.d $f14, FA_1_0_OFF2($fp) -#endif -1: - # prepare arguments for ffi_closure_mips_inner_O32 - REG_L a0, 20($12) # cif pointer follows tramp. - REG_L a1, 24($12) # fun - REG_L a2, 28($12) # user_data - addu a3, $fp, V0_OFF2 # rvalue - - addu t9, $fp, A0_OFF2 # ar - REG_S t9, CALLED_A4_OFF2($fp) - - addu t9, $fp, FA_0_0_OFF2 #fpr - REG_S t9, CALLED_A5_OFF2($fp) - -$do_closure: - la t9, ffi_closure_mips_inner_O32 - # Call ffi_closure_mips_inner_O32 to do the work. - 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 - -#ifndef __mips_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 -#endif -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 -$LFE2: - .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 $LCFI00-$LFB0 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 0x18 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI01-$LCFI00 - .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 $LCFI02-$LCFI01 - .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 $LCFI10-$LFB1 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 SIZEOF_FRAME2 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI11-$LCFI10 - .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 $LCFI12-$LCFI11 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 SIZEOF_FRAME2 - .align 2 -$LEFDE1: - -$LSFDE2: - .4byte $LEFDE2-$LASFDE2 # FDE Length -$LASFDE2: - .4byte $LASFDE2-$Lframe0 # 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 $LCFI20-$LFB2 - .byte 0xe # DW_CFA_def_cfa_offset - .uleb128 SIZEOF_FRAME2 - .byte 0x4 # DW_CFA_advance_loc4 - .4byte $LCFI21-$LCFI20 - .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 $LCFI22-$LCFI21 - .byte 0xc # DW_CFA_def_cfa - .uleb128 0x1e - .uleb128 SIZEOF_FRAME2 - .align 2 -$LEFDE2: - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/eabi.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/eabi.S deleted file mode 100644 index 10cfb04..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/eabi.S +++ /dev/null @@ -1,101 +0,0 @@ -/* ----------------------------------------------------------------------- - eabi.S - Copyright (c) 2012, 2013 Anthony Green - - Moxie 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 - - # $r0 : ffi_prep_args - # $r1 : &ecif - # $r2 : cif->bytes - # $r3 : fig->flags - # $r4 : ecif.rvalue - # $r5 : fn - -ffi_call_EABI: - push $sp, $r6 - push $sp, $r7 - push $sp, $r8 - dec $sp, 24 - - /* Store incoming args on stack. */ - sto.l 0($sp), $r0 /* ffi_prep_args */ - sto.l 4($sp), $r1 /* ecif */ - sto.l 8($sp), $r2 /* bytes */ - sto.l 12($sp), $r3 /* flags */ - sto.l 16($sp), $r4 /* &rvalue */ - sto.l 20($sp), $r5 /* fn */ - - /* Call ffi_prep_args. */ - mov $r6, $r4 /* Save result buffer */ - mov $r7, $r5 /* Save the target fn */ - mov $r8, $r3 /* Save the flags */ - sub $sp, $r2 /* Allocate stack space */ - mov $r0, $sp /* We can stomp over $r0 */ - /* $r1 is already set up */ - jsra ffi_prep_args - - /* Load register arguments. */ - ldo.l $r0, 0($sp) - ldo.l $r1, 4($sp) - ldo.l $r2, 8($sp) - ldo.l $r3, 12($sp) - ldo.l $r4, 16($sp) - ldo.l $r5, 20($sp) - - /* Call the target function. */ - jsr $r7 - - ldi.l $r7, 0xffffffff - cmp $r8, $r7 - beq retstruct - - ldi.l $r7, 4 - cmp $r8, $r7 - bgt ret2reg - - st.l ($r6), $r0 - jmpa retdone - -ret2reg: - st.l ($r6), $r0 - sto.l 4($r6), $r1 - -retstruct: -retdone: - /* Return. */ - ldo.l $r6, -4($fp) - ldo.l $r7, -8($fp) - ldo.l $r8, -12($fp) - ret - .size ffi_call_EABI, .-ffi_call_EABI - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffi.c deleted file mode 100644 index 21144e8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffi.c +++ /dev/null @@ -1,285 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2012, 2013, 2018 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; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) argp = ecif->rvalue; - argp += 4; - } - - 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; - } - 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 = FFI_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 $r12. We must save this - pointer in a place that will persist while we do our work. */ - register ffi_closure *creg __asm__ ("$r12"); - 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"); - - /* Pointer to a struct return value. */ - void *struct_rvalue = (void *) arg1; - - /* 6 words reserved for register args + 3 words from jsr */ - char *stack_args = frame_pointer + 9*4; - - /* Lay the register arguments down in a continuous chunk of memory. */ - unsigned register_args[6] = - { arg1, arg2, arg3, arg4, arg5, arg6 }; - char *register_args_ptr = (char *) register_args; - - 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; - - /* preserve struct type return pointer passing */ - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) { - ptr += 4; - register_args_ptr = (char *)®ister_args[1]; - } - - /* 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: - case FFI_TYPE_POINTER: - avalue[i] = ptr; - break; - case FFI_TYPE_STRUCT: - avalue[i] = *(void**)ptr; - break; - default: - /* This is an 8-byte value. */ - if (ptr == (char *) ®ister_args[5]) - { - /* The value is split across two locations */ - unsigned *ip = alloca(8); - avalue[i] = ip; - ip[0] = *(unsigned *) ptr; - ip[1] = *(unsigned *) stack_args; - } - else - { - 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 *) ®ister_args[6]) - ptr = stack_args; - else if (ptr == (char *) ®ister_args[7]) - ptr = stack_args + 4; - } - - /* Invoke the closure. */ - if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - (closure->fun) (cif, struct_rvalue, 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); - asm ("mov $r12, %0\n ld.l $r0, ($r12)\n ldo.l $r1, 4($r12)" : : "r" (&rvalue)); - } -} - -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 short *tramp = (unsigned short *) &closure->tramp[0]; - unsigned long fn = (long) ffi_closure_eabi; - unsigned long cls = (long) codeloc; - - if (cif->abi != FFI_EABI) - return FFI_BAD_ABI; - - fn = (unsigned long) ffi_closure_eabi; - - tramp[0] = 0x01e0; /* ldi.l $r12, .... */ - tramp[1] = cls >> 16; - tramp[2] = cls & 0xffff; - tramp[3] = 0x1a00; /* jmpa .... */ - tramp[4] = fn >> 16; - tramp[5] = fn & 0xffff; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffitarget.h deleted file mode 100644 index 623e3ec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/moxie/ffitarget.h +++ /dev/null @@ -1,52 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012, 2013 Anthony Green - Target configuration macros for Moxie - - 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_DEFAULT_ABI = FFI_EABI, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 - -/* Trampolines are 12-bytes long. See ffi_prep_closure_loc. */ -#define FFI_TRAMPOLINE_SIZE (12) - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffi.c deleted file mode 100644 index 721080d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffi.c +++ /dev/null @@ -1,304 +0,0 @@ -/* libffi support for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - 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 - -/* The Nios II Processor Reference Handbook defines the procedure call - ABI as follows. - - Arguments are passed as if a structure containing the types of - the arguments were constructed. The first 16 bytes are passed in r4 - through r7, the remainder on the stack. The first 16 bytes of a function - taking variable arguments are passed in r4-r7 in the same way. - - Return values of types up to 8 bytes are returned in r2 and r3. For - return values greater than 8 bytes, the caller must allocate memory for - the result and pass the address as if it were argument 0. - - While this isn't specified explicitly in the ABI documentation, GCC - promotes integral arguments smaller than int size to 32 bits. - - Also of note, the ABI specifies that all structure objects are - aligned to 32 bits even if all their fields have a smaller natural - alignment. See FFI_AGGREGATE_ALIGNMENT. */ - - -/* Declare the assembly language hooks. */ - -extern UINT64 ffi_call_sysv (void (*) (char *, extended_cif *), - extended_cif *, - unsigned, - void (*fn) (void)); -extern void ffi_closure_sysv (void); - -/* Perform machine-dependent cif processing. */ - -ffi_status ffi_prep_cif_machdep (ffi_cif *cif) -{ - /* We always want at least 16 bytes in the parameter block since it - simplifies the low-level call function. Also round the parameter - block size up to a multiple of 4 bytes to preserve - 32-bit alignment of the stack pointer. */ - if (cif->bytes < 16) - cif->bytes = 16; - else - cif->bytes = (cif->bytes + 3) & ~3; - - return FFI_OK; -} - - -/* ffi_prep_args is called by the assembly routine to transfer arguments - to the stack using the pointers in the ecif array. - Note that the stack buffer is big enough to fit all the arguments, - but the first 16 bytes will be copied to registers for the actual - call. */ - -void ffi_prep_args (char *stack, extended_cif *ecif) -{ - char *argp = stack; - unsigned int i; - - /* The implicit return value pointer is passed as if it were a hidden - first argument. */ - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT - && ecif->cif->rtype->size > 8) - { - (*(void **) argp) = ecif->rvalue; - argp += 4; - } - - for (i = 0; i < ecif->cif->nargs; i++) - { - void *avalue = ecif->avalue[i]; - ffi_type *atype = ecif->cif->arg_types[i]; - size_t size = atype->size; - size_t alignment = atype->alignment; - - /* Align argp as appropriate for the argument type. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - /* Copy the argument, promoting integral types smaller than a - word to word size. */ - if (size < sizeof (int)) - { - size = sizeof (int); - switch (atype->type) - { - case FFI_TYPE_SINT8: - *(signed int *) argp = (signed int) *(SINT8 *) avalue; - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) argp = (unsigned int) *(UINT8 *) avalue; - break; - - case FFI_TYPE_SINT16: - *(signed int *) argp = (signed int) *(SINT16 *) avalue; - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) argp = (unsigned int) *(UINT16 *) avalue; - break; - - case FFI_TYPE_STRUCT: - memcpy (argp, avalue, atype->size); - break; - - default: - FFI_ASSERT(0); - } - } - else if (size == sizeof (int)) - *(unsigned int *) argp = (unsigned int) *(UINT32 *) avalue; - else - memcpy (argp, avalue, size); - argp += size; - } -} - - -/* Call FN using the prepared CIF. RVALUE points to space allocated by - the caller for the return value, and AVALUE is an array of argument - pointers. */ - -void ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - - extended_cif ecif; - UINT64 result; - - /* If bigret is true, this is the case where a return value of larger - than 8 bytes is handled by being passed by reference as an implicit - argument. */ - int bigret = (cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8); - - ecif.cif = cif; - ecif.avalue = avalue; - - /* Allocate space for return value if this is the pass-by-reference case - and the caller did not provide a buffer. */ - if (rvalue == NULL && bigret) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - result = ffi_call_sysv (ffi_prep_args, &ecif, cif->bytes, fn); - - /* Now result contains the 64 bit contents returned from fn in - r2 and r3. Copy the value of the appropriate size to the user-provided - rvalue buffer. */ - if (rvalue && !bigret) - switch (cif->rtype->size) - { - case 1: - *(UINT8 *)rvalue = (UINT8) result; - break; - case 2: - *(UINT16 *)rvalue = (UINT16) result; - break; - case 4: - *(UINT32 *)rvalue = (UINT32) result; - break; - case 8: - *(UINT64 *)rvalue = (UINT64) result; - break; - default: - memcpy (rvalue, (void *)&result, cif->rtype->size); - break; - } -} - -/* This function is invoked from the closure trampoline to invoke - CLOSURE with argument block ARGS. Parse ARGS according to - CLOSURE->cfi and invoke CLOSURE->fun. */ - -static UINT64 -ffi_closure_helper (unsigned char *args, - ffi_closure *closure) -{ - ffi_cif *cif = closure->cif; - unsigned char *argp = args; - void **parsed_args = alloca (cif->nargs * sizeof (void *)); - UINT64 result; - void *retptr; - unsigned int i; - - /* First figure out what to do about the return type. If this is the - big-structure-return case, the first arg is the hidden return buffer - allocated by the caller. */ - if (cif->rtype->type == FFI_TYPE_STRUCT - && cif->rtype->size > 8) - { - retptr = *((void **) argp); - argp += 4; - } - else - retptr = (void *) &result; - - /* Fill in the array of argument pointers. */ - for (i = 0; i < cif->nargs; i++) - { - size_t size = cif->arg_types[i]->size; - size_t alignment = cif->arg_types[i]->alignment; - - /* Align argp as appropriate for the argument type. */ - if ((alignment - 1) & (unsigned) argp) - argp = (char *) FFI_ALIGN (argp, alignment); - - /* Arguments smaller than an int are promoted to int. */ - if (size < sizeof (int)) - size = sizeof (int); - - /* Store the pointer. */ - parsed_args[i] = argp; - argp += size; - } - - /* Call the user-supplied function. */ - (closure->fun) (cif, retptr, parsed_args, closure->user_data); - return result; -} - - -/* Initialize CLOSURE with a trampoline to call FUN with - CIF and USER_DATA. */ -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]; - int i; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - /* The trampoline looks like: - movhi r8, %hi(ffi_closure_sysv) - ori r8, r8, %lo(ffi_closure_sysv) - movhi r9, %hi(ffi_closure_helper) - ori r0, r9, %lo(ffi_closure_helper) - movhi r10, %hi(closure) - ori r10, r10, %lo(closure) - jmp r8 - and then ffi_closure_sysv retrieves the closure pointer out of r10 - in addition to the arguments passed in the normal way for the call, - and invokes ffi_closure_helper. We encode the pointer to - ffi_closure_helper in the trampoline because making a PIC call - to it in ffi_closure_sysv would be messy (it would have to indirect - through the GOT). */ - -#define HI(x) ((((unsigned int) (x)) >> 16) & 0xffff) -#define LO(x) (((unsigned int) (x)) & 0xffff) - tramp[0] = (0 << 27) | (8 << 22) | (HI (ffi_closure_sysv) << 6) | 0x34; - tramp[1] = (8 << 27) | (8 << 22) | (LO (ffi_closure_sysv) << 6) | 0x14; - tramp[2] = (0 << 27) | (9 << 22) | (HI (ffi_closure_helper) << 6) | 0x34; - tramp[3] = (9 << 27) | (9 << 22) | (LO (ffi_closure_helper) << 6) | 0x14; - tramp[4] = (0 << 27) | (10 << 22) | (HI (closure) << 6) | 0x34; - tramp[5] = (10 << 27) | (10 << 22) | (LO (closure) << 6) | 0x14; - tramp[6] = (8 << 27) | (0x0d << 11) | 0x3a; -#undef HI -#undef LO - - /* Flush the caches. - See Example 9-4 in the Nios II Software Developer's Handbook. */ - for (i = 0; i < 7; i++) - asm volatile ("flushd 0(%0); flushi %0" :: "r"(tramp + i) : "memory"); - asm volatile ("flushp" ::: "memory"); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffitarget.h deleted file mode 100644 index 134d118..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/ffitarget.h +++ /dev/null @@ -1,52 +0,0 @@ -/* libffi target includes for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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 - -/* Structures have a 4-byte alignment even if all the fields have lesser - alignment requirements. */ -#define FFI_AGGREGATE_ALIGNMENT 4 - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 28 /* 7 instructions */ -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/sysv.S deleted file mode 100644 index 75f442b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/nios2/sysv.S +++ /dev/null @@ -1,136 +0,0 @@ -/* Low-level libffi support for Altera Nios II. - - Copyright (c) 2013 Mentor Graphics. - - 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 function is declared on the C side as - - extern UINT64 ffi_call_sysv (void (*arghook) (char *, extended_cif *), - extended_cif *ecif, - unsigned nbytes, - void (*fn) (void)); - - On input, the arguments appear as - r4 = arghook - r5 = ecif - r6 = nbytes - r7 = fn -*/ - - .section .text - .align 2 - .global ffi_call_sysv - .type ffi_call_sysv, @function - -ffi_call_sysv: - .cfi_startproc - - /* Create the stack frame, saving r16 so we can use it locally. */ - addi sp, sp, -12 - .cfi_def_cfa_offset 12 - stw ra, 8(sp) - stw fp, 4(sp) - stw r16, 0(sp) - .cfi_offset 31, -4 - .cfi_offset 28, -8 - .cfi_offset 16, -12 - mov fp, sp - .cfi_def_cfa_register 28 - mov r16, r7 - - /* Adjust the stack pointer to create the argument buffer - nbytes long. */ - sub sp, sp, r6 - - /* Call the arghook function. */ - mov r2, r4 /* fn */ - mov r4, sp /* argbuffer */ - callr r2 /* r5 already contains ecif */ - - /* Pop off the first 16 bytes of the argument buffer on the stack, - transferring the contents to the argument registers. */ - ldw r4, 0(sp) - ldw r5, 4(sp) - ldw r6, 8(sp) - ldw r7, 12(sp) - addi sp, sp, 16 - - /* Call the user function, which leaves its result in r2 and r3. */ - callr r16 - - /* Pop off the stack frame. */ - mov sp, fp - ldw ra, 8(sp) - ldw fp, 4(sp) - ldw r16, 0(sp) - addi sp, sp, 12 - ret - .cfi_endproc - .size ffi_call_sysv, .-ffi_call_sysv - - -/* Closure trampolines jump here after putting the C helper address - in r9 and the closure pointer in r10. The user-supplied arguments - to the closure are in the normal places, in r4-r7 and on the - stack. Push the register arguments on the stack too and then call the - C helper function to deal with them. */ - - .section .text - .align 2 - .global ffi_closure_sysv - .type ffi_closure_sysv, @function - -ffi_closure_sysv: - .cfi_startproc - - /* Create the stack frame, pushing the register args on the stack - just below the stack args. This is the same trick illustrated - in Figure 7-3 in the Nios II Processor Reference Handbook, used - for variable arguments and structures passed by value. */ - addi sp, sp, -20 - .cfi_def_cfa_offset 20 - stw ra, 0(sp) - .cfi_offset 31, -20 - stw r4, 4(sp) - .cfi_offset 4, -16 - stw r5, 8(sp) - .cfi_offset 5, -12 - stw r6, 12(sp) - .cfi_offset 6, -8 - stw r7, 16(sp) - .cfi_offset 7, -4 - - /* Call the helper. - r4 = pointer to arguments on stack - r5 = closure pointer (loaded in r10 by the trampoline) - r9 = address of helper function (loaded by trampoline) */ - addi r4, sp, 4 - mov r5, r10 - callr r9 - - /* Pop the stack and return. */ - ldw ra, 0(sp) - addi sp, sp, 20 - .cfi_def_cfa_offset -20 - ret - .cfi_endproc - .size ffi_closure_sysv, .-ffi_closure_sysv - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffi.c deleted file mode 100644 index 2bad938..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffi.c +++ /dev/null @@ -1,328 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2014 Sebastian Macke - - OpenRISC 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 "ffi_common.h" - -/* 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) -{ - char *stacktemp = stack; - int i, s; - ffi_type **arg; - int count = 0; - int nfixedargs; - - nfixedargs = ecif->cif->nfixedargs; - arg = ecif->cif->arg_types; - void **argv = ecif->avalue; - - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT) - { - *(void **) stack = ecif->rvalue; - stack += 4; - count = 4; - } - for(i=0; icif->nargs; i++) - { - - /* variadic args are saved on stack */ - if ((nfixedargs == 0) && (count < 24)) - { - count = 24; - stack = stacktemp + 24; - } - nfixedargs--; - - s = 4; - switch((*arg)->type) - { - case FFI_TYPE_STRUCT: - *(void **)stack = *argv; - break; - - case FFI_TYPE_SINT8: - *(signed int *) stack = (signed int)*(SINT8 *)(* argv); - break; - - case FFI_TYPE_UINT8: - *(unsigned int *) stack = (unsigned int)*(UINT8 *)(* argv); - break; - - case FFI_TYPE_SINT16: - *(signed int *) stack = (signed int)*(SINT16 *)(* argv); - break; - - case FFI_TYPE_UINT16: - *(unsigned int *) stack = (unsigned int)*(UINT16 *)(* argv); - break; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - case FFI_TYPE_POINTER: - *(int *)stack = *(int*)(*argv); - break; - - default: /* 8 byte types */ - if (count == 20) /* never split arguments */ - { - stack += 4; - count += 4; - } - s = (*arg)->size; - memcpy(stack, *argv, s); - break; - } - - stack += s; - count += s; - argv++; - arg++; - } - return stacktemp + ((count>24)?24:0); -} - -extern void ffi_call_SYSV(unsigned, - extended_cif *, - void *(*)(int *, extended_cif *), - unsigned *, - void (*fn)(void), - unsigned); - - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - int i; - int size; - ffi_type **arg; - - /* Calculate size to allocate on stack */ - - for(i = 0, arg = cif->arg_types, size=0; i < cif->nargs; i++, arg++) - { - if ((*arg)->type == FFI_TYPE_STRUCT) - size += 4; - else - if ((*arg)->size <= 4) - size += 4; - else - size += 8; - } - - /* for variadic functions more space is needed on the stack */ - if (cif->nargs != cif->nfixedargs) - size += 24; - - if (cif->rtype->type == FFI_TYPE_STRUCT) - size += 4; - - - extended_cif ecif; - ecif.cif = cif; - ecif.avalue = avalue; - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_SYSV: - ffi_call_SYSV(size, &ecif, ffi_prep_args, rvalue, fn, cif->flags); - break; - default: - FFI_ASSERT(0); - break; - } -} - - -void ffi_closure_SYSV(unsigned long r3, unsigned long r4, unsigned long r5, - unsigned long r6, unsigned long r7, unsigned long r8) -{ - register int *sp __asm__ ("r17"); - register int *r13 __asm__ ("r13"); - - ffi_closure* closure = (ffi_closure*) r13; - char *stack_args = sp; - - /* Lay the register arguments down in a continuous chunk of memory. */ - unsigned register_args[6] = - { r3, r4, r5, r6, r7, r8 }; - - /* Pointer to a struct return value. */ - void *struct_rvalue = (void *) r3; - - 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 count = 0; - int nfixedargs = cif->nfixedargs; - int i; - - /* preserve struct type return pointer passing */ - - if ((cif->rtype != NULL) && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - ptr += 4; - count = 4; - } - - /* Find the address of each argument. */ - for (i = 0; i < cif->nargs; i++) - { - - /* variadic args are saved on stack */ - if ((nfixedargs == 0) && (count < 24)) - { - ptr = stack_args; - count = 24; - } - nfixedargs--; - - 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: - case FFI_TYPE_POINTER: - avalue[i] = ptr; - break; - - case FFI_TYPE_STRUCT: - avalue[i] = *(void**)ptr; - break; - - default: - /* 8-byte values */ - - /* arguments are never splitted */ - if (ptr == ®ister_args[5]) - ptr = stack_args; - avalue[i] = ptr; - ptr += 4; - count += 4; - break; - } - ptr += 4; - count += 4; - - /* If we've handled more arguments than fit in registers, - start looking at the those passed on the stack. */ - - if (count == 24) - ptr = stack_args; - } - - if (cif->rtype && (cif->rtype->type == FFI_TYPE_STRUCT)) - { - (closure->fun) (cif, struct_rvalue, avalue, closure->user_data); - } else - { - long long rvalue; - (closure->fun) (cif, &rvalue, avalue, closure->user_data); - if (cif->rtype) - asm ("l.ori r12, %0, 0x0\n l.lwz r11, 0(r12)\n l.lwz r12, 4(r12)" : : "r" (&rvalue)); - } -} - - -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 short *tramp = (unsigned short *) closure->tramp; - unsigned long fn = (unsigned long) ffi_closure_SYSV; - unsigned long cls = (unsigned long) codeloc; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - closure->cif = cif; - closure->user_data = user_data; - closure->fun = fun; - - /* write pointers to temporary registers */ - tramp[0] = (0x6 << 10) | (13 << 5); /* l.movhi r13, ... */ - tramp[1] = cls >> 16; - tramp[2] = (0x2a << 10) | (13 << 5) | 13; /* l.ori r13, r13, ... */ - tramp[3] = cls & 0xFFFF; - - tramp[4] = (0x6 << 10) | (15 << 5); /* l.movhi r15, ... */ - tramp[5] = fn >> 16; - tramp[6] = (0x2a << 10) | (15 << 5) | 15; /* l.ori r15, r15 ... */ - tramp[7] = fn & 0xFFFF; - - tramp[8] = (0x11 << 10); /* l.jr r15 */ - tramp[9] = 15 << 11; - - tramp[10] = (0x2a << 10) | (17 << 5) | 1; /* l.ori r17, r1, ... */ - tramp[11] = 0x0; - - return FFI_OK; -} - - -ffi_status ffi_prep_cif_machdep (ffi_cif *cif) -{ - cif->flags = 0; - - /* structures are returned as pointers */ - if (cif->rtype->type == FFI_TYPE_STRUCT) - cif->flags = FFI_TYPE_STRUCT; - else - if (cif->rtype->size > 4) - cif->flags = FFI_TYPE_UINT64; - - cif->nfixedargs = cif->nargs; - - return FFI_OK; -} - - -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, - unsigned int nfixedargs, unsigned int ntotalargs) -{ - ffi_status status; - - status = ffi_prep_cif_machdep (cif); - cif->nfixedargs = nfixedargs; - return status; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffitarget.h deleted file mode 100644 index e55da28..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/ffitarget.h +++ /dev/null @@ -1,58 +0,0 @@ -/* ----------------------------------------------------------------------- - ffitarget.h - Copyright (c) 2014 Sebastian Macke - - OpenRISC Target configuration macros - - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#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 -#define FFI_NATIVE_RAW_API 0 -#define FFI_TRAMPOLINE_SIZE (24) - -#define FFI_TARGET_SPECIFIC_VARIADIC 1 -#define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs; - -#endif - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/sysv.S deleted file mode 100644 index df6570b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/or1k/sysv.S +++ /dev/null @@ -1,107 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2014 Sebastian Macke - - OpenRISC 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 - -.text - .globl ffi_call_SYSV - .type ffi_call_SYSV, @function -/* - r3: size to allocate on stack - r4: extended cif structure - r5: function pointer ffi_prep_args - r6: ret address - r7: function to call - r8: flag for return type -*/ - -ffi_call_SYSV: - /* Store registers used on stack */ - l.sw -4(r1), r9 /* return address */ - l.sw -8(r1), r1 /* stack address */ - l.sw -12(r1), r14 /* callee saved registers */ - l.sw -16(r1), r16 - l.sw -20(r1), r18 - l.sw -24(r1), r20 - - l.ori r14, r1, 0x0 /* save stack pointer */ - l.addi r1, r1, -24 - - l.ori r16, r7, 0x0 /* save function address */ - l.ori r18, r6, 0x0 /* save ret address */ - l.ori r20, r8, 0x0 /* save flag */ - - l.sub r1, r1, r3 /* reserve space on stack */ - - /* Call ffi_prep_args */ - l.ori r3, r1, 0x0 /* first argument stack address, second already ecif */ - l.jalr r5 - l.nop - - /* Load register arguments and call*/ - - l.lwz r3, 0(r1) - l.lwz r4, 4(r1) - l.lwz r5, 8(r1) - l.lwz r6, 12(r1) - l.lwz r7, 16(r1) - l.lwz r8, 20(r1) - l.ori r1, r11, 0x0 /* new stack pointer */ - l.jalr r16 - l.nop - - /* handle return values */ - - l.sfeqi r20, FFI_TYPE_STRUCT - l.bf ret /* structs don't return an rvalue */ - l.nop - - /* copy ret address */ - - l.sfeqi r20, FFI_TYPE_UINT64 - l.bnf four_byte_ret /* 8 byte value is returned */ - l.nop - - l.sw 4(r18), r12 - -four_byte_ret: - l.sw 0(r18), r11 - -ret: - /* return */ - l.ori r1, r14, 0x0 /* reset stack pointer */ - l.lwz r9, -4(r1) - l.lwz r1, -8(r1) - l.lwz r14, -12(r1) - l.lwz r16, -16(r1) - l.lwz r18, -20(r1) - l.lwz r20, -24(r1) - l.jr r9 - l.nop - -.size ffi_call_SYSV, .-ffi_call_SYSV diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffi.c deleted file mode 100644 index 4ce2bc6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffi.c +++ /dev/null @@ -1,719 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/pa/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffitarget.h deleted file mode 100644 index fff4c6b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/ffitarget.h +++ /dev/null @@ -1,85 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#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, - -#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 - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION - -/* ---- 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.25/ext/ffi_c/libffi/src/pa/hpux32.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/hpux32.S deleted file mode 100644 index 40528ba..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/hpux32.S +++ /dev/null @@ -1,368 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/pa/linux.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/linux.S deleted file mode 100644 index f11ae76..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/pa/linux.S +++ /dev/null @@ -1,357 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/powerpc/aix.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/aix.S deleted file mode 100644 index 7ba5415..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/aix.S +++ /dev/null @@ -1,566 +0,0 @@ -/* ----------------------------------------------------------------------- - 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: - .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: - /* 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) -LCFI..0: - mr r28, r1 /* our AP. */ - stdux r1, r1, r4 -LCFI..1: - - /* 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) -LFE..0: -#else /* ! __64BIT__ */ - - .long .ffi_call_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_AIX: - .function .ffi_call_AIX,.ffi_call_AIX,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: - /* 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) -LCFI..0: - mr r28, r1 /* out AP. */ - stwux r1, r1, r4 -LCFI..1: - - /* 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) -LFE..0: -#endif - .ef __LINE__ - .long 0 - .byte 0,0,0,1,128,4,0,0 -/* END(ffi_call_AIX) */ - - /* void ffi_call_go_AIX(extended_cif *ecif, unsigned long bytes, - * unsigned int flags, unsigned int *rvalue, - * void (*fn)(), - * void (*prep_args)(extended_cif*, unsigned *const), - * void *closure); - * r3=ecif, r4=bytes, r5=flags, r6=rvalue, r7=fn, r8=prep_args, r9=closure - */ - -.csect .text[PR] - .align 2 - .globl ffi_call_go_AIX - .globl .ffi_call_go_AIX -.csect ffi_call_go_AIX[DS] -ffi_call_go_AIX: -#ifdef __64BIT__ - .llong .ffi_call_go_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_go_AIX: - .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 -LFB..1: - /* Save registers we use. */ - mflr r0 - - std r28,-32(r1) - std r29,-24(r1) - std r30,-16(r1) - std r31, -8(r1) - - std r9, 8(r1) /* closure, saved in cr field. */ - std r0, 16(r1) -LCFI..2: - mr r28, r1 /* our AP. */ - stdux r1, r1, r4 -LCFI..3: - - /* 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, 8(r28) /* closure */ - /* 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) - - b L1 -LFE..1: -#else /* ! __64BIT__ */ - - .long .ffi_call_go_AIX, TOC[tc0], 0 - .csect .text[PR] -.ffi_call_go_AIX: - .function .ffi_call_go_AIX,.ffi_call_go_AIX,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 - /* Save registers we use. */ -LFB..1: - mflr r0 - - stw r28,-16(r1) - stw r29,-12(r1) - stw r30, -8(r1) - stw r31, -4(r1) - - stw r9, 4(r1) /* closure, saved in cr field. */ - stw r0, 8(r1) -LCFI..2: - mr r28, r1 /* out AP. */ - stwux r1, r1, r4 -LCFI..3: - - /* 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, 4(r28) /* closure */ - /* 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) - - b L1 -LFE..1: -#endif - .ef __LINE__ - .long 0 - .byte 0,0,0,1,128,4,0,0 -/* END(ffi_call_go_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) */ - -/* EH frame stuff. */ - -#define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */ -#ifdef __64BIT__ -#define PTRSIZE 8 -#define LOG2_PTRSIZE 3 -#define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */ -#define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */ -#else -#define PTRSIZE 4 -#define LOG2_PTRSIZE 2 -#define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */ -#define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */ -#endif - .csect _unwind.ro_[RO],4 - .align LOG2_PTRSIZE - .globl _GLOBAL__F_libffi_src_powerpc_aix -_GLOBAL__F_libffi_src_powerpc_aix: -Lframe..1: - .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */ -LSCIE..1: - .vbyte 4,0 /* CIE Identifier Tag */ - .byte 0x3 /* CIE Version */ - .byte "zR" /* CIE Augmentation */ - .byte 0 - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */ - .byte 0x41 /* CIE RA Column */ - .byte 0x1 /* uleb128 0x1; Augmentation size */ - .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */ - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0x1 /* uleb128 0x1; Register r1 */ - .byte 0 /* uleb128 0x0; Offset 0 */ - .align LOG2_PTRSIZE -LECIE..1: -LSFDE..1: - .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */ -LASFDE..1: - .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..0-LFB..0 - .byte 0x11 /* DW_CFA_def_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .byte 0x9f /* DW_CFA_offset Register r31 */ - .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ - .byte 0x9e /* DW_CFA_offset Register r30 */ - .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ - .byte 0x9d /* DW_CFA_offset Register r29 */ - .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ - .byte 0x9c /* DW_CFA_offset Register r28 */ - .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..1-LCFI..0 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x1c /* uleb128 28; Register r28 */ - .align LOG2_PTRSIZE -LEFDE..1: -LSFDE..2: - .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */ -LASFDE..2: - .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..2-LFB..1 - .byte 0x11 /* DW_CFA_def_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .byte 0x9f /* DW_CFA_offset Register r31 */ - .byte 0x1 /* uleb128 0x1; Offset 1 (-4/-8) */ - .byte 0x9e /* DW_CFA_offset Register r30 */ - .byte 0x2 /* uleb128 0x2; Offset 2 (-8/-16) */ - .byte 0x9d /* DW_CFA_offset Register r29 */ - .byte 0x3 /* uleb128 0x3; Offset 3 (-12/-24) */ - .byte 0x9c /* DW_CFA_offset Register r28 */ - .byte 0x4 /* uleb128 0x4; Offset 4 (-16/-32) */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..3-LCFI..2 - .byte 0xd /* DW_CFA_def_cfa_register */ - .byte 0x1c /* uleb128 28; Register r28 */ - .align LOG2_PTRSIZE -LEFDE..2: - .vbyte 4,0 /* End of FDEs */ - - .csect .text[PR] - .ref _GLOBAL__F_libffi_src_powerpc_aix /* Prevents garbage collection by AIX linker */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/aix_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/aix_closure.S deleted file mode 100644 index 132c785..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/aix_closure.S +++ /dev/null @@ -1,694 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 - .extern .ffi_go_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: - .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: -/* 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 */ -LCFI..0: - /* 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 */ -LCFI..1: - - /* 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 - -.Ldoneclosure: - - /* 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 */ - lhz r3, 10(r3) /* load type from return type */ - 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 -LFE..0: - -#else /* ! __64BIT__ */ - - .long .ffi_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_closure_ASM: - .function .ffi_closure_ASM,.ffi_closure_ASM,16,044,LFE..0-LFB..0 - .bf __LINE__ - .line 1 -LFB..0: -/* 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) -LCFI..0: - /* 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 */ -LCFI..1: - - /* 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 - -.Ldoneclosure: - - /* 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 */ - lhz r3, 6(r3) /* load type from return type */ - lwz r4, LC..60(2) /* get address of jump table */ - slwi r3, r3, 4 /* now multiply return type by 16 */ - 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 -LFE..0: -#endif - .ef __LINE__ -/* END(ffi_closure_ASM) */ - - -.csect .text[PR] - .align 2 - .globl ffi_go_closure_ASM - .globl .ffi_go_closure_ASM -.csect ffi_go_closure_ASM[DS] -ffi_go_closure_ASM: -#ifdef __64BIT__ - .llong .ffi_go_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_go_closure_ASM: - .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 -LFB..1: -/* 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 */ -LCFI..2: - /* 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 */ -LCFI..3: - - /* 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 */ - mr r3, r11 /* go closure */ - - /* 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_go_closure_helper_DARWIN - nop - - b .Ldoneclosure -LFE..1: - -#else /* ! __64BIT__ */ - - .long .ffi_go_closure_ASM, TOC[tc0], 0 - .csect .text[PR] -.ffi_go_closure_ASM: - .function .ffi_go_closure_ASM,.ffi_go_closure_ASM,16,044,LFE..1-LFB..1 - .bf __LINE__ - .line 1 -LFB..1: -/* 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) -LCFI..2: - /* 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 */ -LCFI..3: - - /* 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 */ - mr r3, 11 /* go closure */ - - /* 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_go_closure_helper_DARWIN - nop - - b .Ldoneclosure -LFE..1: -#endif - .ef __LINE__ -/* END(ffi_go_closure_ASM) */ - -/* EH frame stuff. */ - -#define LR_REGNO 0x41 /* Link Register (65), see rs6000.md */ -#ifdef __64BIT__ -#define PTRSIZE 8 -#define LOG2_PTRSIZE 3 -#define CFA_OFFSET 0xf0,0x01 /* LEB128 240 */ -#define FDE_ENCODING 0x1c /* DW_EH_PE_pcrel|DW_EH_PE_sdata8 */ -#define EH_DATA_ALIGN_FACT 0x78 /* LEB128 -8 */ -#else -#define PTRSIZE 4 -#define LOG2_PTRSIZE 2 -#define CFA_OFFSET 0xb0,0x01 /* LEB128 176 */ -#define FDE_ENCODING 0x1b /* DW_EH_PE_pcrel|DW_EH_PE_sdata4 */ -#define EH_DATA_ALIGN_FACT 0x7c /* LEB128 -4 */ -#endif - - .csect _unwind.ro_[RO],4 - .align LOG2_PTRSIZE - .globl _GLOBAL__F_libffi_src_powerpc_aix_closure -_GLOBAL__F_libffi_src_powerpc_aix_closure: -Lframe..1: - .vbyte 4,LECIE..1-LSCIE..1 /* CIE Length */ -LSCIE..1: - .vbyte 4,0 /* CIE Identifier Tag */ - .byte 0x3 /* CIE Version */ - .byte "zR" /* CIE Augmentation */ - .byte 0 - .byte 0x1 /* uleb128 0x1; CIE Code Alignment Factor */ - .byte EH_DATA_ALIGN_FACT /* leb128 -4/-8; CIE Data Alignment Factor */ - .byte LR_REGNO /* CIE RA Column */ - .byte 0x1 /* uleb128 0x1; Augmentation size */ - .byte FDE_ENCODING /* FDE Encoding (pcrel|sdata4/8) */ - .byte 0xc /* DW_CFA_def_cfa */ - .byte 0x1 /* uleb128 0x1; Register r1 */ - .byte 0 /* uleb128 0x0; Offset 0 */ - .align LOG2_PTRSIZE -LECIE..1: -LSFDE..1: - .vbyte 4,LEFDE..1-LASFDE..1 /* FDE Length */ -LASFDE..1: - .vbyte 4,LASFDE..1-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..0-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..0-LFB..0 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..1-LCFI..0 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte CFA_OFFSET /* uleb128 176/240 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..0-LFB..0 - .byte 0x11 /* DW_CFA_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .align LOG2_PTRSIZE -LEFDE..1: -LSFDE..2: - .vbyte 4,LEFDE..2-LASFDE..2 /* FDE Length */ -LASFDE..2: - .vbyte 4,LASFDE..2-Lframe..1 /* FDE CIE offset */ - .vbyte PTRSIZE,LFB..1-$ /* FDE initial location */ - .vbyte PTRSIZE,LFE..1-LFB..1 /* FDE address range */ - .byte 0 /* uleb128 0x0; Augmentation size */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..3-LCFI..2 - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte CFA_OFFSET /* uleb128 176/240 */ - .byte 0x4 /* DW_CFA_advance_loc4 */ - .vbyte 4,LCFI..2-LFB..1 - .byte 0x11 /* DW_CFA_offset_extended_sf */ - .byte LR_REGNO /* uleb128 LR_REGNO; Register LR */ - .byte 0x7e /* leb128 -2; Offset -2 (8/16) */ - .align LOG2_PTRSIZE -LEFDE..2: - .vbyte 4,0 /* End of FDEs */ - - .csect .text[PR] - .ref _GLOBAL__F_libffi_src_powerpc_aix_closure /* Prevents garbage collection by AIX linker */ - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/asm.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/asm.h deleted file mode 100644 index 27b22f6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/asm.h +++ /dev/null @@ -1,125 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 EFFI_ALIGN(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 EFFI_ALIGN(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.25/ext/ffi_c/libffi/src/powerpc/darwin.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/darwin.S deleted file mode 100644 index 066eb82..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/darwin.S +++ /dev/null @@ -1,378 +0,0 @@ -/* ----------------------------------------------------------------------- - 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) - - .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 (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 Lstartcode-. ; 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.25/ext/ffi_c/libffi/src/powerpc/darwin_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/darwin_closure.S deleted file mode 100644 index 3121e6a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/darwin_closure.S +++ /dev/null @@ -1,571 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 structure 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 - cmpwi 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) - - .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 (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 Lstartcode-. ; FDE initial location - .set L$set$2,LFE1-Lstartcode - .g_long L$set$2 ; 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,"L1$spb" -"L1$spb": - mflr r11 - addis r11,r11,ha16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb") - mtlr r0 - lwzu r12,lo16(L_ffi_closure_helper_DARWIN$lazy_ptr-"L1$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_ffi_closure_helper_DARWIN$lazy_ptr: - .indirect_symbol _ffi_closure_helper_DARWIN - .g_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,"L2$spb" -"L2$spb": - mflr r11 - addis r11,r11,ha16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$spb") - mtlr r0 - lwzu r12,lo16(L_darwin64_struct_ret_by_value_p$lazy_ptr-"L2$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 - .g_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,"L3$spb" -"L3$spb": - mflr r11 - addis r11,r11,ha16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb") - mtlr r0 - lwzu r12,lo16(L_darwin64_pass_struct_floats$lazy_ptr-"L3$spb")(r11) - mtctr r12 - bctr - .lazy_symbol_pointer -L_darwin64_pass_struct_floats$lazy_ptr: - .indirect_symbol _darwin64_pass_struct_floats - .g_long dyld_stub_binding_helper -# endif -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi.c deleted file mode 100644 index 7eb543e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi.c +++ /dev/null @@ -1,173 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - 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 "ffi.h" -#include "ffi_common.h" -#include "ffi_powerpc.h" - -#if HAVE_LONG_DOUBLE_VARIANT -/* Adjust ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types (ffi_abi abi) -{ -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# ifdef POWERPC64 - ffi_prep_types_linux64 (abi); -# else - ffi_prep_types_sysv (abi); -# endif -# endif -} -#endif - -/* Perform machine dependent cif processing */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep (ffi_cif *cif) -{ -#ifdef POWERPC64 - return ffi_prep_cif_linux64 (cif); -#else - return ffi_prep_cif_sysv (cif); -#endif -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var (ffi_cif *cif, - unsigned int nfixedargs MAYBE_UNUSED, - unsigned int ntotalargs MAYBE_UNUSED) -{ -#ifdef POWERPC64 - return ffi_prep_cif_linux64_var (cif, nfixedargs, ntotalargs); -#else - return ffi_prep_cif_sysv (cif); -#endif -} - -static void -ffi_call_int (ffi_cif *cif, - void (*fn) (void), - void *rvalue, - void **avalue, - void *closure) -{ - /* The final SYSV ABI says that structures smaller or equal 8 bytes - are returned in r3/r4. A draft ABI used by linux instead returns - them in memory. - - We bounce-buffer SYSV small struct return values so that sysv.S - can write r3 and r4 to memory without worrying about struct size. - - For ELFv2 ABI, use a bounce buffer for homogeneous structs too, - for similar reasons. */ - unsigned long smst_buffer[8]; - extended_cif ecif; - - ecif.cif = cif; - ecif.avalue = avalue; - - ecif.rvalue = rvalue; - if ((cif->flags & FLAG_RETURNS_SMST) != 0) - ecif.rvalue = smst_buffer; - /* Ensure that we have a valid struct return value. - FIXME: Isn't this just papering over a user problem? */ - else if (!rvalue && cif->rtype->type == FFI_TYPE_STRUCT) - ecif.rvalue = alloca (cif->rtype->size); - -#ifdef POWERPC64 - ffi_call_LINUX64 (&ecif, fn, ecif.rvalue, cif->flags, closure, - -(long) cif->bytes); -#else - ffi_call_SYSV (&ecif, fn, ecif.rvalue, cif->flags, closure, -cif->bytes); -#endif - - /* Check for a bounce-buffered return value */ - if (rvalue && ecif.rvalue == smst_buffer) - { - unsigned int rsize = cif->rtype->size; -#ifndef __LITTLE_ENDIAN__ - /* The SYSV ABI returns a structure of up to 4 bytes in size - left-padded in r3. */ -# ifndef POWERPC64 - if (rsize <= 4) - memcpy (rvalue, (char *) smst_buffer + 4 - rsize, rsize); - else -# endif - /* The SYSV ABI returns a structure of up to 8 bytes in size - left-padded in r3/r4, and the ELFv2 ABI similarly returns a - structure of up to 8 bytes in size left-padded in r3. */ - if (rsize <= 8) - memcpy (rvalue, (char *) smst_buffer + 8 - rsize, rsize); - else -#endif - memcpy (rvalue, smst_buffer, rsize); - } -} - -void -ffi_call (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, - void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, 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) -{ -#ifdef POWERPC64 - return ffi_prep_closure_loc_linux64 (closure, cif, fun, user_data, codeloc); -#else - return ffi_prep_closure_loc_sysv (closure, cif, fun, user_data, codeloc); -#endif -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *)) -{ -#ifdef POWERPC64 - closure->tramp = ffi_go_closure_linux64; -#else - closure->tramp = ffi_go_closure_sysv; -#endif - closure->cif = cif; - closure->fun = fun; - return FFI_OK; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c deleted file mode 100644 index 61a18c4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_darwin.c +++ /dev/null @@ -1,1440 +0,0 @@ -/* ----------------------------------------------------------------------- - 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); -extern void ffi_go_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 *)FFI_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 = FFI_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 = FFI_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 = FFI_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 = FFI_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 - /* Natural 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 = FFI_ALIGN(s->size, align) + p->size; - } - - s->size = FFI_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 = FFI_ALIGN(s->size, align) + p->size; - } - - s->size = FFI_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 = FFI_ALIGN(intarg_count, 2); -#else - intarg_count = FFI_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 = FFI_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 = FFI_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 = FFI_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 = FFI_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_go_AIX(extended_cif *, long, unsigned, unsigned *, - void (*fn)(void), void (*fn2)(void), void *closure); - -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; - } -} - -void -ffi_call_go (ffi_cif *cif, void (*fn) (void), void *rvalue, void **avalue, - void *closure) -{ - 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_go_AIX(&ecif, -(long)cif->bytes, cif->flags, ecif.rvalue, fn, - FFI_FN(ffi_prep_args), closure); - 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; - break; - - default: - return FFI_BAD_ABI; - break; - } - return FFI_OK; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - switch (cif->abi) - { - case FFI_AIX: - - FFI_ASSERT (cif->abi == FFI_AIX); - - closure->tramp = (void *)ffi_go_closure_ASM; - closure->cif = cif; - closure->fun = fun; - return FFI_OK; - - // For now, ffi_prep_go_closure is only implemented for AIX, not for Darwin - default: - return FFI_BAD_ABI; - 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 *); - -ffi_type * -ffi_go_closure_helper_DARWIN (ffi_go_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. */ - -static ffi_type * -ffi_closure_helper_common (ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, 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_dblfl * end_pfr = pfr + NUM_FPR_ARG_REGISTERS; - unsigned size_al; -#if defined(POWERPC_DARWIN64) - unsigned fpsused = 0; -#endif - - 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 *)FFI_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 = FFI_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++; - } - - (fun) (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_ASM to perform return type promotions. */ - return cif->rtype; -} - -ffi_type * -ffi_closure_helper_DARWIN (ffi_closure *closure, void *rvalue, - unsigned long *pgr, ffi_dblfl *pfr) -{ - return ffi_closure_helper_common (closure->cif, closure->fun, - closure->user_data, rvalue, pgr, pfr); -} - -ffi_type * -ffi_go_closure_helper_DARWIN (ffi_go_closure *closure, void *rvalue, - unsigned long *pgr, ffi_dblfl *pfr) -{ - return ffi_closure_helper_common (closure->cif, closure->fun, - closure, rvalue, pgr, pfr); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c deleted file mode 100644 index 93a31f9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +++ /dev/null @@ -1,974 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_linux64.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - 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 "ffi.h" - -#ifdef POWERPC64 -#include "ffi_common.h" -#include "ffi_powerpc.h" - - -/* About the LINUX64 ABI. */ -enum { - NUM_GPR_ARG_REGISTERS64 = 8, - NUM_FPR_ARG_REGISTERS64 = 13 -}; -enum { ASM_NEEDS_REGISTERS64 = 4 }; - - -#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -/* Adjust size of ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types_linux64 (ffi_abi abi) -{ - if ((abi & (FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128)) == FFI_LINUX) - { - ffi_type_longdouble.size = 8; - ffi_type_longdouble.alignment = 8; - } - else - { - ffi_type_longdouble.size = 16; - ffi_type_longdouble.alignment = 16; - } -} -#endif - - -static unsigned int -discover_homogeneous_aggregate (const ffi_type *t, unsigned int *elnum) -{ - switch (t->type) - { - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - *elnum = 1; - return (int) t->type; - - case FFI_TYPE_STRUCT:; - { - unsigned int base_elt = 0, total_elnum = 0; - ffi_type **el = t->elements; - while (*el) - { - unsigned int el_elt, el_elnum = 0; - el_elt = discover_homogeneous_aggregate (*el, &el_elnum); - if (el_elt == 0 - || (base_elt && base_elt != el_elt)) - return 0; - base_elt = el_elt; - total_elnum += el_elnum; -#if _CALL_ELF == 2 - if (total_elnum > 8) - return 0; -#else - if (total_elnum > 1) - return 0; -#endif - el++; - } - *elnum = total_elnum; - return base_elt; - } - - default: - return 0; - } -} - - -/* Perform machine dependent cif processing */ -static ffi_status -ffi_prep_cif_linux64_core (ffi_cif *cif) -{ - ffi_type **ptr; - unsigned bytes; - unsigned i, fparg_count = 0, intarg_count = 0; - unsigned flags = cif->flags; - unsigned int elt, elnum; - -#if FFI_TYPE_LONGDOUBLE == FFI_TYPE_DOUBLE - /* If compiled without long double support.. */ - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - return FFI_BAD_ABI; -#endif - - /* The machine-independent calculation of cif->bytes doesn't work - for us. Redo the calculation. */ -#if _CALL_ELF == 2 - /* Space for backchain, CR, LR, TOC and the asm's temp regs. */ - bytes = (4 + ASM_NEEDS_REGISTERS64) * sizeof (long); - - /* Space for the general registers. */ - bytes += NUM_GPR_ARG_REGISTERS64 * sizeof (long); -#else - /* 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); -#endif - - /* Return value handling. */ - switch (cif->rtype->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; - break; - - case FFI_TYPE_UINT128: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: -#if _CALL_ELF == 2 - elt = discover_homogeneous_aggregate (cif->rtype, &elnum); - if (elt) - { - if (elt == FFI_TYPE_DOUBLE) - flags |= FLAG_RETURNS_64BITS; - flags |= FLAG_RETURNS_FP | FLAG_RETURNS_SMST; - break; - } - if (cif->rtype->size <= 16) - { - flags |= FLAG_RETURNS_SMST; - break; - } -#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; - } - - for (ptr = cif->arg_types, i = cif->nargs; i > 0; i--, ptr++) - { - unsigned int align; - - switch ((*ptr)->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - fparg_count++; - intarg_count++; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - case FFI_TYPE_FLOAT: - fparg_count++; - intarg_count++; - if (fparg_count > NUM_FPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - - case FFI_TYPE_STRUCT: - if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = (*ptr)->alignment; - if (align > 16) - align = 16; - align = align / 8; - if (align > 1) - intarg_count = FFI_ALIGN (intarg_count, align); - } - intarg_count += ((*ptr)->size + 7) / 8; - elt = discover_homogeneous_aggregate (*ptr, &elnum); - if (elt) - { - fparg_count += elnum; - if (fparg_count > NUM_FPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - } - else - { - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - } - break; - - case FFI_TYPE_POINTER: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - 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: - /* Everything else is passed as a 8-byte word in a GPR, either - the object itself or a pointer to it. */ - intarg_count++; - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - flags |= FLAG_ARG_NEEDS_PSAVE; - break; - default: - FFI_ASSERT (0); - } - } - - if (fparg_count != 0) - flags |= FLAG_FP_ARGUMENTS; - if (intarg_count > 4) - flags |= FLAG_4_GPR_ARGUMENTS; - - /* Space for the FPR registers, if needed. */ - if (fparg_count != 0) - bytes += NUM_FPR_ARG_REGISTERS64 * sizeof (double); - - /* Stack space. */ -#if _CALL_ELF == 2 - if ((flags & FLAG_ARG_NEEDS_PSAVE) != 0) - bytes += intarg_count * sizeof (long); -#else - if (intarg_count > NUM_GPR_ARG_REGISTERS64) - bytes += (intarg_count - NUM_GPR_ARG_REGISTERS64) * sizeof (long); -#endif - - /* The stack space allocated needs to be a multiple of 16 bytes. */ - bytes = (bytes + 15) & ~0xF; - - cif->flags = flags; - cif->bytes = bytes; - - return FFI_OK; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_linux64 (ffi_cif *cif) -{ - if ((cif->abi & FFI_LINUX) != 0) - cif->nfixedargs = cif->nargs; -#if _CALL_ELF != 2 - else if (cif->abi == FFI_COMPAT_LINUX64) - { - /* This call is from old code. Don't touch cif->nfixedargs - since old code will be using a smaller cif. */ - cif->flags |= FLAG_COMPAT; - /* Translate to new abi value. */ - cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; - } -#endif - else - return FFI_BAD_ABI; - return ffi_prep_cif_linux64_core (cif); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_linux64_var (ffi_cif *cif, - unsigned int nfixedargs, - unsigned int ntotalargs MAYBE_UNUSED) -{ - if ((cif->abi & FFI_LINUX) != 0) - cif->nfixedargs = nfixedargs; -#if _CALL_ELF != 2 - else if (cif->abi == FFI_COMPAT_LINUX64) - { - /* This call is from old code. Don't touch cif->nfixedargs - since old code will be using a smaller cif. */ - cif->flags |= FLAG_COMPAT; - /* Translate to new abi value. */ - cif->abi = FFI_LINUX | FFI_LINUX_LONG_DOUBLE_128; - } -#endif - else - return FFI_BAD_ABI; -#if _CALL_ELF == 2 - cif->flags |= FLAG_ARG_NEEDS_PSAVE; -#endif - return ffi_prep_cif_linux64_core (cif); -} - - -/* 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; - size_t p; - } 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; - unsigned int fparg_count; - - unsigned int i, words, nargs, nfixedargs; - 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; - unsigned long align; - - 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; -#if _CALL_ELF == 2 - rest.ul = stack + 4 + NUM_GPR_ARG_REGISTERS64; -#else - rest.ul = stack + 6 + NUM_GPR_ARG_REGISTERS64; -#endif - 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; - nargs = ecif->cif->nargs; -#if _CALL_ELF != 2 - nfixedargs = (unsigned) -1; - if ((flags & FLAG_COMPAT) == 0) -#endif - nfixedargs = ecif->cif->nfixedargs; - for (ptr = ecif->cif->arg_types, i = 0; - i < nargs; - i++, ptr++, p_argv.v++) - { - unsigned int elt, elnum; - - switch ((*ptr)->type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((ecif->cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - double_tmp = (*p_argv.d)[0]; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -# if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -# endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - double_tmp = (*p_argv.d)[1]; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -# if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -# endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (__LDBL_MANT_DIG__ == 106); - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - do_double: - double_tmp = **p_argv.d; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -#if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - *next_arg.d = double_tmp; -#endif - } - else - *next_arg.d = double_tmp; - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_FLOAT: - do_float: - double_tmp = **p_argv.f; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - { - *fpr_base.d++ = double_tmp; -#if _CALL_ELF != 2 - if ((flags & FLAG_COMPAT) != 0) - { -# ifndef __LITTLE_ENDIAN__ - next_arg.f[1] = (float) double_tmp; -# else - next_arg.f[0] = (float) double_tmp; -# endif - } -#endif - } - else - { -# ifndef __LITTLE_ENDIAN__ - next_arg.f[1] = (float) double_tmp; -# else - next_arg.f[0] = (float) double_tmp; -# endif - } - if (++next_arg.ul == gpr_end.ul) - next_arg.ul = rest.ul; - fparg_count++; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_STRUCT: - if ((ecif->cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = (*ptr)->alignment; - if (align > 16) - align = 16; - if (align > 1) - next_arg.p = FFI_ALIGN (next_arg.p, align); - } - elt = discover_homogeneous_aggregate (*ptr, &elnum); - if (elt) - { -#if _CALL_ELF == 2 - union { - void *v; - float *f; - double *d; - } arg; - - arg.v = *p_argv.v; - if (elt == FFI_TYPE_FLOAT) - { - do - { - double_tmp = *arg.f++; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 - && i < nfixedargs) - *fpr_base.d++ = double_tmp; - else - *next_arg.f = (float) double_tmp; - if (++next_arg.f == gpr_end.f) - next_arg.f = rest.f; - fparg_count++; - } - while (--elnum != 0); - if ((next_arg.p & 3) != 0) - { - if (++next_arg.f == gpr_end.f) - next_arg.f = rest.f; - } - } - else - do - { - double_tmp = *arg.d++; - if (fparg_count < NUM_FPR_ARG_REGISTERS64 && i < nfixedargs) - *fpr_base.d++ = double_tmp; - else - *next_arg.d = double_tmp; - if (++next_arg.d == gpr_end.d) - next_arg.d = rest.d; - fparg_count++; - } - while (--elnum != 0); -#else - if (elt == FFI_TYPE_FLOAT) - goto do_float; - else - goto do_double; -#endif - } - else - { - 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; - -#ifndef __LITTLE_ENDIAN__ - /* Structures with size less than eight bytes are passed - left-padded. */ - if ((*ptr)->size < 8) - where += 8 - (*ptr)->size; -#endif - 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)); -} - - -#if _CALL_ELF == 2 -#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_HIDDEN -ffi_prep_closure_loc_linux64 (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ -#if _CALL_ELF == 2 - unsigned int *tramp = (unsigned int *) &closure->tramp[0]; - - if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - tramp[0] = 0xe96c0018; /* 0: ld 11,2f-0b(12) */ - tramp[1] = 0xe98c0010; /* ld 12,1f-0b(12) */ - tramp[2] = 0x7d8903a6; /* mtctr 12 */ - tramp[3] = 0x4e800420; /* bctr */ - /* 1: .quad function_addr */ - /* 2: .quad context */ - *(void **) &tramp[4] = (void *) ffi_closure_LINUX64; - *(void **) &tramp[6] = codeloc; - flush_icache ((char *) tramp, (char *) codeloc, 4 * 4); -#else - void **tramp = (void **) &closure->tramp[0]; - - if (cif->abi < FFI_LINUX || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - /* Copy function address and TOC from ffi_closure_LINUX64 OPD. */ - memcpy (&tramp[0], (void **) ffi_closure_LINUX64, sizeof (void *)); - tramp[1] = codeloc; - memcpy (&tramp[2], (void **) ffi_closure_LINUX64 + 1, sizeof (void *)); -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - - -int FFI_HIDDEN -ffi_closure_helper_LINUX64 (ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - 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; - unsigned long i, avn, nfixedargs; - ffi_dblfl *end_pfr = pfr + NUM_FPR_ARG_REGISTERS64; - unsigned long align; - - 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 - && (cif->flags & FLAG_RETURNS_SMST) == 0) - { - rvalue = (void *) *pst; - pst++; - } - - i = 0; - avn = cif->nargs; -#if _CALL_ELF != 2 - nfixedargs = (unsigned) -1; - if ((cif->flags & FLAG_COMPAT) == 0) -#endif - nfixedargs = cif->nfixedargs; - arg_types = cif->arg_types; - - /* Grab the addresses of the arguments from the stack frame. */ - while (i < avn) - { - unsigned int elt, elnum; - - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 7; - pst++; - break; -#endif - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 6; - pst++; - break; -#endif - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 4; - pst++; - break; -#endif - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - avalue[i] = pst; - pst++; - break; - - case FFI_TYPE_STRUCT: - if ((cif->abi & FFI_LINUX_STRUCT_ALIGN) != 0) - { - align = arg_types[i]->alignment; - if (align > 16) - align = 16; - if (align > 1) - pst = (unsigned long *) FFI_ALIGN ((size_t) pst, align); - } - elt = discover_homogeneous_aggregate (arg_types[i], &elnum); - if (elt) - { -#if _CALL_ELF == 2 - union { - void *v; - unsigned long *ul; - float *f; - double *d; - size_t p; - } to, from; - - /* Repackage the aggregate from its parts. The - aggregate size is not greater than the space taken by - the registers so store back to the register/parameter - save arrays. */ - if (pfr + elnum <= end_pfr) - to.v = pfr; - else - to.v = pst; - - avalue[i] = to.v; - from.ul = pst; - if (elt == FFI_TYPE_FLOAT) - { - do - { - if (pfr < end_pfr && i < nfixedargs) - { - *to.f = (float) pfr->d; - pfr++; - } - else - *to.f = *from.f; - to.f++; - from.f++; - } - while (--elnum != 0); - } - else - { - do - { - if (pfr < end_pfr && i < nfixedargs) - { - *to.d = pfr->d; - pfr++; - } - else - *to.d = *from.d; - to.d++; - from.d++; - } - while (--elnum != 0); - } -#else - if (elt == FFI_TYPE_FLOAT) - goto do_float; - else - goto do_double; -#endif - } - else - { -#ifndef __LITTLE_ENDIAN__ - /* 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 -#endif - avalue[i] = pst; - } - pst += (arg_types[i]->size + 7) / 8; - break; - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if ((cif->abi & FFI_LINUX_LONG_DOUBLE_128) != 0) - { - if (pfr + 1 < end_pfr && i + 1 < nfixedargs) - { - avalue[i] = pfr; - pfr += 2; - } - else - { - if (pfr < end_pfr && i < nfixedargs) - { - /* 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; - } - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - do_double: - /* On the outgoing stack all values are aligned to 8 */ - /* there are 13 64bit floating point registers */ - - if (pfr < end_pfr && i < nfixedargs) - { - avalue[i] = pfr; - pfr++; - } - else - avalue[i] = pst; - pst++; - break; - - case FFI_TYPE_FLOAT: - do_float: - if (pfr < end_pfr && i < nfixedargs) - { - /* Float values are stored as doubles in the - ffi_closure_LINUX64 code. Fix them here. */ - pfr->f = (float) pfr->d; - avalue[i] = pfr; - pfr++; - } - else - { -#ifndef __LITTLE_ENDIAN__ - avalue[i] = (char *) pst + 4; -#else - avalue[i] = pst; -#endif - } - pst++; - break; - - default: - FFI_ASSERT (0); - } - - i++; - } - - (*fun) (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_LINUX64 how to perform return type promotions. */ - if ((cif->flags & FLAG_RETURNS_SMST) != 0) - { - if ((cif->flags & FLAG_RETURNS_FP) == 0) - return FFI_V2_TYPE_SMALL_STRUCT + cif->rtype->size - 1; - else if ((cif->flags & FLAG_RETURNS_64BITS) != 0) - return FFI_V2_TYPE_DOUBLE_HOMOG; - else - return FFI_V2_TYPE_FLOAT_HOMOG; - } - return cif->rtype->type; -} -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h deleted file mode 100644 index 3dcd6b5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_powerpc.h +++ /dev/null @@ -1,94 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_powerpc.h - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - 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. - ----------------------------------------------------------------------- */ - -enum { - /* The assembly depends on these exact flags. */ - /* These go in cr7 */ - FLAG_RETURNS_SMST = 1 << (31-31), /* Used for FFI_SYSV small structs. */ - FLAG_RETURNS_NOTHING = 1 << (31-30), - FLAG_RETURNS_FP = 1 << (31-29), - FLAG_RETURNS_64BITS = 1 << (31-28), - - /* This goes in cr6 */ - FLAG_RETURNS_128BITS = 1 << (31-27), - - FLAG_COMPAT = 1 << (31- 8), /* Not used by assembly */ - - /* These go in cr1 */ - FLAG_ARG_NEEDS_COPY = 1 << (31- 7), /* Used by sysv code */ - FLAG_ARG_NEEDS_PSAVE = FLAG_ARG_NEEDS_COPY, /* Used by linux64 code */ - FLAG_FP_ARGUMENTS = 1 << (31- 6), /* cr1.eq; specified by ABI */ - FLAG_4_GPR_ARGUMENTS = 1 << (31- 5), - FLAG_RETVAL_REFERENCE = 1 << (31- 4) -}; - -typedef union -{ - float f; - double d; -} ffi_dblfl; - -void FFI_HIDDEN ffi_closure_SYSV (void); -void FFI_HIDDEN ffi_go_closure_sysv (void); -void FFI_HIDDEN ffi_call_SYSV(extended_cif *, void (*)(void), void *, - unsigned, void *, int); - -void FFI_HIDDEN ffi_prep_types_sysv (ffi_abi); -ffi_status FFI_HIDDEN ffi_prep_cif_sysv (ffi_cif *); -ffi_status FFI_HIDDEN ffi_prep_closure_loc_sysv (ffi_closure *, - ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *); -int FFI_HIDDEN ffi_closure_helper_SYSV (ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *, unsigned long *, - ffi_dblfl *, unsigned long *); - -void FFI_HIDDEN ffi_call_LINUX64(extended_cif *, void (*) (void), void *, - unsigned long, void *, long); -void FFI_HIDDEN ffi_closure_LINUX64 (void); -void FFI_HIDDEN ffi_go_closure_linux64 (void); - -void FFI_HIDDEN ffi_prep_types_linux64 (ffi_abi); -ffi_status FFI_HIDDEN ffi_prep_cif_linux64 (ffi_cif *); -ffi_status FFI_HIDDEN ffi_prep_cif_linux64_var (ffi_cif *, unsigned int, - unsigned int); -void FFI_HIDDEN ffi_prep_args64 (extended_cif *, unsigned long *const); -ffi_status FFI_HIDDEN ffi_prep_closure_loc_linux64 (ffi_closure *, ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *); -int FFI_HIDDEN ffi_closure_helper_LINUX64 (ffi_cif *, - void (*) (ffi_cif *, void *, - void **, void *), - void *, void *, - unsigned long *, ffi_dblfl *); diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c deleted file mode 100644 index 4078e75..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffi_sysv.c +++ /dev/null @@ -1,923 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi_sysv.c - Copyright (C) 2013 IBM - Copyright (C) 2011 Anthony Green - Copyright (C) 2011 Kyle Moffett - 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 "ffi.h" - -#ifndef POWERPC64 -#include "ffi_common.h" -#include "ffi_powerpc.h" - - -/* About the SYSV ABI. */ -#define ASM_NEEDS_REGISTERS 6 -#define NUM_GPR_ARG_REGISTERS 8 -#define NUM_FPR_ARG_REGISTERS 8 - - -#if HAVE_LONG_DOUBLE_VARIANT && FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -/* Adjust size of ffi_type_longdouble. */ -void FFI_HIDDEN -ffi_prep_types_sysv (ffi_abi abi) -{ - if ((abi & (FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128)) == FFI_SYSV) - { - ffi_type_longdouble.size = 8; - ffi_type_longdouble.alignment = 8; - } - else - { - ffi_type_longdouble.size = 16; - ffi_type_longdouble.alignment = 16; - } -} -#endif - -/* Transform long double, double and float to other types as per abi. */ -static int -translate_float (int abi, int type) -{ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - if (type == FFI_TYPE_LONGDOUBLE - && (abi & FFI_SYSV_LONG_DOUBLE_128) == 0) - type = FFI_TYPE_DOUBLE; -#endif - if ((abi & FFI_SYSV_SOFT_FLOAT) != 0) - { - if (type == FFI_TYPE_FLOAT) - type = FFI_TYPE_UINT32; - else if (type == FFI_TYPE_DOUBLE) - type = FFI_TYPE_UINT64; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - else if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_UINT128; - } - else if ((abi & FFI_SYSV_IBM_LONG_DOUBLE) == 0) - { - if (type == FFI_TYPE_LONGDOUBLE) - type = FFI_TYPE_STRUCT; -#endif - } - return type; -} - -/* Perform machine dependent cif processing */ -static ffi_status -ffi_prep_cif_sysv_core (ffi_cif *cif) -{ - ffi_type **ptr; - unsigned bytes; - unsigned i, fpr_count = 0, gpr_count = 0, stack_count = 0; - unsigned flags = cif->flags; - unsigned struct_copy_size = 0; - unsigned type = cif->rtype->type; - unsigned size = cif->rtype->size; - - /* The machine-independent calculation of cif->bytes doesn't work - for us. Redo the calculation. */ - - /* 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); - - /* 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; - - Larger structures are allocated space and a pointer is passed as - the first argument. - - Single/double FP values are returned in fpr1; - - long doubles (if not equivalent to double) are returned in - fpr1,fpr2 for Linux and as for large structs for SysV. */ - - type = translate_float (cif->abi, type); - - switch (type) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ -#endif - case FFI_TYPE_DOUBLE: - flags |= FLAG_RETURNS_64BITS; - /* Fall through. */ - case FFI_TYPE_FLOAT: - flags |= FLAG_RETURNS_FP; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_UINT128: - flags |= FLAG_RETURNS_128BITS; - /* Fall through. */ - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags |= FLAG_RETURNS_64BITS; - break; - - case FFI_TYPE_STRUCT: - /* The final SYSV ABI says that structures smaller or equal 8 bytes - are returned in r3/r4. A draft ABI used by linux instead - returns them in memory. */ - if ((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) - { - flags |= FLAG_RETURNS_SMST; - break; - } - gpr_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; - } - - /* 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++) - { - unsigned short typenum = (*ptr)->type; - - typenum = translate_float (cif->abi, typenum); - - switch (typenum) - { -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - if (fpr_count >= NUM_FPR_ARG_REGISTERS - 1) - { - fpr_count = NUM_FPR_ARG_REGISTERS; - /* 8-byte align long doubles. */ - stack_count += stack_count & 1; - stack_count += 4; - } - else - fpr_count += 2; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; -#endif - - case FFI_TYPE_DOUBLE: - if (fpr_count >= NUM_FPR_ARG_REGISTERS) - { - /* 8-byte align doubles. */ - stack_count += stack_count & 1; - stack_count += 2; - } - else - fpr_count += 1; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_FLOAT: - if (fpr_count >= NUM_FPR_ARG_REGISTERS) - /* Yes, we don't follow the ABI, but neither does gcc. */ - stack_count += 1; - else - fpr_count += 1; -#ifdef __NO_FPRS__ - return FFI_BAD_ABI; -#endif - break; - - case FFI_TYPE_UINT128: - /* A long double in FFI_LINUX_SOFT_FLOAT can use only a set - of four consecutive gprs. If we do not have enough, we - have to adjust the gpr_count value. */ - if (gpr_count >= NUM_GPR_ARG_REGISTERS - 3) - gpr_count = NUM_GPR_ARG_REGISTERS; - if (gpr_count >= NUM_GPR_ARG_REGISTERS) - stack_count += 4; - else - gpr_count += 4; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - /* '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). */ - gpr_count += gpr_count & 1; - if (gpr_count >= NUM_GPR_ARG_REGISTERS) - { - stack_count += stack_count & 1; - stack_count += 2; - } - else - gpr_count += 2; - break; - - case FFI_TYPE_STRUCT: - /* 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). */ - - 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: - /* Everything else is passed as a 4-byte word in a GPR, either - the object itself or a pointer to it. */ - if (gpr_count >= NUM_GPR_ARG_REGISTERS) - stack_count += 1; - else - gpr_count += 1; - break; - - default: - FFI_ASSERT (0); - } - } - - if (fpr_count != 0) - flags |= FLAG_FP_ARGUMENTS; - if (gpr_count > 4) - flags |= FLAG_4_GPR_ARGUMENTS; - if (struct_copy_size != 0) - flags |= FLAG_ARG_NEEDS_COPY; - - /* Space for the FPR registers, if needed. */ - if (fpr_count != 0) - bytes += NUM_FPR_ARG_REGISTERS * sizeof (double); - - /* Stack space. */ - bytes += stack_count * sizeof (int); - - /* 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; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_sysv (ffi_cif *cif) -{ - if ((cif->abi & FFI_SYSV) == 0) - { - /* This call is from old code. Translate to new ABI values. */ - cif->flags |= FLAG_COMPAT; - switch (cif->abi) - { - default: - return FFI_BAD_ABI; - - case FFI_COMPAT_SYSV: - cif->abi = FFI_SYSV | FFI_SYSV_STRUCT_RET | FFI_SYSV_LONG_DOUBLE_128; - break; - - case FFI_COMPAT_GCC_SYSV: - cif->abi = FFI_SYSV | FFI_SYSV_LONG_DOUBLE_128; - break; - - case FFI_COMPAT_LINUX: - cif->abi = (FFI_SYSV | FFI_SYSV_IBM_LONG_DOUBLE - | FFI_SYSV_LONG_DOUBLE_128); - break; - - case FFI_COMPAT_LINUX_SOFT_FLOAT: - cif->abi = (FFI_SYSV | FFI_SYSV_SOFT_FLOAT | FFI_SYSV_IBM_LONG_DOUBLE - | FFI_SYSV_LONG_DOUBLE_128); - break; - } - } - return ffi_prep_cif_sysv_core (cif); -} - -/* 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_HIDDEN -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; - valp gpr_end; - -#ifndef __NO_FPRS__ - /* 'fpr_base' points at the space for fpr1, and grows upwards as - we use FPR registers. */ - valp fpr_base; - valp fpr_end; -#endif - - /* '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; - ffi_type **ptr; -#ifndef __NO_FPRS__ - double double_tmp; -#endif - 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; - - stacktop.c = (char *) stack + bytes; - gpr_end.u = stacktop.u - ASM_NEEDS_REGISTERS; - gpr_base.u = gpr_end.u - NUM_GPR_ARG_REGISTERS; -#ifndef __NO_FPRS__ - fpr_end.d = gpr_base.d; - fpr_base.d = fpr_end.d - NUM_FPR_ARG_REGISTERS; - copy_space.c = ((flags & FLAG_FP_ARGUMENTS) ? fpr_base.c : gpr_base.c); -#else - copy_space.c = gpr_base.c; -#endif - next_arg.u = stack + 2; - - /* Check that everything starts aligned properly. */ - FFI_ASSERT (((unsigned long) (char *) stack & 0xF) == 0); - FFI_ASSERT (((unsigned long) copy_space.c & 0xF) == 0); - FFI_ASSERT (((unsigned long) 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) (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++) - { - unsigned int typenum = (*ptr)->type; - - typenum = translate_float (ecif->cif->abi, typenum); - - /* Now test the translated value */ - switch (typenum) - { -#ifndef __NO_FPRS__ -# if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - double_tmp = (*p_argv.d)[0]; - - if (fpr_base.d >= fpr_end.d - 1) - { - fpr_base.d = fpr_end.d; - if (((next_arg.u - stack) & 1) != 0) - next_arg.u += 1; - *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; - } - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; -# endif - case FFI_TYPE_DOUBLE: - double_tmp = **p_argv.d; - - if (fpr_base.d >= fpr_end.d) - { - if (((next_arg.u - stack) & 1) != 0) - next_arg.u += 1; - *next_arg.d = double_tmp; - next_arg.u += 2; - } - else - *fpr_base.d++ = double_tmp; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; - - case FFI_TYPE_FLOAT: - double_tmp = **p_argv.f; - if (fpr_base.d >= fpr_end.d) - { - *next_arg.f = (float) double_tmp; - next_arg.u += 1; - } - else - *fpr_base.d++ = double_tmp; - FFI_ASSERT (flags & FLAG_FP_ARGUMENTS); - break; -#endif /* have FPRs */ - - case FFI_TYPE_UINT128: - /* 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 (gpr_base.u >= gpr_end.u - 3) - { - unsigned int ii; - gpr_base.u = gpr_end.u; - for (ii = 0; ii < 4; ii++) - { - unsigned int int_tmp = (*p_argv.ui)[ii]; - *next_arg.u++ = int_tmp; - } - } - else - { - unsigned int ii; - for (ii = 0; ii < 4; ii++) - { - unsigned int int_tmp = (*p_argv.ui)[ii]; - *gpr_base.u++ = int_tmp; - } - } - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (gpr_base.u >= gpr_end.u - 1) - { - gpr_base.u = gpr_end.u; - if (((next_arg.u - stack) & 1) != 0) - next_arg.u++; - *next_arg.ll = **p_argv.ll; - next_arg.u += 2; - } - else - { - /* The abi states only certain register pairs can be - used for passing long long int specifically (r3,r4), - (r5,r6), (r7,r8), (r9,r10). If next arg is long long - but not correct starting register of pair then skip - until the proper starting register. */ - if (((gpr_end.u - gpr_base.u) & 1) != 0) - gpr_base.u++; - *gpr_base.ll++ = **p_argv.ll; - } - break; - - case FFI_TYPE_STRUCT: - 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: - - gprvalue = **p_argv.ui; - - putgpr: - if (gpr_base.u >= gpr_end.u) - *next_arg.u++ = gprvalue; - else - *gpr_base.u++ = gprvalue; - break; - } - } - - /* Check that we didn't overrun the stack... */ - FFI_ASSERT (copy_space.c >= next_arg.c); - FFI_ASSERT (gpr_base.u <= gpr_end.u); -#ifndef __NO_FPRS__ - FFI_ASSERT (fpr_base.u <= fpr_end.u); -#endif - FFI_ASSERT (((flags & FLAG_4_GPR_ARGUMENTS) != 0) - == (gpr_end.u - gpr_base.u < 4)); -} - -#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"); -} - -ffi_status FFI_HIDDEN -ffi_prep_closure_loc_sysv (ffi_closure *closure, - ffi_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - void *codeloc) -{ - unsigned int *tramp; - - if (cif->abi < FFI_SYSV || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - tramp = (unsigned int *) &closure->tramp[0]; - tramp[0] = 0x7c0802a6; /* mflr r0 */ - tramp[1] = 0x429f0005; /* bcl 20,31,.+4 */ - tramp[2] = 0x7d6802a6; /* mflr r11 */ - tramp[3] = 0x7c0803a6; /* mtlr r0 */ - tramp[4] = 0x800b0018; /* lwz r0,24(r11) */ - tramp[5] = 0x816b001c; /* lwz r11,28(r11) */ - tramp[6] = 0x7c0903a6; /* mtctr r0 */ - tramp[7] = 0x4e800420; /* bctr */ - *(void **) &tramp[8] = (void *) ffi_closure_SYSV; /* function */ - *(void **) &tramp[9] = codeloc; /* context */ - - /* Flush the icache. */ - flush_icache ((char *)tramp, (char *)codeloc, 8 * 4); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -/* 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_cif *cif, - void (*fun) (ffi_cif *, void *, void **, void *), - void *user_data, - 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; -#ifndef __NO_FPRS__ - long nf = 0; /* number of floating registers already used */ -#endif - long ng = 0; /* number of general registers already used */ - - unsigned size = cif->rtype->size; - unsigned short rtypenum = cif->rtype->type; - - avalue = alloca (cif->nargs * sizeof (void *)); - - /* First translate for softfloat/nonlinux */ - rtypenum = translate_float (cif->abi, rtypenum); - - /* 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 (rtypenum == FFI_TYPE_STRUCT - && !((cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8)) - { - 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) { - unsigned short typenum = arg_types[i]->type; - - /* We may need to handle some values depending on ABI. */ - typenum = translate_float (cif->abi, typenum); - - switch (typenum) - { -#ifndef __NO_FPRS__ - case FFI_TYPE_FLOAT: - /* Unfortunately float values are stored as doubles - in the ffi_closure_SYSV code (since we don't check - the type in that routine). */ - if (nf < NUM_FPR_ARG_REGISTERS) - { - /* 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... */ - double temp = pfr->d; - pfr->f = (float) temp; - avalue[i] = pfr; - nf++; - pfr++; - } - else - { - avalue[i] = pst; - pst += 1; - } - break; - - case FFI_TYPE_DOUBLE: - if (nf < NUM_FPR_ARG_REGISTERS) - { - 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 (nf < NUM_FPR_ARG_REGISTERS - 1) - { - avalue[i] = pfr; - pfr += 2; - nf += 2; - } - else - { - if (((long) pst) & 4) - pst++; - avalue[i] = pst; - pst += 4; - nf = 8; - } - break; -# endif -#endif - - case FFI_TYPE_UINT128: - /* Test if for the whole long double, 4 gprs are available. - otherwise the stuff ends up on the stack. */ - if (ng < NUM_GPR_ARG_REGISTERS - 3) - { - avalue[i] = pgr; - pgr += 4; - ng += 4; - } - else - { - avalue[i] = pst; - pst += 4; - ng = 8+4; - } - break; - - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: -#ifndef __LITTLE_ENDIAN__ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (char *) pgr + 3; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 3; - pst++; - } - break; -#endif - - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: -#ifndef __LITTLE_ENDIAN__ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (char *) pgr + 2; - ng++; - pgr++; - } - else - { - avalue[i] = (char *) pst + 2; - pst++; - } - break; -#endif - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = pgr; - ng++; - pgr++; - } - else - { - avalue[i] = pst; - pst++; - } - break; - - case FFI_TYPE_STRUCT: - /* Structs are passed by reference. The address will appear in a - gpr if it is one of the first 8 arguments. */ - if (ng < NUM_GPR_ARG_REGISTERS) - { - avalue[i] = (void *) *pgr; - ng++; - pgr++; - } - else - { - avalue[i] = (void *) *pst; - pst++; - } - break; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - /* 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 < NUM_GPR_ARG_REGISTERS - 1) - { - if (ng & 1) - { - /* 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 = NUM_GPR_ARG_REGISTERS; - } - break; - - default: - FFI_ASSERT (0); - } - - i++; - } - - (*fun) (cif, rvalue, avalue, 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 with the size of - the struct less one. We never have a struct with size zero. - See the comment in ffitarget.h about ordering. */ - if (rtypenum == FFI_TYPE_STRUCT - && (cif->abi & FFI_SYSV_STRUCT_RET) != 0 && size <= 8) - return FFI_SYSV_TYPE_SMALL_STRUCT - 1 + size; - return rtypenum; -} -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffitarget.h deleted file mode 100644 index 90aa36b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ffitarget.h +++ /dev/null @@ -1,198 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - Copyright (C) 2007, 2008, 2010 Free Software Foundation, Inc - Copyright (c) 1996-2003 Red Hat, 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- 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, - -#if defined (POWERPC_AIX) - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_AIX, - FFI_LAST_ABI - -#elif defined (POWERPC_DARWIN) - FFI_AIX, - FFI_DARWIN, - FFI_DEFAULT_ABI = FFI_DARWIN, - FFI_LAST_ABI - -#else - /* The FFI_COMPAT values are used by old code. Since libffi may be - a shared library we have to support old values for backwards - compatibility. */ - FFI_COMPAT_SYSV, - FFI_COMPAT_GCC_SYSV, - FFI_COMPAT_LINUX64, - FFI_COMPAT_LINUX, - FFI_COMPAT_LINUX_SOFT_FLOAT, - -# if defined (POWERPC64) - /* This bit, always set in new code, must not be set in any of the - old FFI_COMPAT values that might be used for 64-bit linux. We - only need worry about FFI_COMPAT_LINUX64, but to be safe avoid - all old values. */ - FFI_LINUX = 8, - /* This and following bits can reuse FFI_COMPAT values. */ - FFI_LINUX_STRUCT_ALIGN = 1, - FFI_LINUX_LONG_DOUBLE_128 = 2, - FFI_DEFAULT_ABI = (FFI_LINUX -# ifdef __STRUCT_PARM_ALIGN__ - | FFI_LINUX_STRUCT_ALIGN -# endif -# ifdef __LONG_DOUBLE_128__ - | FFI_LINUX_LONG_DOUBLE_128 -# endif - ), - FFI_LAST_ABI = 12 - -# else - /* This bit, always set in new code, must not be set in any of the - old FFI_COMPAT values that might be used for 32-bit linux/sysv/bsd. */ - FFI_SYSV = 8, - /* This and following bits can reuse FFI_COMPAT values. */ - FFI_SYSV_SOFT_FLOAT = 1, - FFI_SYSV_STRUCT_RET = 2, - FFI_SYSV_IBM_LONG_DOUBLE = 4, - FFI_SYSV_LONG_DOUBLE_128 = 16, - - FFI_DEFAULT_ABI = (FFI_SYSV -# ifdef __NO_FPRS__ - | FFI_SYSV_SOFT_FLOAT -# endif -# if (defined (__SVR4_STRUCT_RETURN) \ - || defined (POWERPC_FREEBSD) && !defined (__AIX_STRUCT_RETURN)) - | FFI_SYSV_STRUCT_RET -# endif -# if __LDBL_MANT_DIG__ == 106 - | FFI_SYSV_IBM_LONG_DOUBLE -# endif -# ifdef __LONG_DOUBLE_128__ - | FFI_SYSV_LONG_DOUBLE_128 -# endif - ), - FFI_LAST_ABI = 32 -# endif -#endif - -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#if defined (POWERPC) || defined (POWERPC_FREEBSD) -# define FFI_GO_CLOSURES 1 -# define FFI_TARGET_SPECIFIC_VARIADIC 1 -# define FFI_EXTRA_CIF_FIELDS unsigned nfixedargs -#endif -#if defined (POWERPC_AIX) -# define FFI_GO_CLOSURES 1 -#endif - -/* ppc_closure.S and linux64_closure.S expect this. */ -#define FFI_PPC_TYPE_LAST FFI_TYPE_POINTER - -/* We define additional types below. If generic types are added that - must be supported by powerpc libffi then it is likely that - FFI_PPC_TYPE_LAST needs increasing *and* the jump tables in - ppc_closure.S and linux64_closure.S be extended. */ - -#if !(FFI_TYPE_LAST == FFI_PPC_TYPE_LAST \ - || (FFI_TYPE_LAST == FFI_TYPE_COMPLEX \ - && !defined FFI_TARGET_HAS_COMPLEX_TYPE)) -# error "You likely have a broken powerpc libffi" -#endif - -/* Needed for soft-float long-double-128 support. */ -#define FFI_TYPE_UINT128 (FFI_PPC_TYPE_LAST + 1) - -/* Needed for FFI_SYSV small structure returns. */ -#define FFI_SYSV_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 2) - -/* Used by ELFv2 for homogenous structure returns. */ -#define FFI_V2_TYPE_FLOAT_HOMOG (FFI_PPC_TYPE_LAST + 1) -#define FFI_V2_TYPE_DOUBLE_HOMOG (FFI_PPC_TYPE_LAST + 2) -#define FFI_V2_TYPE_SMALL_STRUCT (FFI_PPC_TYPE_LAST + 3) - -#if _CALL_ELF == 2 -# define FFI_TRAMPOLINE_SIZE 32 -#else -# 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 -#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.25/ext/ffi_c/libffi/src/powerpc/linux64.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/linux64.S deleted file mode 100644 index b2ae60e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/linux64.S +++ /dev/null @@ -1,228 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 - .globl ffi_call_LINUX64 - .text - .cfi_startproc -# if _CALL_ELF == 2 -ffi_call_LINUX64: - addis %r2, %r12, .TOC.-ffi_call_LINUX64@ha - addi %r2, %r2, .TOC.-ffi_call_LINUX64@l - .localentry ffi_call_LINUX64, . - ffi_call_LINUX64 -# else - .section ".opd","aw" - .align 3 -ffi_call_LINUX64: -# ifdef _CALL_LINUX - .quad .L.ffi_call_LINUX64,.TOC.@tocbase,0 - .type ffi_call_LINUX64,@function - .text -.L.ffi_call_LINUX64: -# else - .hidden .ffi_call_LINUX64 - .globl .ffi_call_LINUX64 - .quad .ffi_call_LINUX64,.TOC.@tocbase,0 - .size ffi_call_LINUX64,24 - .type .ffi_call_LINUX64,@function - .text -.ffi_call_LINUX64: -# endif -# endif - mflr %r0 - std %r28, -32(%r1) - std %r29, -24(%r1) - std %r30, -16(%r1) - std %r31, -8(%r1) - std %r7, 8(%r1) /* closure, saved in cr field. */ - std %r0, 16(%r1) - - mr %r28, %r1 /* our AP. */ - .cfi_def_cfa_register 28 - .cfi_offset 65, 16 - .cfi_offset 31, -8 - .cfi_offset 30, -16 - .cfi_offset 29, -24 - .cfi_offset 28, -32 - - stdux %r1, %r1, %r8 - mr %r31, %r6 /* flags, */ - mr %r30, %r5 /* rvalue, */ - mr %r29, %r4 /* function address. */ -/* Save toc pointer, not for the ffi_prep_args64 call, but for the later - bctrl function call. */ -# if _CALL_ELF == 2 - std %r2, 24(%r1) -# else - std %r2, 40(%r1) -# endif - - /* Call ffi_prep_args64. */ - mr %r4, %r1 -# if defined _CALL_LINUX || _CALL_ELF == 2 - bl ffi_prep_args64 -# else - bl .ffi_prep_args64 -# endif - -# if _CALL_ELF == 2 - mr %r12, %r29 -# else - ld %r12, 0(%r29) - ld %r2, 8(%r29) -# 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 %r12 - /* 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. */ - ld %r11, 8(%r28) - bctrl - - /* This must follow the call immediately, the unwinder - uses this to find out if r2 has been saved or not. */ -# if _CALL_ELF == 2 - ld %r2, 24(%r1) -# else - ld %r2, 40(%r1) -# endif - - /* Now, deal with the return value. */ - mtcrf 0x01, %r31 - bt 31, .Lstruct_return_value - 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 - .cfi_def_cfa_register 1 - ld %r0, 16(%r28) - ld %r28, -32(%r28) - mtlr %r0 - ld %r29, -24(%r1) - ld %r30, -16(%r1) - ld %r31, -8(%r1) - blr - -.Lfp_return_value: - .cfi_def_cfa_register 28 - 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 - -.Lstruct_return_value: - bf 29, .Lsmall_struct - bf 28, .Lfloat_homog_return_value - stfd %f1, 0(%r30) - stfd %f2, 8(%r30) - stfd %f3, 16(%r30) - stfd %f4, 24(%r30) - stfd %f5, 32(%r30) - stfd %f6, 40(%r30) - stfd %f7, 48(%r30) - stfd %f8, 56(%r30) - b .Ldone_return_value - -.Lfloat_homog_return_value: - stfs %f1, 0(%r30) - stfs %f2, 4(%r30) - stfs %f3, 8(%r30) - stfs %f4, 12(%r30) - stfs %f5, 16(%r30) - stfs %f6, 20(%r30) - stfs %f7, 24(%r30) - stfs %f8, 28(%r30) - b .Ldone_return_value - -.Lsmall_struct: - std %r3, 0(%r30) - std %r4, 8(%r30) - b .Ldone_return_value - - .cfi_endproc -# if _CALL_ELF == 2 - .size ffi_call_LINUX64,.-ffi_call_LINUX64 -# else -# ifdef _CALL_LINUX - .size ffi_call_LINUX64,.-.L.ffi_call_LINUX64 -# else - .long 0 - .byte 0,12,0,1,128,4,0,0 - .size .ffi_call_LINUX64,.-.ffi_call_LINUX64 -# endif -# endif - -#endif - -#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 - .section .note.GNU-stack,"",@progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/linux64_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/linux64_closure.S deleted file mode 100644 index 6487d2a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/linux64_closure.S +++ /dev/null @@ -1,488 +0,0 @@ -/* ----------------------------------------------------------------------- - 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) - .globl ffi_closure_LINUX64 - .text - .cfi_startproc -# if _CALL_ELF == 2 -ffi_closure_LINUX64: - addis %r2, %r12, .TOC.-ffi_closure_LINUX64@ha - addi %r2, %r2, .TOC.-ffi_closure_LINUX64@l - .localentry ffi_closure_LINUX64, . - ffi_closure_LINUX64 -# else - .section ".opd","aw" - .align 3 -ffi_closure_LINUX64: -# ifdef _CALL_LINUX - .quad .L.ffi_closure_LINUX64,.TOC.@tocbase,0 - .type ffi_closure_LINUX64,@function - .text -.L.ffi_closure_LINUX64: -# else - FFI_HIDDEN (.ffi_closure_LINUX64) - .globl .ffi_closure_LINUX64 - .quad .ffi_closure_LINUX64,.TOC.@tocbase,0 - .size ffi_closure_LINUX64,24 - .type .ffi_closure_LINUX64,@function - .text -.ffi_closure_LINUX64: -# endif -# endif - -# if _CALL_ELF == 2 -# 32 byte special reg save area + 64 byte parm save area -# + 64 byte retval area + 13*8 fpr save area + round to 16 -# define STACKFRAME 272 -# define PARMSAVE 32 -# define RETVAL PARMSAVE+64 -# else -# 48 bytes special reg save area + 64 bytes parm save area -# + 16 bytes retval area + 13*8 bytes fpr save area + round to 16 -# define STACKFRAME 240 -# define PARMSAVE 48 -# define RETVAL PARMSAVE+64 -# endif - -# if _CALL_ELF == 2 - ld %r12, FFI_TRAMPOLINE_SIZE(%r11) # closure->cif - mflr %r0 - lwz %r12, 28(%r12) # cif->flags - mtcrf 0x40, %r12 - addi %r12, %r1, PARMSAVE - bt 7, 0f - # Our caller has not allocated a parameter save area. - # We need to allocate one here and use it to pass gprs to - # ffi_closure_helper_LINUX64. - addi %r12, %r1, -STACKFRAME+PARMSAVE -0: - # Save general regs into parm save area - std %r3, 0(%r12) - std %r4, 8(%r12) - std %r5, 16(%r12) - std %r6, 24(%r12) - std %r7, 32(%r12) - std %r8, 40(%r12) - std %r9, 48(%r12) - std %r10, 56(%r12) - - # load up the pointer to the parm save area - mr %r7, %r12 -# else - # copy r2 to r11 and load TOC into r2 - mr %r11, %r2 - ld %r2, 16(%r2) - - mflr %r0 - # Save general regs into parm save area - # This is the parameter save area set up by our caller. - std %r3, PARMSAVE+0(%r1) - std %r4, PARMSAVE+8(%r1) - std %r5, PARMSAVE+16(%r1) - std %r6, PARMSAVE+24(%r1) - std %r7, PARMSAVE+32(%r1) - std %r8, PARMSAVE+40(%r1) - std %r9, PARMSAVE+48(%r1) - std %r10, PARMSAVE+56(%r1) - - # load up the pointer to the parm save area - addi %r7, %r1, PARMSAVE -# endif - std %r0, 16(%r1) - - # closure->cif - ld %r3, FFI_TRAMPOLINE_SIZE(%r11) - # closure->fun - ld %r4, FFI_TRAMPOLINE_SIZE+8(%r11) - # closure->user_data - ld %r5, FFI_TRAMPOLINE_SIZE+16(%r11) - -.Ldoclosure: - # next save fpr 1 to fpr 13 - stfd %f1, -104+(0*8)(%r1) - stfd %f2, -104+(1*8)(%r1) - stfd %f3, -104+(2*8)(%r1) - stfd %f4, -104+(3*8)(%r1) - stfd %f5, -104+(4*8)(%r1) - stfd %f6, -104+(5*8)(%r1) - stfd %f7, -104+(6*8)(%r1) - stfd %f8, -104+(7*8)(%r1) - stfd %f9, -104+(8*8)(%r1) - stfd %f10, -104+(9*8)(%r1) - stfd %f11, -104+(10*8)(%r1) - stfd %f12, -104+(11*8)(%r1) - stfd %f13, -104+(12*8)(%r1) - - # load up the pointer to the saved fpr registers */ - addi %r8, %r1, -104 - - # load up the pointer to the result storage - addi %r6, %r1, -STACKFRAME+RETVAL - - stdu %r1, -STACKFRAME(%r1) - .cfi_def_cfa_offset STACKFRAME - .cfi_offset 65, 16 - - # make the call -# if defined _CALL_LINUX || _CALL_ELF == 2 - bl ffi_closure_helper_LINUX64 -# else - bl .ffi_closure_helper_LINUX64 -# endif -.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 - ld %r0, STACKFRAME+16(%r1) - cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT - bge .Lsmall - mflr %r4 # move address of .Lret to r4 - sldi %r3, %r3, 4 # now multiply return type by 16 - addi %r4, %r4, .Lret_type0 - .Lret - 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, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME - nop -# case FFI_TYPE_INT -# ifdef __LITTLE_ENDIAN__ - lwa %r3, RETVAL+0(%r1) -# else - lwa %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_FLOAT - lfs %f1, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_DOUBLE - lfd %f1, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_LONGDOUBLE - lfd %f1, RETVAL+0(%r1) - mtlr %r0 - lfd %f2, RETVAL+8(%r1) - b .Lfinish -# case FFI_TYPE_UINT8 -# ifdef __LITTLE_ENDIAN__ - lbz %r3, RETVAL+0(%r1) -# else - lbz %r3, RETVAL+7(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT8 -# ifdef __LITTLE_ENDIAN__ - lbz %r3, RETVAL+0(%r1) -# else - lbz %r3, RETVAL+7(%r1) -# endif - extsb %r3,%r3 - mtlr %r0 - b .Lfinish -# case FFI_TYPE_UINT16 -# ifdef __LITTLE_ENDIAN__ - lhz %r3, RETVAL+0(%r1) -# else - lhz %r3, RETVAL+6(%r1) -# endif - mtlr %r0 -.Lfinish: - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT16 -# ifdef __LITTLE_ENDIAN__ - lha %r3, RETVAL+0(%r1) -# else - lha %r3, RETVAL+6(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_UINT32 -# ifdef __LITTLE_ENDIAN__ - lwz %r3, RETVAL+0(%r1) -# else - lwz %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT32 -# ifdef __LITTLE_ENDIAN__ - lwa %r3, RETVAL+0(%r1) -# else - lwa %r3, RETVAL+4(%r1) -# endif - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_UINT64 - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_SINT64 - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_TYPE_STRUCT - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME - nop -# case FFI_TYPE_POINTER - ld %r3, RETVAL+0(%r1) - mtlr %r0 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -# case FFI_V2_TYPE_FLOAT_HOMOG - lfs %f1, RETVAL+0(%r1) - lfs %f2, RETVAL+4(%r1) - lfs %f3, RETVAL+8(%r1) - b .Lmorefloat -# case FFI_V2_TYPE_DOUBLE_HOMOG - lfd %f1, RETVAL+0(%r1) - lfd %f2, RETVAL+8(%r1) - lfd %f3, RETVAL+16(%r1) - lfd %f4, RETVAL+24(%r1) - mtlr %r0 - lfd %f5, RETVAL+32(%r1) - lfd %f6, RETVAL+40(%r1) - lfd %f7, RETVAL+48(%r1) - lfd %f8, RETVAL+56(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -.Lmorefloat: - lfs %f4, RETVAL+12(%r1) - mtlr %r0 - lfs %f5, RETVAL+16(%r1) - lfs %f6, RETVAL+20(%r1) - lfs %f7, RETVAL+24(%r1) - lfs %f8, RETVAL+28(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -.Lsmall: -# ifdef __LITTLE_ENDIAN__ - ld %r3,RETVAL+0(%r1) - mtlr %r0 - ld %r4,RETVAL+8(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr -# else - # A struct smaller than a dword is returned in the low bits of r3 - # ie. right justified. Larger structs are passed left justified - # in r3 and r4. The return value area on the stack will have - # the structs as they are usually stored in memory. - cmpldi %r3, FFI_V2_TYPE_SMALL_STRUCT + 7 # size 8 bytes? - neg %r5, %r3 - ld %r3,RETVAL+0(%r1) - blt .Lsmalldown - mtlr %r0 - ld %r4,RETVAL+8(%r1) - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset STACKFRAME -.Lsmalldown: - addi %r5, %r5, FFI_V2_TYPE_SMALL_STRUCT + 7 - mtlr %r0 - sldi %r5, %r5, 3 - addi %r1, %r1, STACKFRAME - .cfi_def_cfa_offset 0 - srd %r3, %r3, %r5 - blr -# endif - - .cfi_endproc -# if _CALL_ELF == 2 - .size ffi_closure_LINUX64,.-ffi_closure_LINUX64 -# else -# ifdef _CALL_LINUX - .size ffi_closure_LINUX64,.-.L.ffi_closure_LINUX64 -# else - .long 0 - .byte 0,12,0,1,128,0,0,0 - .size .ffi_closure_LINUX64,.-.ffi_closure_LINUX64 -# endif -# endif - - - FFI_HIDDEN (ffi_go_closure_linux64) - .globl ffi_go_closure_linux64 - .text - .cfi_startproc -# if _CALL_ELF == 2 -ffi_go_closure_linux64: - addis %r2, %r12, .TOC.-ffi_go_closure_linux64@ha - addi %r2, %r2, .TOC.-ffi_go_closure_linux64@l - .localentry ffi_go_closure_linux64, . - ffi_go_closure_linux64 -# else - .section ".opd","aw" - .align 3 -ffi_go_closure_linux64: -# ifdef _CALL_LINUX - .quad .L.ffi_go_closure_linux64,.TOC.@tocbase,0 - .type ffi_go_closure_linux64,@function - .text -.L.ffi_go_closure_linux64: -# else - FFI_HIDDEN (.ffi_go_closure_linux64) - .globl .ffi_go_closure_linux64 - .quad .ffi_go_closure_linux64,.TOC.@tocbase,0 - .size ffi_go_closure_linux64,24 - .type .ffi_go_closure_linux64,@function - .text -.ffi_go_closure_linux64: -# endif -# endif - -# if _CALL_ELF == 2 - ld %r12, 8(%r11) # closure->cif - mflr %r0 - lwz %r12, 28(%r12) # cif->flags - mtcrf 0x40, %r12 - addi %r12, %r1, PARMSAVE - bt 7, 0f - # Our caller has not allocated a parameter save area. - # We need to allocate one here and use it to pass gprs to - # ffi_closure_helper_LINUX64. - addi %r12, %r1, -STACKFRAME+PARMSAVE -0: - # Save general regs into parm save area - std %r3, 0(%r12) - std %r4, 8(%r12) - std %r5, 16(%r12) - std %r6, 24(%r12) - std %r7, 32(%r12) - std %r8, 40(%r12) - std %r9, 48(%r12) - std %r10, 56(%r12) - - # load up the pointer to the parm save area - mr %r7, %r12 -# else - mflr %r0 - # Save general regs into parm save area - # This is the parameter save area set up by our caller. - std %r3, PARMSAVE+0(%r1) - std %r4, PARMSAVE+8(%r1) - std %r5, PARMSAVE+16(%r1) - std %r6, PARMSAVE+24(%r1) - std %r7, PARMSAVE+32(%r1) - std %r8, PARMSAVE+40(%r1) - std %r9, PARMSAVE+48(%r1) - std %r10, PARMSAVE+56(%r1) - - # load up the pointer to the parm save area - addi %r7, %r1, PARMSAVE -# endif - std %r0, 16(%r1) - - # closure->cif - ld %r3, 8(%r11) - # closure->fun - ld %r4, 16(%r11) - # user_data - mr %r5, %r11 - b .Ldoclosure - - .cfi_endproc -# if _CALL_ELF == 2 - .size ffi_go_closure_linux64,.-ffi_go_closure_linux64 -# else -# ifdef _CALL_LINUX - .size ffi_go_closure_linux64,.-.L.ffi_go_closure_linux64 -# else - .long 0 - .byte 0,12,0,1,128,0,0,0 - .size .ffi_go_closure_linux64,.-.ffi_go_closure_linux64 -# endif -# endif -#endif - -#if (defined __ELF__ && defined __linux__) || _CALL_ELF == 2 - .section .note.GNU-stack,"",@progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ppc_closure.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ppc_closure.S deleted file mode 100644 index b6d209d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/ppc_closure.S +++ /dev/null @@ -1,397 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 - -FFI_HIDDEN(ffi_closure_SYSV) -ENTRY(ffi_closure_SYSV) - .cfi_startproc - stwu %r1,-144(%r1) - .cfi_def_cfa_offset 144 - mflr %r0 - stw %r0,148(%r1) - .cfi_offset 65, 4 - -# 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) - - # set up registers for the routine that does the work - - # closure->cif - lwz %r3,FFI_TRAMPOLINE_SIZE(%r11) - # closure->fun - lwz %r4,FFI_TRAMPOLINE_SIZE+4(%r11) - # closure->user_data - lwz %r5,FFI_TRAMPOLINE_SIZE+8(%r11) - -.Ldoclosure: - 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 - - # pointer to the result storage - addi %r6,%r1,112 - - # pointer to the saved gpr registers - addi %r7,%r1,16 - - # pointer to the saved fpr registers - addi %r8,%r1,48 - - # pointer to the outgoing parameter save area in the previous frame - # i.e. the previous frame pointer + 8 - addi %r9,%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 - -# 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 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - nop - -# case FFI_TYPE_INT - lwz %r3,112+0(%r1) - mtlr %r0 -.Lfinish: - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_FLOAT -#ifndef __NO_FPRS__ - lfs %f1,112+0(%r1) -#else - nop -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_DOUBLE -#ifndef __NO_FPRS__ - lfd %f1,112+0(%r1) -#else - nop -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_LONGDOUBLE -#ifndef __NO_FPRS__ - lfd %f1,112+0(%r1) - lfd %f2,112+8(%r1) - mtlr %r0 - b .Lfinish -#else - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - nop -#endif - -# case FFI_TYPE_UINT8 -#ifdef __LITTLE_ENDIAN__ - lbz %r3,112+0(%r1) -#else - lbz %r3,112+3(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_SINT8 -#ifdef __LITTLE_ENDIAN__ - lbz %r3,112+0(%r1) -#else - lbz %r3,112+3(%r1) -#endif - extsb %r3,%r3 - mtlr %r0 - b .Lfinish - -# case FFI_TYPE_UINT16 -#ifdef __LITTLE_ENDIAN__ - lhz %r3,112+0(%r1) -#else - lhz %r3,112+2(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_SINT16 -#ifdef __LITTLE_ENDIAN__ - lha %r3,112+0(%r1) -#else - lha %r3,112+2(%r1) -#endif - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_UINT32 - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_SINT32 - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# 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 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - nop - -# case FFI_TYPE_POINTER - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_TYPE_UINT128 - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - lwz %r5,112+8(%r1) - b .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 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 2. Two byte struct. - lhz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 3. Three byte struct. - lwz %r3,112+0(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 -#else - srwi %r3,%r3,8 - mtlr %r0 - b .Lfinish -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 4. Four byte struct. - lwz %r3,112+0(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 5. Five byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,24 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 6. Six byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,16 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 7. Seven byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) -#ifdef __LITTLE_ENDIAN__ - mtlr %r0 - b .Lfinish -#else - li %r5,8 - b .Lstruct567 -#endif - -# case FFI_SYSV_TYPE_SMALL_STRUCT + 8. Eight byte struct. - lwz %r3,112+0(%r1) - lwz %r4,112+4(%r1) - mtlr %r0 - b .Lfinish - -#ifndef __LITTLE_ENDIAN__ -.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 - .cfi_def_cfa_offset 0 - blr - .cfi_def_cfa_offset 144 -#endif - -.Luint128: - lwz %r6,112+12(%r1) - mtlr %r0 - addi %r1,%r1,144 - .cfi_def_cfa_offset 0 - blr - .cfi_endproc -END(ffi_closure_SYSV) - - -FFI_HIDDEN(ffi_go_closure_sysv) -ENTRY(ffi_go_closure_sysv) - .cfi_startproc - stwu %r1,-144(%r1) - .cfi_def_cfa_offset 144 - mflr %r0 - stw %r0,148(%r1) - .cfi_offset 65, 4 - - stw %r3, 16(%r1) - stw %r4, 20(%r1) - stw %r5, 24(%r1) - - # closure->cif - lwz %r3,4(%r11) - # closure->fun - lwz %r4,8(%r11) - # user_data - mr %r5,%r11 - b .Ldoclosure - .cfi_endproc -END(ffi_go_closure_sysv) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/sysv.S deleted file mode 100644 index 1474ce7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/powerpc/sysv.S +++ /dev/null @@ -1,175 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 -FFI_HIDDEN(ffi_call_SYSV) -ENTRY(ffi_call_SYSV) - .cfi_startproc - /* Save the old stack pointer as AP. */ - mr %r10,%r1 - .cfi_def_cfa_register 10 - - /* Allocate the stack space we need. */ - stwux %r1,%r1,%r8 - /* Save registers we use. */ - mflr %r9 - stw %r28,-16(%r10) - stw %r29,-12(%r10) - stw %r30, -8(%r10) - stw %r31, -4(%r10) - stw %r9, 4(%r10) - .cfi_offset 65, 4 - .cfi_offset 31, -4 - .cfi_offset 30, -8 - .cfi_offset 29, -12 - .cfi_offset 28, -16 - - /* Save arguments over call... */ - stw %r7, -20(%r10) /* closure, */ - mr %r31,%r6 /* flags, */ - mr %r30,%r5 /* rvalue, */ - mr %r29,%r4 /* function address, */ - mr %r28,%r10 /* our AP. */ - .cfi_def_cfa_register 28 - - /* 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,-24-(8*4)(%r28) - lwz %r4,-24-(7*4)(%r28) - lwz %r5,-24-(6*4)(%r28) - lwz %r6,-24-(5*4)(%r28) - bf- 5,1f - nop - lwz %r7,-24-(4*4)(%r28) - lwz %r8,-24-(3*4)(%r28) - lwz %r9,-24-(2*4)(%r28) - lwz %r10,-24-(1*4)(%r28) - nop -1: - -#ifndef __NO_FPRS__ - /* Load all the FP registers. */ - bf- 6,2f - lfd %f1,-24-(8*4)-(8*8)(%r28) - lfd %f2,-24-(8*4)-(7*8)(%r28) - lfd %f3,-24-(8*4)-(6*8)(%r28) - lfd %f4,-24-(8*4)-(5*8)(%r28) - nop - lfd %f5,-24-(8*4)-(4*8)(%r28) - lfd %f6,-24-(8*4)-(3*8)(%r28) - lfd %f7,-24-(8*4)-(2*8)(%r28) - lfd %f8,-24-(8*4)-(1*8)(%r28) -#endif -2: - - /* Make the call. */ - lwz %r11, -20(%r28) - bctrl - - /* Now, deal with the return value. */ - mtcrf 0x01,%r31 /* cr7 */ - bt- 31,L(small_struct_return_value) - bt- 30,L(done_return_value) -#ifndef __NO_FPRS__ - bt- 29,L(fp_return_value) -#endif - 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) - .cfi_remember_state - /* At this point we don't have a cfa register. Say all our - saved regs have been restored. */ - .cfi_same_value 65 - .cfi_same_value 31 - .cfi_same_value 30 - .cfi_same_value 29 - .cfi_same_value 28 - /* Hopefully this works.. */ - .cfi_def_cfa_register 1 - .cfi_offset 1, 0 - lwz %r1,0(%r1) - .cfi_same_value 1 - blr - -#ifndef __NO_FPRS__ -L(fp_return_value): - .cfi_restore_state - 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) -#endif - -L(small_struct_return_value): - /* - * The C code always allocates a properly-aligned 8-byte bounce - * buffer to make this assembly code very simple. Just write out - * r3 and r4 to the buffer to allow the C code to handle the rest. - */ - stw %r3, 0(%r30) - stw %r4, 4(%r30) - b L(done_return_value) - .cfi_endproc - -END(ffi_call_SYSV) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c deleted file mode 100644 index fe05453..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/prep_cif.c +++ /dev/null @@ -1,261 +0,0 @@ -/* ----------------------------------------------------------------------- - prep_cif.c - Copyright (c) 2011, 2012 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) FFI_ALIGN(x, FFI_SIZEOF_ARG) - -/* Perform machine independent initialization of aggregate type - specifications. */ - -static ffi_status initialize_aggregate(ffi_type *arg, size_t *offsets) -{ - 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), NULL) != FFI_OK))) - return FFI_BAD_TYPEDEF; - - /* Perform a sanity check on the argument type */ - FFI_ASSERT_VALID_TYPE(*ptr); - - arg->size = FFI_ALIGN(arg->size, (*ptr)->alignment); - if (offsets) - *offsets++ = arg->size; - 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 = FFI_ALIGN (arg->size, arg->alignment); - - /* On some targets, the ABI defines that structures have an additional - alignment beyond the "natural" one based on their elements. */ -#ifdef FFI_AGGREGATE_ALIGNMENT - if (FFI_AGGREGATE_ALIGNMENT > arg->alignment) - arg->alignment = FFI_AGGREGATE_ALIGNMENT; -#endif - - 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. */ - -/* For non variadic functions isvariadic should be 0 and - nfixedargs==ntotalargs. - - For variadic calls, isvariadic should be 1 and nfixedargs - and ntotalargs set as appropriate. nfixedargs must always be >=1 */ - - -ffi_status FFI_HIDDEN ffi_prep_cif_core(ffi_cif *cif, ffi_abi abi, - unsigned int isvariadic, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, ffi_type **atypes) -{ - unsigned bytes = 0; - unsigned int i; - ffi_type **ptr; - - FFI_ASSERT(cif != NULL); - FFI_ASSERT((!isvariadic) || (nfixedargs >= 1)); - FFI_ASSERT(nfixedargs <= ntotalargs); - - if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) - return FFI_BAD_ABI; - - cif->abi = abi; - cif->arg_types = atypes; - cif->nargs = ntotalargs; - cif->rtype = rtype; - - cif->flags = 0; - -#if HAVE_LONG_DOUBLE_VARIANT - ffi_prep_types (abi); -#endif - - /* Initialize the return type if necessary */ - if ((cif->rtype->size == 0) - && (initialize_aggregate(cif->rtype, NULL) != FFI_OK)) - return FFI_BAD_TYPEDEF; - -#ifndef FFI_TARGET_HAS_COMPLEX_TYPE - if (rtype->type == FFI_TYPE_COMPLEX) - abort(); -#endif - /* 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 FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION - /* Make space for the return structure pointer */ - if (cif->rtype->type == FFI_TYPE_STRUCT -#ifdef TILE - && (cif->rtype->size > 10 * FFI_SIZEOF_ARG) -#endif -#ifdef XTENSA - && (cif->rtype->size > 16) -#endif -#ifdef NIOS2 - && (cif->rtype->size > 8) -#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), NULL) != FFI_OK)) - return FFI_BAD_TYPEDEF; - -#ifndef FFI_TARGET_HAS_COMPLEX_TYPE - if ((*ptr)->type == FFI_TYPE_COMPLEX) - abort(); -#endif - /* Perform a sanity check on the argument type, do this - check after the initialization. */ - FFI_ASSERT_VALID_TYPE(*ptr); - -#if !defined FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION - { - /* Add any padding if necessary */ - if (((*ptr)->alignment - 1) & bytes) - bytes = (unsigned)FFI_ALIGN(bytes, (*ptr)->alignment); - -#ifdef TILE - if (bytes < 10 * FFI_SIZEOF_ARG && - bytes + STACK_ARG_SIZE((*ptr)->size) > 10 * FFI_SIZEOF_ARG) - { - /* An argument is never split between the 10 parameter - registers and the stack. */ - bytes = 10 * FFI_SIZEOF_ARG; - } -#endif -#ifdef XTENSA - if (bytes <= 6*4 && bytes + STACK_ARG_SIZE((*ptr)->size) > 6*4) - bytes = 6*4; -#endif - - bytes += STACK_ARG_SIZE((*ptr)->size); - } -#endif - } - - cif->bytes = bytes; - - /* Perform machine dependent cif processing */ -#ifdef FFI_TARGET_SPECIFIC_VARIADIC - if (isvariadic) - return ffi_prep_cif_machdep_var(cif, nfixedargs, ntotalargs); -#endif - - return ffi_prep_cif_machdep(cif); -} -#endif /* not __CRIS__ */ - -ffi_status ffi_prep_cif(ffi_cif *cif, ffi_abi abi, unsigned int nargs, - ffi_type *rtype, ffi_type **atypes) -{ - return ffi_prep_cif_core(cif, abi, 0, nargs, nargs, rtype, atypes); -} - -ffi_status ffi_prep_cif_var(ffi_cif *cif, - ffi_abi abi, - unsigned int nfixedargs, - unsigned int ntotalargs, - ffi_type *rtype, - ffi_type **atypes) -{ - return ffi_prep_cif_core(cif, abi, 1, nfixedargs, ntotalargs, rtype, atypes); -} - -#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 - -ffi_status -ffi_get_struct_offsets (ffi_abi abi, ffi_type *struct_type, size_t *offsets) -{ - if (! (abi > FFI_FIRST_ABI && abi < FFI_LAST_ABI)) - return FFI_BAD_ABI; - if (struct_type->type != FFI_TYPE_STRUCT) - return FFI_BAD_TYPEDEF; - -#if HAVE_LONG_DOUBLE_VARIANT - ffi_prep_types (abi); -#endif - - return initialize_aggregate(struct_type, offsets); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c deleted file mode 100644 index be15611..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/raw_api.c +++ /dev/null @@ -1,267 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 += FFI_ALIGN (sizeof (void*), FFI_SIZEOF_ARG); - else -#endif - result += FFI_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_COMPLEX: - *args = (raw++)->ptr; - break; - - case FFI_TYPE_POINTER: - *args = (void*) &(raw++)->ptr; - break; - - default: - *args = raw; - raw += FFI_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 - if ((*tp)->type == FFI_TYPE_COMPLEX) - { - *args = (raw++)->ptr; - } - else - { - *args = (void*) raw; - raw += FFI_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_COMPLEX: - (raw++)->ptr = *args; - break; - - case FFI_TYPE_POINTER: - (raw++)->ptr = **(void***) args; - break; - - default: - memcpy ((void*) raw->data, (void*)*args, (*tp)->size); - raw += FFI_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.25/ext/ffi_c/libffi/src/riscv/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/ffi.c deleted file mode 100644 index b744fdd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/ffi.c +++ /dev/null @@ -1,445 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2015 Michael Knyszek - 2015 Andrew Waterman - 2018 Stef O'Rear - Based on MIPS N32/64 port - - RISC-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 -#include - -#if __riscv_float_abi_double -#define ABI_FLEN 64 -#define ABI_FLOAT double -#elif __riscv_float_abi_single -#define ABI_FLEN 32 -#define ABI_FLOAT float -#endif - -#define NARGREG 8 -#define STKALIGN 16 -#define MAXCOPYARG (2 * sizeof(double)) - -typedef struct call_context -{ -#if ABI_FLEN - ABI_FLOAT fa[8]; -#endif - size_t a[8]; - /* used by the assembly code to in-place construct its own stack frame */ - char frame[16]; -} call_context; - -typedef struct call_builder -{ - call_context *aregs; - int used_integer; - int used_float; - size_t *used_stack; -} call_builder; - -/* integer (not pointer) less than ABI XLEN */ -/* FFI_TYPE_INT does not appear to be used */ -#if __SIZEOF_POINTER__ == 8 -#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT64) -#else -#define IS_INT(type) ((type) >= FFI_TYPE_UINT8 && (type) <= FFI_TYPE_SINT32) -#endif - -#if ABI_FLEN -typedef struct { - char as_elements, type1, offset2, type2; -} float_struct_info; - -#if ABI_FLEN >= 64 -#define IS_FLOAT(type) ((type) >= FFI_TYPE_FLOAT && (type) <= FFI_TYPE_DOUBLE) -#else -#define IS_FLOAT(type) ((type) == FFI_TYPE_FLOAT) -#endif - -static ffi_type **flatten_struct(ffi_type *in, ffi_type **out, ffi_type **out_end) { - int i; - if (out == out_end) return out; - if (in->type != FFI_TYPE_STRUCT) { - *(out++) = in; - } else { - for (i = 0; in->elements[i]; i++) - out = flatten_struct(in->elements[i], out, out_end); - } - return out; -} - -/* Structs with at most two fields after flattening, one of which is of - floating point type, are passed in multiple registers if sufficient - registers are available. */ -static float_struct_info struct_passed_as_elements(call_builder *cb, ffi_type *top) { - float_struct_info ret = {0, 0, 0, 0}; - ffi_type *fields[3]; - int num_floats, num_ints; - int num_fields = flatten_struct(top, fields, fields + 3) - fields; - - if (num_fields == 1) { - if (IS_FLOAT(fields[0]->type)) { - ret.as_elements = 1; - ret.type1 = fields[0]->type; - } - } else if (num_fields == 2) { - num_floats = IS_FLOAT(fields[0]->type) + IS_FLOAT(fields[1]->type); - num_ints = IS_INT(fields[0]->type) + IS_INT(fields[1]->type); - if (num_floats == 0 || num_floats + num_ints != 2) - return ret; - if (cb->used_float + num_floats > NARGREG || cb->used_integer + (2 - num_floats) > NARGREG) - return ret; - if (!IS_FLOAT(fields[0]->type) && !IS_FLOAT(fields[1]->type)) - return ret; - - ret.type1 = fields[0]->type; - ret.type2 = fields[1]->type; - ret.offset2 = FFI_ALIGN(fields[0]->size, fields[1]->alignment); - ret.as_elements = 1; - } - - return ret; -} -#endif - -/* allocates a single register, float register, or XLEN-sized stack slot to a datum */ -static void marshal_atom(call_builder *cb, int type, void *data) { - size_t value = 0; - switch (type) { - case FFI_TYPE_UINT8: value = *(uint8_t *)data; break; - case FFI_TYPE_SINT8: value = *(int8_t *)data; break; - case FFI_TYPE_UINT16: value = *(uint16_t *)data; break; - case FFI_TYPE_SINT16: value = *(int16_t *)data; break; - /* 32-bit quantities are always sign-extended in the ABI */ - case FFI_TYPE_UINT32: value = *(int32_t *)data; break; - case FFI_TYPE_SINT32: value = *(int32_t *)data; break; -#if __SIZEOF_POINTER__ == 8 - case FFI_TYPE_UINT64: value = *(uint64_t *)data; break; - case FFI_TYPE_SINT64: value = *(int64_t *)data; break; -#endif - case FFI_TYPE_POINTER: value = *(size_t *)data; break; - - /* float values may be recoded in an implementation-defined way - by hardware conforming to 2.1 or earlier, so use asm to - reinterpret floats as doubles */ -#if ABI_FLEN >= 32 - case FFI_TYPE_FLOAT: - asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(float *)data)); - return; -#endif -#if ABI_FLEN >= 64 - case FFI_TYPE_DOUBLE: - asm("" : "=f"(cb->aregs->fa[cb->used_float++]) : "0"(*(double *)data)); - return; -#endif - default: FFI_ASSERT(0); break; - } - - if (cb->used_integer == NARGREG) { - *cb->used_stack++ = value; - } else { - cb->aregs->a[cb->used_integer++] = value; - } -} - -static void unmarshal_atom(call_builder *cb, int type, void *data) { - size_t value; - switch (type) { -#if ABI_FLEN >= 32 - case FFI_TYPE_FLOAT: - asm("" : "=f"(*(float *)data) : "0"(cb->aregs->fa[cb->used_float++])); - return; -#endif -#if ABI_FLEN >= 64 - case FFI_TYPE_DOUBLE: - asm("" : "=f"(*(double *)data) : "0"(cb->aregs->fa[cb->used_float++])); - return; -#endif - } - - if (cb->used_integer == NARGREG) { - value = *cb->used_stack++; - } else { - value = cb->aregs->a[cb->used_integer++]; - } - - switch (type) { - case FFI_TYPE_UINT8: *(uint8_t *)data = value; break; - case FFI_TYPE_SINT8: *(uint8_t *)data = value; break; - case FFI_TYPE_UINT16: *(uint16_t *)data = value; break; - case FFI_TYPE_SINT16: *(uint16_t *)data = value; break; - case FFI_TYPE_UINT32: *(uint32_t *)data = value; break; - case FFI_TYPE_SINT32: *(uint32_t *)data = value; break; -#if __SIZEOF_POINTER__ == 8 - case FFI_TYPE_UINT64: *(uint64_t *)data = value; break; - case FFI_TYPE_SINT64: *(uint64_t *)data = value; break; -#endif - case FFI_TYPE_POINTER: *(size_t *)data = value; break; - default: FFI_ASSERT(0); break; - } -} - -/* adds an argument to a call, or a not by reference return value */ -static void marshal(call_builder *cb, ffi_type *type, int var, void *data) { - size_t realign[2]; - -#if ABI_FLEN - if (!var && type->type == FFI_TYPE_STRUCT) { - float_struct_info fsi = struct_passed_as_elements(cb, type); - if (fsi.as_elements) { - marshal_atom(cb, fsi.type1, data); - if (fsi.offset2) - marshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); - return; - } - } - - if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { - marshal_atom(cb, type->type, data); - return; - } -#endif - - if (type->size > 2 * __SIZEOF_POINTER__) { - /* pass by reference */ - marshal_atom(cb, FFI_TYPE_POINTER, &data); - } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) { - marshal_atom(cb, type->type, data); - } else { - /* overlong integers, soft-float floats, and structs without special - float handling are treated identically from this point on */ - - /* variadics are aligned even in registers */ - if (type->alignment > __SIZEOF_POINTER__) { - if (var) - cb->used_integer = FFI_ALIGN(cb->used_integer, 2); - cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); - } - - memcpy(realign, data, type->size); - if (type->size > 0) - marshal_atom(cb, FFI_TYPE_POINTER, realign); - if (type->size > __SIZEOF_POINTER__) - marshal_atom(cb, FFI_TYPE_POINTER, realign + 1); - } -} - -/* for arguments passed by reference returns the pointer, otherwise the arg is copied (up to MAXCOPYARG bytes) */ -static void *unmarshal(call_builder *cb, ffi_type *type, int var, void *data) { - size_t realign[2]; - void *pointer; - -#if ABI_FLEN - if (!var && type->type == FFI_TYPE_STRUCT) { - float_struct_info fsi = struct_passed_as_elements(cb, type); - if (fsi.as_elements) { - unmarshal_atom(cb, fsi.type1, data); - if (fsi.offset2) - unmarshal_atom(cb, fsi.type2, ((char*)data) + fsi.offset2); - return data; - } - } - - if (!var && cb->used_float < NARGREG && IS_FLOAT(type->type)) { - unmarshal_atom(cb, type->type, data); - return data; - } -#endif - - if (type->size > 2 * __SIZEOF_POINTER__) { - /* pass by reference */ - unmarshal_atom(cb, FFI_TYPE_POINTER, (char*)&pointer); - return pointer; - } else if (IS_INT(type->type) || type->type == FFI_TYPE_POINTER) { - unmarshal_atom(cb, type->type, data); - return data; - } else { - /* overlong integers, soft-float floats, and structs without special - float handling are treated identically from this point on */ - - /* variadics are aligned even in registers */ - if (type->alignment > __SIZEOF_POINTER__) { - if (var) - cb->used_integer = FFI_ALIGN(cb->used_integer, 2); - cb->used_stack = (size_t *)FFI_ALIGN(cb->used_stack, 2*__SIZEOF_POINTER__); - } - - if (type->size > 0) - unmarshal_atom(cb, FFI_TYPE_POINTER, realign); - if (type->size > __SIZEOF_POINTER__) - unmarshal_atom(cb, FFI_TYPE_POINTER, realign + 1); - memcpy(data, realign, type->size); - return data; - } -} - -static int passed_by_ref(call_builder *cb, ffi_type *type, int var) { -#if ABI_FLEN - if (!var && type->type == FFI_TYPE_STRUCT) { - float_struct_info fsi = struct_passed_as_elements(cb, type); - if (fsi.as_elements) return 0; - } -#endif - - return type->size > 2 * __SIZEOF_POINTER__; -} - -/* Perform machine dependent cif processing */ -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) { - cif->riscv_nfixedargs = cif->nargs; - return FFI_OK; -} - -/* Perform machine dependent cif processing when we have a variadic function */ - -ffi_status ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned int nfixedargs, unsigned int ntotalargs) { - cif->riscv_nfixedargs = nfixedargs; - return FFI_OK; -} - -/* Low level routine for calling functions */ -extern void ffi_call_asm(void *stack, struct call_context *regs, void (*fn)(void)) FFI_HIDDEN; - -void ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - /* this is a conservative estimate, assuming a complex return value and - that all remaining arguments are long long / __int128 */ - size_t arg_bytes = cif->nargs <= 3 ? 0 : - FFI_ALIGN(2 * sizeof(size_t) * (cif->nargs - 3), STKALIGN); - size_t rval_bytes = 0; - if (rvalue == NULL && cif->rtype->size > 2*__SIZEOF_POINTER__) - rval_bytes = FFI_ALIGN(cif->rtype->size, STKALIGN); - size_t alloc_size = arg_bytes + rval_bytes + sizeof(call_context); - - /* the assembly code will deallocate all stack data at lower addresses - than the argument region, so we need to allocate the frame and the - return value after the arguments in a single allocation */ - size_t alloc_base; - /* Argument region must be 16-byte aligned */ - if (_Alignof(max_align_t) >= STKALIGN) { - /* since sizeof long double is normally 16, the compiler will - guarantee alloca alignment to at least that much */ - alloc_base = (size_t)alloca(alloc_size); - } else { - alloc_base = FFI_ALIGN(alloca(alloc_size + STKALIGN - 1), STKALIGN); - } - - if (rval_bytes) - rvalue = (void*)(alloc_base + arg_bytes); - - call_builder cb; - cb.used_float = cb.used_integer = 0; - cb.aregs = (call_context*)(alloc_base + arg_bytes + rval_bytes); - cb.used_stack = (void*)alloc_base; - - int return_by_ref = passed_by_ref(&cb, cif->rtype, 0); - if (return_by_ref) - marshal(&cb, &ffi_type_pointer, 0, &rvalue); - - int i; - for (i = 0; i < cif->nargs; i++) - marshal(&cb, cif->arg_types[i], i >= cif->riscv_nfixedargs, avalue[i]); - - ffi_call_asm((void*)alloc_base, cb.aregs, fn); - - cb.used_float = cb.used_integer = 0; - if (!return_by_ref && rvalue) - unmarshal(&cb, cif->rtype, 0, rvalue); -} - -extern void ffi_closure_asm(void) FFI_HIDDEN; - -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_t *tramp = (uint32_t *) &closure->tramp[0]; - uint64_t fn = (uint64_t) (uintptr_t) ffi_closure_asm; - - if (cif->abi <= FFI_FIRST_ABI || cif->abi >= FFI_LAST_ABI) - return FFI_BAD_ABI; - - /* we will call ffi_closure_inner with codeloc, not closure, but as long - as the memory is readable it should work */ - - tramp[0] = 0x00000317; /* auipc t1, 0 (i.e. t0 <- codeloc) */ -#if __SIZEOF_POINTER__ == 8 - tramp[1] = 0x01033383; /* ld t2, 16(t1) */ -#else - tramp[1] = 0x01032383; /* lw t2, 16(t1) */ -#endif - tramp[2] = 0x00038067; /* jr t2 */ - tramp[3] = 0x00000013; /* nop */ - tramp[4] = fn; - tramp[5] = fn >> 32; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - __builtin___clear_cache(codeloc, codeloc + FFI_TRAMPOLINE_SIZE); - - return FFI_OK; -} - -/* Called by the assembly code with aregs pointing to saved argument registers - and stack pointing to the stacked arguments. Return values passed in - registers will be reloaded from aregs. */ -void FFI_HIDDEN ffi_closure_inner(size_t *stack, call_context *aregs, ffi_closure *closure) { - ffi_cif *cif = closure->cif; - void **avalue = alloca(cif->nargs * sizeof(void*)); - /* storage for arguments which will be copied by unmarshal(). We could - theoretically avoid the copies in many cases and use at most 128 bytes - of memory, but allocating disjoint storage for each argument is - simpler. */ - char *astorage = alloca(cif->nargs * MAXCOPYARG); - void *rvalue; - call_builder cb; - int return_by_ref; - int i; - - cb.aregs = aregs; - cb.used_integer = cb.used_float = 0; - cb.used_stack = stack; - - return_by_ref = passed_by_ref(&cb, cif->rtype, 0); - if (return_by_ref) - unmarshal(&cb, &ffi_type_pointer, 0, &rvalue); - else - rvalue = alloca(cif->rtype->size); - - for (i = 0; i < cif->nargs; i++) - avalue[i] = unmarshal(&cb, cif->arg_types[i], - i >= cif->riscv_nfixedargs, astorage + i*MAXCOPYARG); - - (closure->fun)(cif, rvalue, avalue, closure->user_data); - - if (!return_by_ref && cif->rtype->type != FFI_TYPE_VOID) { - cb.used_integer = cb.used_float = 0; - marshal(&cb, cif->rtype, 0, rvalue); - } -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/ffitarget.h deleted file mode 100644 index fcaa899..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/ffitarget.h +++ /dev/null @@ -1,68 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - 2014 Michael Knyszek - - Target configuration macros for RISC-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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef __riscv -#error "libffi was configured for a RISC-V target but this does not appear to be a RISC-V compiler." -#endif - -#ifndef LIBFFI_ASM - -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; - -/* FFI_UNUSED_NN and riscv_unused are to maintain ABI compatibility with a - distributed Berkeley patch from 2014, and can be removed at SONAME bump */ -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_SYSV, - FFI_UNUSED_1, - FFI_UNUSED_2, - FFI_UNUSED_3, - FFI_LAST_ABI, - - FFI_DEFAULT_ABI = FFI_SYSV -} ffi_abi; - -#endif /* LIBFFI_ASM */ - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 24 -#define FFI_NATIVE_RAW_API 0 -#define FFI_EXTRA_CIF_FIELDS unsigned riscv_nfixedargs; unsigned riscv_unused; -#define FFI_TARGET_SPECIFIC_VARIADIC - -#endif - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/sysv.S deleted file mode 100644 index 2d09865..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/riscv/sysv.S +++ /dev/null @@ -1,214 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2015 Michael Knyszek - 2015 Andrew Waterman - 2018 Stef O'Rear - - RISC-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. - ----------------------------------------------------------------------- */ - -#define LIBFFI_ASM -#include -#include - -/* Define aliases so that we can handle all ABIs uniformly */ - -#if __SIZEOF_POINTER__ == 8 -#define PTRS 8 -#define LARG ld -#define SARG sd -#else -#define PTRS 4 -#define LARG lw -#define SARG sw -#endif - -#if __riscv_float_abi_double -#define FLTS 8 -#define FLARG fld -#define FSARG fsd -#elif __riscv_float_abi_single -#define FLTS 4 -#define FLARG flw -#define FSARG fsw -#else -#define FLTS 0 -#endif - -#define fp s0 - - .text - .globl ffi_call_asm - .type ffi_call_asm, @function - .hidden ffi_call_asm -/* - struct call_context { - floatreg fa[8]; - intreg a[8]; - intreg pad[rv32 ? 2 : 0]; - intreg save_fp, save_ra; - } - void ffi_call_asm(size_t *stackargs, struct call_context *regargs, - void (*fn)(void)); -*/ - -#define FRAME_LEN (8 * FLTS + 8 * PTRS + 16) - -ffi_call_asm: - .cfi_startproc - - /* - We are NOT going to set up an ordinary stack frame. In order to pass - the stacked args to the called function, we adjust our stack pointer to - a0, which is in the _caller's_ alloca area. We establish our own stack - frame at the end of the call_context. - - Anything below the arguments will be freed at this point, although we - preserve the call_context so that it can be read back in the caller. - */ - - .cfi_def_cfa 11, FRAME_LEN # interim CFA based on a1 - SARG fp, FRAME_LEN - 2*PTRS(a1) - .cfi_offset 8, -2*PTRS - SARG ra, FRAME_LEN - 1*PTRS(a1) - .cfi_offset 1, -1*PTRS - - addi fp, a1, FRAME_LEN - mv sp, a0 - .cfi_def_cfa 8, 0 # our frame is fully set up - - # Load arguments - mv t1, a2 - -#if FLTS - FLARG fa0, -FRAME_LEN+0*FLTS(fp) - FLARG fa1, -FRAME_LEN+1*FLTS(fp) - FLARG fa2, -FRAME_LEN+2*FLTS(fp) - FLARG fa3, -FRAME_LEN+3*FLTS(fp) - FLARG fa4, -FRAME_LEN+4*FLTS(fp) - FLARG fa5, -FRAME_LEN+5*FLTS(fp) - FLARG fa6, -FRAME_LEN+6*FLTS(fp) - FLARG fa7, -FRAME_LEN+7*FLTS(fp) -#endif - - LARG a0, -FRAME_LEN+8*FLTS+0*PTRS(fp) - LARG a1, -FRAME_LEN+8*FLTS+1*PTRS(fp) - LARG a2, -FRAME_LEN+8*FLTS+2*PTRS(fp) - LARG a3, -FRAME_LEN+8*FLTS+3*PTRS(fp) - LARG a4, -FRAME_LEN+8*FLTS+4*PTRS(fp) - LARG a5, -FRAME_LEN+8*FLTS+5*PTRS(fp) - LARG a6, -FRAME_LEN+8*FLTS+6*PTRS(fp) - LARG a7, -FRAME_LEN+8*FLTS+7*PTRS(fp) - - /* Call */ - jalr t1 - - /* Save return values - only a0/a1 (fa0/fa1) are used */ -#if FLTS - FSARG fa0, -FRAME_LEN+0*FLTS(fp) - FSARG fa1, -FRAME_LEN+1*FLTS(fp) -#endif - - SARG a0, -FRAME_LEN+8*FLTS+0*PTRS(fp) - SARG a1, -FRAME_LEN+8*FLTS+1*PTRS(fp) - - /* Restore and return */ - addi sp, fp, -FRAME_LEN - .cfi_def_cfa 2, FRAME_LEN - LARG ra, -1*PTRS(fp) - .cfi_restore 1 - LARG fp, -2*PTRS(fp) - .cfi_restore 8 - ret - .cfi_endproc - .size ffi_call_asm, .-ffi_call_asm - - -/* - ffi_closure_asm. Expects address of the passed-in ffi_closure in t1. - void ffi_closure_inner(size_t *stackargs, struct call_context *regargs, - ffi_closure *closure); -*/ - - .globl ffi_closure_asm - .hidden ffi_closure_asm - .type ffi_closure_asm, @function -ffi_closure_asm: - .cfi_startproc - - addi sp, sp, -FRAME_LEN - .cfi_def_cfa_offset FRAME_LEN - - /* make a frame */ - SARG fp, FRAME_LEN - 2*PTRS(sp) - .cfi_offset 8, -2*PTRS - SARG ra, FRAME_LEN - 1*PTRS(sp) - .cfi_offset 1, -1*PTRS - addi fp, sp, FRAME_LEN - - /* save arguments */ -#if FLTS - FSARG fa0, 0*FLTS(sp) - FSARG fa1, 1*FLTS(sp) - FSARG fa2, 2*FLTS(sp) - FSARG fa3, 3*FLTS(sp) - FSARG fa4, 4*FLTS(sp) - FSARG fa5, 5*FLTS(sp) - FSARG fa6, 6*FLTS(sp) - FSARG fa7, 7*FLTS(sp) -#endif - - SARG a0, 8*FLTS+0*PTRS(sp) - SARG a1, 8*FLTS+1*PTRS(sp) - SARG a2, 8*FLTS+2*PTRS(sp) - SARG a3, 8*FLTS+3*PTRS(sp) - SARG a4, 8*FLTS+4*PTRS(sp) - SARG a5, 8*FLTS+5*PTRS(sp) - SARG a6, 8*FLTS+6*PTRS(sp) - SARG a7, 8*FLTS+7*PTRS(sp) - - /* enter C */ - addi a0, sp, FRAME_LEN - mv a1, sp - mv a2, t1 - - call ffi_closure_inner - - /* return values */ -#if FLTS - FLARG fa0, 0*FLTS(sp) - FLARG fa1, 1*FLTS(sp) -#endif - - LARG a0, 8*FLTS+0*PTRS(sp) - LARG a1, 8*FLTS+1*PTRS(sp) - - /* restore and return */ - LARG ra, FRAME_LEN-1*PTRS(sp) - .cfi_restore 1 - LARG fp, FRAME_LEN-2*PTRS(sp) - .cfi_restore 8 - addi sp, sp, FRAME_LEN - .cfi_def_cfa_offset 0 - ret - .cfi_endproc - .size ffi_closure_asm, .-ffi_closure_asm diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffi.c deleted file mode 100644 index 4035b6e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffi.c +++ /dev/null @@ -1,756 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 "internal.h" - -/*====================== 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) - -/*===================== End of Defines ===============================*/ - -/*====================================================================*/ -/* Externals */ -/* --------- */ -/*====================================================================*/ - -struct call_frame -{ - void *back_chain; - void *eos; - unsigned long gpr_args[5]; - unsigned long gpr_save[9]; - unsigned long long fpr_args[4]; -}; - -extern void FFI_HIDDEN ffi_call_SYSV(struct call_frame *, unsigned, void *, - void (*fn)(void), void *); - -extern void ffi_closure_SYSV(void); -extern void ffi_go_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_cif_machdep. */ -/* */ -/* Function - Perform machine dependent CIF processing. */ -/* */ -/*====================================================================*/ - -ffi_status FFI_HIDDEN -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 and complex are returned via a hidden pointer. */ - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: - 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_TYPE_COMPLEX) - { - if (type == FFI_TYPE_COMPLEX) - type = FFI_TYPE_POINTER; - else - 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. */ -/* */ -/*====================================================================*/ - -static void -ffi_call_int(ffi_cif *cif, - void (*fn)(void), - void *rvalue, - void **avalue, - void *closure) -{ - int ret_type = cif->flags; - size_t rsize = 0, bytes = cif->bytes; - unsigned char *stack, *p_struct; - struct call_frame *frame; - unsigned long *p_ov, *p_gpr; - unsigned long long *p_fpr; - int n_fpr, n_gpr, n_ov, i, n; - ffi_type **arg_types; - - FFI_ASSERT (cif->abi == FFI_SYSV); - - /* If we don't have a return value, we need to fake one. */ - if (rvalue == NULL) - { - if (ret_type & FFI390_RET_IN_MEM) - rsize = cif->rtype->size; - else - ret_type = FFI390_RET_VOID; - } - - /* The stack space will be filled with those areas: - - dummy structure return (highest addresses) - FPR argument register save area - GPR argument register save area - stack frame for ffi_call_SYSV - 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. - - Note that we're going to create the stack frame for both - ffi_call_SYSV _and_ the target function right here. This - works because we don't make any function calls with more - than 5 arguments (indeed only memcpy and ffi_call_SYSV), - and thus we don't have any stacked outgoing parameters. */ - - stack = alloca (bytes + sizeof(struct call_frame) + rsize); - frame = (struct call_frame *)(stack + bytes); - if (rsize) - rvalue = frame + 1; - - /* Link the new frame back to the one from this function. */ - frame->back_chain = __builtin_frame_address (0); - - /* Fill in all of the argument stuff. */ - p_ov = (unsigned long *)stack; - p_struct = (unsigned char *)frame; - p_gpr = frame->gpr_args; - p_fpr = frame->fpr_args; - n_fpr = n_gpr = n_ov = 0; - - /* If we returning a structure then we set the first parameter register - to the address of where we are returning this structure. */ - if (cif->flags & FFI390_RET_IN_MEM) - p_gpr[n_gpr++] = (uintptr_t) rvalue; - - /* Now for the arguments. */ - arg_types = cif->arg_types; - for (i = 0, n = cif->nargs; i < n; ++i) - { - ffi_type *ty = arg_types[i]; - void *arg = avalue[i]; - int type = ty->type; - ffi_arg val; - - restart: - switch (type) - { - case FFI_TYPE_SINT8: - val = *(SINT8 *)arg; - goto do_int; - case FFI_TYPE_UINT8: - val = *(UINT8 *)arg; - goto do_int; - case FFI_TYPE_SINT16: - val = *(SINT16 *)arg; - goto do_int; - case FFI_TYPE_UINT16: - val = *(UINT16 *)arg; - goto do_int; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - val = *(SINT32 *)arg; - goto do_int; - case FFI_TYPE_UINT32: - val = *(UINT32 *)arg; - goto do_int; - case FFI_TYPE_POINTER: - val = *(uintptr_t *)arg; - do_int: - *(n_gpr < MAX_GPRARGS ? p_gpr + n_gpr++ : p_ov + n_ov++) = val; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: -#ifdef __s390x__ - val = *(UINT64 *)arg; - goto do_int; -#else - if (n_gpr == MAX_GPRARGS-1) - n_gpr = MAX_GPRARGS; - if (n_gpr < MAX_GPRARGS) - p_gpr[n_gpr++] = ((UINT32 *) arg)[0], - p_gpr[n_gpr++] = ((UINT32 *) arg)[1]; - else - p_ov[n_ov++] = ((UINT32 *) arg)[0], - p_ov[n_ov++] = ((UINT32 *) arg)[1]; -#endif - break; - - case FFI_TYPE_DOUBLE: - if (n_fpr < MAX_FPRARGS) - p_fpr[n_fpr++] = *(UINT64 *) arg; - else - { -#ifdef __s390x__ - p_ov[n_ov++] = *(UINT64 *) arg; -#else - p_ov[n_ov++] = ((UINT32 *) arg)[0], - p_ov[n_ov++] = ((UINT32 *) arg)[1]; -#endif - } - break; - - case FFI_TYPE_FLOAT: - val = *(UINT32 *)arg; - if (n_fpr < MAX_FPRARGS) - p_fpr[n_fpr++] = (UINT64)val << 32; - else - p_ov[n_ov++] = val; - break; - - case FFI_TYPE_STRUCT: - /* Check how a structure type is passed. */ - type = ffi_check_struct_type (ty); - /* Some structures are passed via a type they contain. */ - if (type != FFI_TYPE_POINTER) - goto restart; - /* ... otherwise, passed by reference. fallthru. */ - -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - /* 16-byte long double is passed via reference. */ -#endif - case FFI_TYPE_COMPLEX: - /* Complex types are passed via reference. */ - p_struct -= ROUND_SIZE (ty->size); - memcpy (p_struct, arg, ty->size); - val = (uintptr_t)p_struct; - goto do_int; - - default: - FFI_ASSERT (0); - break; - } - } - - ffi_call_SYSV (frame, ret_type & FFI360_RET_MASK, rvalue, fn, closure); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int(cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int(cif, fn, rvalue, avalue, closure); -} - -/*======================== End of Routine ============================*/ - -/*====================================================================*/ -/* */ -/* Name - ffi_closure_helper_SYSV. */ -/* */ -/* Function - Call a FFI closure target function. */ -/* */ -/*====================================================================*/ - -void FFI_HIDDEN -ffi_closure_helper_SYSV (ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*), - void *user_data, - 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 (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 (cif->flags & FFI390_RET_IN_MEM) - rvalue = (void *) p_gpr[n_gpr++]; - - /* Now for the arguments. */ - for (ptr = cif->arg_types, i = 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_TYPE_COMPLEX) - { - if (type == FFI_TYPE_COMPLEX) - type = FFI_TYPE_POINTER; - else - 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. */ - (fun) (cif, rvalue, avalue, user_data); - - /* Convert the return value. */ - switch (cif->rtype->type) - { - /* Void is easy, and so is struct. */ - case FFI_TYPE_VOID: - case FFI_TYPE_STRUCT: - case FFI_TYPE_COMPLEX: -#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) -{ - static unsigned short const template[] = { - 0x0d10, /* basr %r1,0 */ -#ifndef __s390x__ - 0x9801, 0x1006, /* lm %r0,%r1,6(%r1) */ -#else - 0xeb01, 0x100e, 0x0004, /* lmg %r0,%r1,14(%r1) */ -#endif - 0x07f1 /* br %r1 */ - }; - - unsigned long *tramp = (unsigned long *)&closure->tramp; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - memcpy (tramp, template, sizeof(template)); - tramp[2] = (unsigned long)codeloc; - tramp[3] = (unsigned long)&ffi_closure_SYSV; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -/*======================== End of Routine ============================*/ - -/* Build a Go language closure. */ - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - closure->tramp = ffi_go_closure_SYSV; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffitarget.h deleted file mode 100644 index d8a4ee4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/ffitarget.h +++ /dev/null @@ -1,70 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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 - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION -#define FFI_TARGET_HAS_COMPLEX_TYPE - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_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.25/ext/ffi_c/libffi/src/s390/internal.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/internal.h deleted file mode 100644 index b875578..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/internal.h +++ /dev/null @@ -1,11 +0,0 @@ -/* If these values change, sysv.S must be adapted! */ -#define FFI390_RET_DOUBLE 0 -#define FFI390_RET_FLOAT 1 -#define FFI390_RET_INT64 2 -#define FFI390_RET_INT32 3 -#define FFI390_RET_VOID 4 - -#define FFI360_RET_MASK 7 -#define FFI390_RET_IN_MEM 8 - -#define FFI390_RET_STRUCT (FFI390_RET_VOID | FFI390_RET_IN_MEM) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/sysv.S deleted file mode 100644 index c4b5006..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/s390/sysv.S +++ /dev/null @@ -1,325 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 - - .text - -#ifndef __s390x__ - - # r2: frame - # r3: ret_type - # r4: ret_addr - # r5: fun - # r6: closure - - # This assumes we are using gas. - .balign 8 - .globl ffi_call_SYSV - FFI_HIDDEN(ffi_call_SYSV) - .type ffi_call_SYSV,%function -ffi_call_SYSV: - .cfi_startproc - st %r6,44(%r2) # Save registers - stm %r12,%r14,48(%r2) - lr %r13,%r2 # Install frame pointer - .cfi_rel_offset r6, 44 - .cfi_rel_offset r12, 48 - .cfi_rel_offset r13, 52 - .cfi_rel_offset r14, 56 - .cfi_def_cfa_register r13 - st %r2,0(%r15) # Set up back chain - sla %r3,3 # ret_type *= 8 - lr %r12,%r4 # Save ret_addr - lr %r1,%r5 # Save fun - lr %r0,%r6 # Install static chain - - # Set return address, so that there is only one indirect jump. -#ifdef HAVE_AS_S390_ZARCH - larl %r14,.Ltable - ar %r14,%r3 -#else - basr %r14,0 -0: la %r14,.Ltable-0b(%r14,%r3) -#endif - - lm %r2,%r6,8(%r13) # Load arguments - ld %f0,64(%r13) - ld %f2,72(%r13) - br %r1 # ... and call function - - .balign 8 -.Ltable: -# FFI390_RET_DOUBLE - std %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_FLOAT - ste %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_INT64 - st %r3,4(%r12) - nop - # fallthru - - .balign 8 -# FFI390_RET_INT32 - st %r2,0(%r12) - nop - # fallthru - - .balign 8 -# FFI390_RET_VOID -.Ldone: - l %r14,56(%r13) - l %r12,48(%r13) - l %r6,44(%r13) - l %r13,52(%r13) - .cfi_restore 14 - .cfi_restore 13 - .cfi_restore 12 - .cfi_restore 6 - .cfi_def_cfa r15, 96 - br %r14 - .cfi_endproc - .size ffi_call_SYSV,.-ffi_call_SYSV - - - .balign 8 - .globl ffi_go_closure_SYSV - FFI_HIDDEN(ffi_go_closure_SYSV) - .type ffi_go_closure_SYSV,%function -ffi_go_closure_SYSV: - .cfi_startproc - stm %r2,%r6,8(%r15) # Save arguments - lr %r4,%r0 # Load closure -> user_data - l %r2,4(%r4) # ->cif - l %r3,8(%r4) # ->fun - j .Ldoclosure - .cfi_endproc - - .balign 8 - .globl ffi_closure_SYSV - FFI_HIDDEN(ffi_closure_SYSV) - .type ffi_closure_SYSV,%function -ffi_closure_SYSV: - .cfi_startproc - stm %r2,%r6,8(%r15) # Save arguments - lr %r4,%r0 # Closure - l %r2,16(%r4) # ->cif - l %r3,20(%r4) # ->fun - l %r4,24(%r4) # ->user_data -.Ldoclosure: - stm %r12,%r15,48(%r15) # Save registers - lr %r12,%r15 - .cfi_def_cfa_register r12 - .cfi_rel_offset r6, 24 - .cfi_rel_offset r12, 48 - .cfi_rel_offset r13, 52 - .cfi_rel_offset r14, 56 - .cfi_rel_offset r15, 60 -#ifndef HAVE_AS_S390_ZARCH - basr %r13,0 # Set up base register -.Lcbase: - l %r1,.Lchelper-.Lcbase(%r13) # Get helper function -#endif - ahi %r15,-96-8 # Set up stack frame - st %r12,0(%r15) # Set up back chain - - std %f0,64(%r12) # Save fp arguments - std %f2,72(%r12) - - la %r5,96(%r12) # Overflow - st %r5,96(%r15) - la %r6,64(%r12) # FPRs - la %r5,8(%r12) # GPRs -#ifdef HAVE_AS_S390_ZARCH - brasl %r14,ffi_closure_helper_SYSV -#else - bas %r14,0(%r1,%r13) # Call helper -#endif - - lr %r15,%r12 - .cfi_def_cfa_register r15 - lm %r12,%r14,48(%r12) # Restore saved registers - l %r6,24(%r15) - ld %f0,64(%r15) # Load return registers - lm %r2,%r3,8(%r15) - br %r14 - .cfi_endproc - -#ifndef HAVE_AS_S390_ZARCH - .align 4 -.Lchelper: - .long ffi_closure_helper_SYSV-.Lcbase -#endif - - .size ffi_closure_SYSV,.-ffi_closure_SYSV - -#else - - # r2: frame - # r3: ret_type - # r4: ret_addr - # r5: fun - # r6: closure - - # This assumes we are using gas. - .balign 8 - .globl ffi_call_SYSV - FFI_HIDDEN(ffi_call_SYSV) - .type ffi_call_SYSV,%function -ffi_call_SYSV: - .cfi_startproc - stg %r6,88(%r2) # Save registers - stmg %r12,%r14,96(%r2) - lgr %r13,%r2 # Install frame pointer - .cfi_rel_offset r6, 88 - .cfi_rel_offset r12, 96 - .cfi_rel_offset r13, 104 - .cfi_rel_offset r14, 112 - .cfi_def_cfa_register r13 - stg %r2,0(%r15) # Set up back chain - larl %r14,.Ltable # Set up return address - slag %r3,%r3,3 # ret_type *= 8 - lgr %r12,%r4 # Save ret_addr - lgr %r1,%r5 # Save fun - lgr %r0,%r6 # Install static chain - agr %r14,%r3 - lmg %r2,%r6,16(%r13) # Load arguments - ld %f0,128(%r13) - ld %f2,136(%r13) - ld %f4,144(%r13) - ld %f6,152(%r13) - br %r1 # ... and call function - - .balign 8 -.Ltable: -# FFI390_RET_DOUBLE - std %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_DOUBLE - ste %f0,0(%r12) - j .Ldone - - .balign 8 -# FFI390_RET_INT64 - stg %r2,0(%r12) - - .balign 8 -# FFI390_RET_INT32 - # Never used, as we always store type ffi_arg. - # But the stg above is 6 bytes and we cannot - # jump around this case, so fall through. - nop - nop - - .balign 8 -# FFI390_RET_VOID -.Ldone: - lg %r14,112(%r13) - lg %r12,96(%r13) - lg %r6,88(%r13) - lg %r13,104(%r13) - .cfi_restore r14 - .cfi_restore r13 - .cfi_restore r12 - .cfi_restore r6 - .cfi_def_cfa r15, 160 - br %r14 - .cfi_endproc - .size ffi_call_SYSV,.-ffi_call_SYSV - - - .balign 8 - .globl ffi_go_closure_SYSV - FFI_HIDDEN(ffi_go_closure_SYSV) - .type ffi_go_closure_SYSV,%function -ffi_go_closure_SYSV: - .cfi_startproc - stmg %r2,%r6,16(%r15) # Save arguments - lgr %r4,%r0 # Load closure -> user_data - lg %r2,8(%r4) # ->cif - lg %r3,16(%r4) # ->fun - j .Ldoclosure - .cfi_endproc - .size ffi_go_closure_SYSV,.-ffi_go_closure_SYSV - - - .balign 8 - .globl ffi_closure_SYSV - FFI_HIDDEN(ffi_closure_SYSV) - .type ffi_closure_SYSV,%function -ffi_closure_SYSV: - .cfi_startproc - stmg %r2,%r6,16(%r15) # Save arguments - lgr %r4,%r0 # Load closure - lg %r2,32(%r4) # ->cif - lg %r3,40(%r4) # ->fun - lg %r4,48(%r4) # ->user_data -.Ldoclosure: - stmg %r13,%r15,104(%r15) # Save registers - lgr %r13,%r15 - .cfi_def_cfa_register r13 - .cfi_rel_offset r6, 48 - .cfi_rel_offset r13, 104 - .cfi_rel_offset r14, 112 - .cfi_rel_offset r15, 120 - aghi %r15,-160-16 # Set up stack frame - stg %r13,0(%r15) # Set up back chain - - std %f0,128(%r13) # Save fp arguments - std %f2,136(%r13) - std %f4,144(%r13) - std %f6,152(%r13) - la %r5,160(%r13) # Overflow - stg %r5,160(%r15) - la %r6,128(%r13) # FPRs - la %r5,16(%r13) # GPRs - brasl %r14,ffi_closure_helper_SYSV # Call helper - - lgr %r15,%r13 - .cfi_def_cfa_register r15 - lmg %r13,%r14,104(%r13) # Restore saved registers - lg %r6,48(%r15) - ld %f0,128(%r15) # Load return registers - lg %r2,16(%r15) - br %r14 - .cfi_endproc - .size ffi_closure_SYSV,.-ffi_closure_SYSV -#endif /* !s390x */ - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffi.c deleted file mode 100644 index 9ec86bf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffi.c +++ /dev/null @@ -1,717 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2002-2008, 2012 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 essentially 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; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - 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.25/ext/ffi_c/libffi/src/sh/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffitarget.h deleted file mode 100644 index a36bf42..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/ffitarget.h +++ /dev/null @@ -1,54 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- 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.25/ext/ffi_c/libffi/src/sh/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/sysv.S deleted file mode 100644 index 5be7516..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh/sysv.S +++ /dev/null @@ -1,850 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/sh64/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/ffi.c deleted file mode 100644 index 123b87a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/ffi.c +++ /dev/null @@ -1,469 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2003, 2004, 2006, 2007, 2012 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; - - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - 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.25/ext/ffi_c/libffi/src/sh64/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/ffitarget.h deleted file mode 100644 index 08a6fe9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/ffitarget.h +++ /dev/null @@ -1,58 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- 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.25/ext/ffi_c/libffi/src/sh64/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/sysv.S deleted file mode 100644 index c4587d5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sh64/sysv.S +++ /dev/null @@ -1,539 +0,0 @@ -/* ----------------------------------------------------------------------- - 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.25/ext/ffi_c/libffi/src/sparc/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffi.c deleted file mode 100644 index 9e406d0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffi.c +++ /dev/null @@ -1,468 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011, 2013 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 -#include "internal.h" - -#ifndef SPARC64 - -/* 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 FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -/* Perform machine dependent cif processing */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - ffi_type *rtype = cif->rtype; - int rtt = rtype->type; - size_t bytes; - int i, n, flags; - - /* Set the return type flag */ - switch (rtt) - { - case FFI_TYPE_VOID: - flags = SPARC_RET_VOID; - break; - case FFI_TYPE_FLOAT: - flags = SPARC_RET_F_1; - break; - case FFI_TYPE_DOUBLE: - flags = SPARC_RET_F_2; - break; - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_STRUCT: - flags = (rtype->size & 0xfff) << SPARC_SIZEMASK_SHIFT; - flags |= SPARC_RET_STRUCT; - break; - case FFI_TYPE_SINT8: - flags = SPARC_RET_SINT8; - break; - case FFI_TYPE_UINT8: - flags = SPARC_RET_UINT8; - break; - case FFI_TYPE_SINT16: - flags = SPARC_RET_SINT16; - break; - case FFI_TYPE_UINT16: - flags = SPARC_RET_UINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - flags = SPARC_RET_UINT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = SPARC_RET_INT64; - break; - case FFI_TYPE_COMPLEX: - rtt = rtype->elements[0]->type; - switch (rtt) - { - case FFI_TYPE_FLOAT: - flags = SPARC_RET_F_2; - break; - case FFI_TYPE_DOUBLE: - flags = SPARC_RET_F_4; - break; - case FFI_TYPE_LONGDOUBLE: - flags = SPARC_RET_F_8; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = SPARC_RET_INT128; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - flags = SPARC_RET_INT64; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - flags = SP_V8_RET_CPLX16; - break; - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - flags = SP_V8_RET_CPLX8; - break; - default: - abort(); - } - break; - default: - abort(); - } - cif->flags = flags; - - bytes = 0; - for (i = 0, n = cif->nargs; i < n; ++i) - { - ffi_type *ty = cif->arg_types[i]; - size_t z = ty->size; - int tt = ty->type; - - switch (tt) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* Passed by reference. */ - z = 4; - break; - - case FFI_TYPE_COMPLEX: - tt = ty->elements[0]->type; - if (tt == FFI_TYPE_FLOAT || z > 8) - goto by_reference; - /* FALLTHRU */ - - default: - z = FFI_ALIGN(z, 4); - } - bytes += z; - } - - /* Sparc call frames require that space is allocated for 6 args, - even if they aren't used. Make that space if necessary. */ - if (bytes < 6 * 4) - bytes = 6 * 4; - - /* The ABI always requires space for the struct return pointer. */ - bytes += 4; - - /* The stack must be 2 word aligned, so round bytes up appropriately. */ - bytes = FFI_ALIGN(bytes, 2 * 4); - - /* Include the call frame to prep_args. */ - bytes += 4*16 + 4*8; - cif->bytes = bytes; - - return FFI_OK; -} - -extern void ffi_call_v8(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, size_t bytes, void *closure) FFI_HIDDEN; - -int FFI_HIDDEN -ffi_prep_args_v8(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue) -{ - ffi_type **p_arg; - int flags = cif->flags; - int i, nargs; - - if (rvalue == NULL) - { - if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) - { - /* Since we pass the pointer to the callee, we need a value. - We allowed for this space in ffi_call, before ffi_call_v8 - alloca'd the space. */ - rvalue = (char *)argp + cif->bytes; - } - else - { - /* Otherwise, we can ignore the return value. */ - flags = SPARC_RET_VOID; - } - } - - /* This could only really be done when we are returning a structure. - However, the space is reserved so we can do it unconditionally. */ - *argp++ = (unsigned long)rvalue; - -#ifdef USING_PURIFY - /* Purify will probably complain in our assembly routine, - unless we zero out this memory. */ - memset(argp, 0, 6*4); -#endif - - p_arg = cif->arg_types; - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = p_arg[i]; - void *a = avalue[i]; - int tt = ty->type; - size_t z; - - switch (tt) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - by_reference: - *argp++ = (unsigned long)a; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - memcpy(argp, a, 8); - argp += 2; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *argp++ = *(unsigned *)a; - break; - - case FFI_TYPE_UINT8: - *argp++ = *(UINT8 *)a; - break; - case FFI_TYPE_SINT8: - *argp++ = *(SINT8 *)a; - break; - case FFI_TYPE_UINT16: - *argp++ = *(UINT16 *)a; - break; - case FFI_TYPE_SINT16: - *argp++ = *(SINT16 *)a; - break; - - case FFI_TYPE_COMPLEX: - tt = ty->elements[0]->type; - z = ty->size; - if (tt == FFI_TYPE_FLOAT || z > 8) - goto by_reference; - if (z < 4) - { - memcpy((char *)argp + 4 - z, a, z); - argp++; - } - else - { - memcpy(argp, a, z); - argp += z / 4; - } - break; - - default: - abort(); - } - } - - return flags; -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - size_t bytes = cif->bytes; - - FFI_ASSERT (cif->abi == FFI_V8); - - /* If we've not got a return value, we need to create one if we've - got to pass the return value to the callee. Otherwise ignore it. */ - if (rvalue == NULL - && (cif->flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) - bytes += FFI_ALIGN (cif->rtype->size, 8); - - ffi_call_v8(cif, fn, rvalue, avalue, -bytes, closure); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - -#ifdef __GNUC__ -static inline void -ffi_flush_icache (void *p) -{ - /* SPARC v8 requires 5 instructions for flush to be visible */ - asm volatile ("iflush %0; iflush %0+8; nop; nop; nop; nop; nop" - : : "r" (p) : "memory"); -} -#else -extern void ffi_flush_icache (void *) FFI_HIDDEN; -#endif - -extern void ffi_closure_v8(void) FFI_HIDDEN; -extern void ffi_go_closure_v8(void) FFI_HIDDEN; - -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 ctx = (unsigned long) closure; - unsigned long fn = (unsigned long) ffi_closure_v8; - - if (cif->abi != FFI_V8) - return FFI_BAD_ABI; - - 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) */ - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - ffi_flush_icache (closure); - - return FFI_OK; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure *closure, ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - if (cif->abi != FFI_V8) - return FFI_BAD_ABI; - - closure->tramp = ffi_go_closure_v8; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -int FFI_HIDDEN -ffi_closure_sparc_inner_v8(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, void *rvalue, - unsigned long *argp) -{ - ffi_type **arg_types; - void **avalue; - int i, nargs, flags; - - arg_types = cif->arg_types; - nargs = cif->nargs; - flags = cif->flags; - avalue = alloca(nargs * sizeof(void *)); - - /* Copy the caller's structure return address so that the closure - returns the data directly to the caller. Also install it so we - can return the address in %o0. */ - if ((flags & SPARC_FLAG_RET_MASK) == SPARC_RET_STRUCT) - { - void *new_rvalue = (void *)*argp; - *(void **)rvalue = new_rvalue; - rvalue = new_rvalue; - } - - /* Always skip the structure return address. */ - argp++; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0; i < nargs; i++) - { - ffi_type *ty = arg_types[i]; - int tt = ty->type; - void *a = argp; - size_t z; - - switch (tt) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - by_reference: - /* Straight copy of invisible reference. */ - a = (void *)*argp; - break; - - case FFI_TYPE_DOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - if ((unsigned long)a & 7) - { - /* Align on a 8-byte boundary. */ - UINT64 *tmp = alloca(8); - *tmp = ((UINT64)argp[0] << 32) | argp[1]; - a = tmp; - } - argp++; - break; - - case FFI_TYPE_INT: - case FFI_TYPE_FLOAT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - break; - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - a += 2; - break; - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - a += 3; - break; - - case FFI_TYPE_COMPLEX: - tt = ty->elements[0]->type; - z = ty->size; - if (tt == FFI_TYPE_FLOAT || z > 8) - goto by_reference; - if (z < 4) - a += 4 - z; - else if (z > 4) - argp++; - break; - - default: - abort(); - } - argp++; - avalue[i] = a; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_sparc how to perform return type promotions. */ - return flags; -} -#endif /* !SPARC64 */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffi64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffi64.c deleted file mode 100644 index 9e04061..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffi64.c +++ /dev/null @@ -1,608 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2011, 2013 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 -#include "internal.h" - -/* 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 FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -#ifdef SPARC64 - -/* Flatten the contents of a structure to the parts that are passed in - floating point registers. The return is a bit mask wherein bit N - set means bytes [4*n, 4*n+3] are passed in %fN. - - We encode both the (running) size (maximum 32) and mask (maxumum 255) - into one integer. The size is placed in the low byte, so that align - and addition work correctly. The mask is placed in the second byte. */ - -static int -ffi_struct_float_mask (ffi_type *outer_type, int size_mask) -{ - ffi_type **elts; - ffi_type *t; - - if (outer_type->type == FFI_TYPE_COMPLEX) - { - int m = 0, tt = outer_type->elements[0]->type; - size_t z = outer_type->size; - - if (tt == FFI_TYPE_FLOAT - || tt == FFI_TYPE_DOUBLE - || tt == FFI_TYPE_LONGDOUBLE) - m = (1 << (z / 4)) - 1; - return (m << 8) | z; - } - FFI_ASSERT (outer_type->type == FFI_TYPE_STRUCT); - - for (elts = outer_type->elements; (t = *elts) != NULL; elts++) - { - size_t z = t->size; - int o, m, tt; - - size_mask = FFI_ALIGN(size_mask, t->alignment); - switch (t->type) - { - case FFI_TYPE_STRUCT: - size_mask = ffi_struct_float_mask (t, size_mask); - continue; - case FFI_TYPE_COMPLEX: - tt = t->elements[0]->type; - if (tt != FFI_TYPE_FLOAT - && tt != FFI_TYPE_DOUBLE - && tt != FFI_TYPE_LONGDOUBLE) - break; - /* FALLTHRU */ - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - m = (1 << (z / 4)) - 1; /* compute mask for type */ - o = (size_mask >> 2) & 0x3f; /* extract word offset */ - size_mask |= m << (o + 8); /* insert mask into place */ - break; - } - size_mask += z; - } - - size_mask = FFI_ALIGN(size_mask, outer_type->alignment); - FFI_ASSERT ((size_mask & 0xff) == outer_type->size); - - return size_mask; -} - -/* Merge floating point data into integer data. If the structure is - entirely floating point, simply return a pointer to the fp data. */ - -static void * -ffi_struct_float_merge (int size_mask, void *vi, void *vf) -{ - int size = size_mask & 0xff; - int mask = size_mask >> 8; - int n = size >> 2; - - if (mask == 0) - return vi; - else if (mask == (1 << n) - 1) - return vf; - else - { - unsigned int *wi = vi, *wf = vf; - int i; - - for (i = 0; i < n; ++i) - if ((mask >> i) & 1) - wi[i] = wf[i]; - - return vi; - } -} - -/* Similar, but place the data into VD in the end. */ - -void FFI_HIDDEN -ffi_struct_float_copy (int size_mask, void *vd, void *vi, void *vf) -{ - int size = size_mask & 0xff; - int mask = size_mask >> 8; - int n = size >> 2; - - if (mask == 0) - ; - else if (mask == (1 << n) - 1) - vi = vf; - else - { - unsigned int *wd = vd, *wi = vi, *wf = vf; - int i; - - for (i = 0; i < n; ++i) - wd[i] = ((mask >> i) & 1 ? wf : wi)[i]; - return; - } - memcpy (vd, vi, size); -} - -/* Perform machine dependent cif processing */ - -static ffi_status -ffi_prep_cif_machdep_core(ffi_cif *cif) -{ - ffi_type *rtype = cif->rtype; - int rtt = rtype->type; - size_t bytes = 0; - int i, n, flags; - - /* Set the return type flag */ - switch (rtt) - { - case FFI_TYPE_VOID: - flags = SPARC_RET_VOID; - break; - case FFI_TYPE_FLOAT: - flags = SPARC_RET_F_1; - break; - case FFI_TYPE_DOUBLE: - flags = SPARC_RET_F_2; - break; - case FFI_TYPE_LONGDOUBLE: - flags = SPARC_RET_F_4; - break; - - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - if (rtype->size > 32) - { - flags = SPARC_RET_VOID | SPARC_FLAG_RET_IN_MEM; - bytes = 8; - } - else - { - int size_mask = ffi_struct_float_mask (rtype, 0); - int word_size = (size_mask >> 2) & 0x3f; - int all_mask = (1 << word_size) - 1; - int fp_mask = size_mask >> 8; - - flags = (size_mask << SPARC_SIZEMASK_SHIFT) | SPARC_RET_STRUCT; - - /* For special cases of all-int or all-fp, we can return - the value directly without popping through a struct copy. */ - if (fp_mask == 0) - { - if (rtype->alignment >= 8) - { - if (rtype->size == 8) - flags = SPARC_RET_INT64; - else if (rtype->size == 16) - flags = SPARC_RET_INT128; - } - } - else if (fp_mask == all_mask) - switch (word_size) - { - case 1: flags = SPARC_RET_F_1; break; - case 2: flags = SPARC_RET_F_2; break; - case 3: flags = SP_V9_RET_F_3; break; - case 4: flags = SPARC_RET_F_4; break; - /* 5 word structures skipped; handled via RET_STRUCT. */ - case 6: flags = SPARC_RET_F_6; break; - /* 7 word structures skipped; handled via RET_STRUCT. */ - case 8: flags = SPARC_RET_F_8; break; - } - } - break; - - case FFI_TYPE_SINT8: - flags = SPARC_RET_SINT8; - break; - case FFI_TYPE_UINT8: - flags = SPARC_RET_UINT8; - break; - case FFI_TYPE_SINT16: - flags = SPARC_RET_SINT16; - break; - case FFI_TYPE_UINT16: - flags = SPARC_RET_UINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - flags = SP_V9_RET_SINT32; - break; - case FFI_TYPE_UINT32: - flags = SPARC_RET_UINT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - flags = SPARC_RET_INT64; - break; - - default: - abort(); - } - - bytes = 0; - for (i = 0, n = cif->nargs; i < n; ++i) - { - ffi_type *ty = cif->arg_types[i]; - size_t z = ty->size; - size_t a = ty->alignment; - - switch (ty->type) - { - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - /* Large structs passed by reference. */ - if (z > 16) - { - a = z = 8; - break; - } - /* Small structs may be passed in integer or fp regs or both. */ - if (bytes >= 16*8) - break; - if ((ffi_struct_float_mask (ty, 0) & 0xff00) == 0) - break; - /* FALLTHRU */ - case FFI_TYPE_FLOAT: - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - flags |= SPARC_FLAG_FP_ARGS; - break; - } - bytes = FFI_ALIGN(bytes, a); - bytes += FFI_ALIGN(z, 8); - } - - /* Sparc call frames require that space is allocated for 6 args, - even if they aren't used. Make that space if necessary. */ - if (bytes < 6 * 8) - bytes = 6 * 8; - - /* The stack must be 2 word aligned, so round bytes up appropriately. */ - bytes = FFI_ALIGN(bytes, 16); - - /* Include the call frame to prep_args. */ - bytes += 8*16 + 8*8; - - cif->bytes = bytes; - cif->flags = flags; - return FFI_OK; -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - cif->nfixedargs = cif->nargs; - return ffi_prep_cif_machdep_core(cif); -} - -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep_var(ffi_cif *cif, unsigned nfixedargs, unsigned ntotalargs) -{ - cif->nfixedargs = nfixedargs; - return ffi_prep_cif_machdep_core(cif); -} - -extern void ffi_call_v9(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, size_t bytes, void *closure) FFI_HIDDEN; - -/* ffi_prep_args is called by the assembly routine once stack space - has been allocated for the function's arguments */ - -int FFI_HIDDEN -ffi_prep_args_v9(ffi_cif *cif, unsigned long *argp, void *rvalue, void **avalue) -{ - ffi_type **p_arg; - int flags = cif->flags; - int i, nargs; - - if (rvalue == NULL) - { - if (flags & SPARC_FLAG_RET_IN_MEM) - { - /* Since we pass the pointer to the callee, we need a value. - We allowed for this space in ffi_call, before ffi_call_v8 - alloca'd the space. */ - rvalue = (char *)argp + cif->bytes; - } - else - { - /* Otherwise, we can ignore the return value. */ - flags = SPARC_RET_VOID; - } - } - -#ifdef USING_PURIFY - /* Purify will probably complain in our assembly routine, - unless we zero out this memory. */ - memset(argp, 0, 6*8); -#endif - - if (flags & SPARC_FLAG_RET_IN_MEM) - *argp++ = (unsigned long)rvalue; - - p_arg = cif->arg_types; - for (i = 0, nargs = cif->nargs; i < nargs; i++) - { - ffi_type *ty = p_arg[i]; - void *a = avalue[i]; - size_t z; - - switch (ty->type) - { - case FFI_TYPE_SINT8: - *argp++ = *(SINT8 *)a; - break; - case FFI_TYPE_UINT8: - *argp++ = *(UINT8 *)a; - break; - case FFI_TYPE_SINT16: - *argp++ = *(SINT16 *)a; - break; - case FFI_TYPE_UINT16: - *argp++ = *(UINT16 *)a; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - *argp++ = *(SINT32 *)a; - break; - case FFI_TYPE_UINT32: - case FFI_TYPE_FLOAT: - *argp++ = *(UINT32 *)a; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_POINTER: - case FFI_TYPE_DOUBLE: - *argp++ = *(UINT64 *)a; - break; - - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - z = ty->size; - if (z > 16) - { - /* For structures larger than 16 bytes we pass reference. */ - *argp++ = (unsigned long)a; - break; - } - if (((unsigned long)argp & 15) && ty->alignment > 8) - argp++; - memcpy(argp, a, z); - argp += FFI_ALIGN(z, 8) / 8; - break; - - default: - abort(); - } - } - - return flags; -} - -static void -ffi_call_int(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - size_t bytes = cif->bytes; - - FFI_ASSERT (cif->abi == FFI_V9); - - if (rvalue == NULL && (cif->flags & SPARC_FLAG_RET_IN_MEM)) - bytes += FFI_ALIGN (cif->rtype->size, 16); - - ffi_call_v9(cif, fn, rvalue, avalue, -bytes, closure); -} - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int(cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int(cif, fn, rvalue, avalue, closure); -} - -#ifdef __GNUC__ -static inline void -ffi_flush_icache (void *p) -{ - asm volatile ("flush %0; flush %0+8" : : "r" (p) : "memory"); -} -#else -extern void ffi_flush_icache (void *) FFI_HIDDEN; -#endif - -extern void ffi_closure_v9(void) FFI_HIDDEN; -extern void ffi_go_closure_v9(void) FFI_HIDDEN; - -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; - - if (cif->abi != FFI_V9) - return FFI_BAD_ABI; - - /* Trampoline address is equal to the closure address. We take advantage - of that to reduce the trampoline size by 8 bytes. */ - 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; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - ffi_flush_icache (closure); - - return FFI_OK; -} - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - if (cif->abi != FFI_V9) - return FFI_BAD_ABI; - - closure->tramp = ffi_go_closure_v9; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -int FFI_HIDDEN -ffi_closure_sparc_inner_v9(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, void *rvalue, - unsigned long *gpr, unsigned long *fpr) -{ - ffi_type **arg_types; - void **avalue; - int i, argn, argx, nargs, flags, nfixedargs; - - arg_types = cif->arg_types; - nargs = cif->nargs; - flags = cif->flags; - nfixedargs = cif->nfixedargs; - - avalue = alloca(nargs * sizeof(void *)); - - /* Copy the caller's structure return address so that the closure - returns the data directly to the caller. */ - if (flags & SPARC_FLAG_RET_IN_MEM) - { - rvalue = (void *) gpr[0]; - /* Skip the structure return address. */ - argn = 1; - } - else - argn = 0; - - /* Grab the addresses of the arguments from the stack frame. */ - for (i = 0; i < nargs; i++, argn = argx) - { - int named = i < nfixedargs; - ffi_type *ty = arg_types[i]; - void *a = &gpr[argn]; - size_t z; - - argx = argn + 1; - switch (ty->type) - { - case FFI_TYPE_COMPLEX: - case FFI_TYPE_STRUCT: - z = ty->size; - if (z > 16) - a = *(void **)a; - else - { - argx = argn + FFI_ALIGN (z, 8) / 8; - if (named && argn < 16) - { - int size_mask = ffi_struct_float_mask (ty, 0); - int argn_mask = (0xffff00 >> argn) & 0xff00; - - /* Eliminate fp registers off the end. */ - size_mask = (size_mask & 0xff) | (size_mask & argn_mask); - a = ffi_struct_float_merge (size_mask, gpr+argn, fpr+argn); - } - } - break; - - case FFI_TYPE_LONGDOUBLE: - argn = FFI_ALIGN (argn, 2); - a = (named && argn < 16 ? fpr : gpr) + argn; - argx = argn + 2; - break; - case FFI_TYPE_DOUBLE: - if (named && argn < 16) - a = fpr + argn; - break; - case FFI_TYPE_FLOAT: - if (named && argn < 16) - a = fpr + argn; - a += 4; - break; - - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - case FFI_TYPE_POINTER: - break; - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - a += 4; - break; - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - a += 6; - break; - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - a += 7; - break; - - default: - abort(); - } - avalue[i] = a; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell ffi_closure_sparc how to perform return type promotions. */ - return flags; -} -#endif /* SPARC64 */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffitarget.h deleted file mode 100644 index 2f4cd9a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/ffitarget.h +++ /dev/null @@ -1,81 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- 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, -#ifdef SPARC64 - FFI_V9, - FFI_DEFAULT_ABI = FFI_V9, -#else - FFI_V8, - FFI_DEFAULT_ABI = FFI_V8, -#endif - FFI_LAST_ABI -} ffi_abi; -#endif - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION 1 -#define FFI_TARGET_HAS_COMPLEX_TYPE 1 - -#ifdef SPARC64 -# define FFI_TARGET_SPECIFIC_VARIADIC 1 -# define FFI_EXTRA_CIF_FIELDS unsigned int nfixedargs -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_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.25/ext/ffi_c/libffi/src/sparc/internal.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/internal.h deleted file mode 100644 index 0a66472..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/internal.h +++ /dev/null @@ -1,26 +0,0 @@ -#define SPARC_RET_VOID 0 -#define SPARC_RET_STRUCT 1 -#define SPARC_RET_UINT8 2 -#define SPARC_RET_SINT8 3 -#define SPARC_RET_UINT16 4 -#define SPARC_RET_SINT16 5 -#define SPARC_RET_UINT32 6 -#define SP_V9_RET_SINT32 7 /* v9 only */ -#define SP_V8_RET_CPLX16 7 /* v8 only */ -#define SPARC_RET_INT64 8 -#define SPARC_RET_INT128 9 - -/* Note that F_7 is missing, and is handled by SPARC_RET_STRUCT. */ -#define SPARC_RET_F_8 10 -#define SPARC_RET_F_6 11 -#define SPARC_RET_F_4 12 -#define SPARC_RET_F_2 13 -#define SP_V9_RET_F_3 14 /* v9 only */ -#define SP_V8_RET_CPLX8 14 /* v8 only */ -#define SPARC_RET_F_1 15 - -#define SPARC_FLAG_RET_MASK 15 -#define SPARC_FLAG_RET_IN_MEM 32 -#define SPARC_FLAG_FP_ARGS 64 - -#define SPARC_SIZEMASK_SHIFT 8 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v8.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v8.S deleted file mode 100644 index a2e4908..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v8.S +++ /dev/null @@ -1,443 +0,0 @@ -/* ----------------------------------------------------------------------- - v8.S - Copyright (c) 2013 The Written Word, Inc. - 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 -#include "internal.h" - -#ifndef SPARC64 - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) - -#ifdef __USER_LABEL_PREFIX__ -# define C(Y) C1(__USER_LABEL_PREFIX__, Y) -#else -# define C(Y) Y -#endif -#define L(Y) C1(.L, Y) - - .text - -#ifndef __GNUC__ - .align 8 - .globl C(ffi_flush_icache) - .type C(ffi_flush_icache),#function - FFI_HIDDEN(C(ffi_flush_icache)) - -C(ffi_flush_icache): -1: iflush %o0 - iflush %o+8 - nop - nop - nop - nop - nop - retl - nop - .size C(ffi_flush_icache), . - C(ffi_flush_icache) -#endif - -#if defined(__sun__) && defined(__svr4__) -# define E(INDEX) .align 16 -#else -# define E(INDEX) .align 16; .org 2b + INDEX * 16 -#endif - - .align 8 - .globl C(ffi_call_v8) - .type C(ffi_call_v8),#function - FFI_HIDDEN(C(ffi_call_v8)) - -C(ffi_call_v8): -.LUW0: - ! Allocate a stack frame sized by ffi_call. - save %sp, %o4, %sp -.LUW1: - mov %i0, %o0 ! copy cif - add %sp, 64+32, %o1 ! load args area - mov %i2, %o2 ! copy rvalue - call C(ffi_prep_args_v8) - mov %i3, %o3 ! copy avalue - - add %sp, 32, %sp ! deallocate prep frame - and %o0, SPARC_FLAG_RET_MASK, %l0 ! save return type - srl %o0, SPARC_SIZEMASK_SHIFT, %l1 ! save return size - ld [%sp+64+4], %o0 ! load all argument registers - ld [%sp+64+8], %o1 - ld [%sp+64+12], %o2 - ld [%sp+64+16], %o3 - cmp %l0, SPARC_RET_STRUCT ! struct return needs an unimp 4 - ld [%sp+64+20], %o4 - be 8f - ld [%sp+64+24], %o5 - - ! Call foreign function - call %i1 - mov %i5, %g2 ! load static chain - -0: call 1f ! load pc in %o7 - sll %l0, 4, %l0 -1: add %o7, %l0, %o7 ! o7 = 0b + ret_type*16 - jmp %o7+(2f-0b) - nop - - ! Note that each entry is 4 insns, enforced by the E macro. - .align 16 -2: -E(SPARC_RET_VOID) - ret - restore -E(SPARC_RET_STRUCT) - unimp -E(SPARC_RET_UINT8) - and %o0, 0xff, %o0 - st %o0, [%i2] - ret - restore -E(SPARC_RET_SINT8) - sll %o0, 24, %o0 - b 7f - sra %o0, 24, %o0 -E(SPARC_RET_UINT16) - sll %o0, 16, %o0 - b 7f - srl %o0, 16, %o0 -E(SPARC_RET_SINT16) - sll %o0, 16, %o0 - b 7f - sra %o0, 16, %o0 -E(SPARC_RET_UINT32) -7: st %o0, [%i2] - ret - restore -E(SP_V8_RET_CPLX16) - sth %o0, [%i2+2] - b 9f - srl %o0, 16, %o0 -E(SPARC_RET_INT64) - st %o0, [%i2] - st %o1, [%i2+4] - ret - restore -E(SPARC_RET_INT128) - std %o0, [%i2] - std %o2, [%i2+8] - ret - restore -E(SPARC_RET_F_8) - st %f7, [%i2+7*4] - nop - st %f6, [%i2+6*4] - nop -E(SPARC_RET_F_6) - st %f5, [%i2+5*4] - nop - st %f4, [%i2+4*4] - nop -E(SPARC_RET_F_4) - st %f3, [%i2+3*4] - nop - st %f2, [%i2+2*4] - nop -E(SPARC_RET_F_2) - st %f1, [%i2+4] - st %f0, [%i2] - ret - restore -E(SP_V8_RET_CPLX8) - stb %o0, [%i2+1] - b 0f - srl %o0, 8, %o0 -E(SPARC_RET_F_1) - st %f0, [%i2] - ret - restore - - .align 8 -9: sth %o0, [%i2] - ret - restore - .align 8 -0: stb %o0, [%i2] - ret - restore - - ! Struct returning functions expect and skip the unimp here. - ! To make it worse, conforming callees examine the unimp and - ! make sure the low 12 bits of the unimp match the size of - ! the struct being returned. - .align 8 -8: call 1f ! load pc in %o7 - sll %l1, 2, %l0 ! size * 4 -1: sll %l1, 4, %l1 ! size * 16 - add %l0, %l1, %l0 ! size * 20 - add %o7, %l0, %o7 ! o7 = 8b + size*20 - jmp %o7+(2f-8b) - mov %i5, %g2 ! load static chain -2: - -/* The Sun assembler doesn't understand .rept 0x1000. */ -#define rept1 \ - call %i1; \ - nop; \ - unimp (. - 2b) / 20; \ - ret; \ - restore - -#define rept16 \ - rept1; rept1; rept1; rept1; \ - rept1; rept1; rept1; rept1; \ - rept1; rept1; rept1; rept1; \ - rept1; rept1; rept1; rept1 - -#define rept256 \ - rept16; rept16; rept16; rept16; \ - rept16; rept16; rept16; rept16; \ - rept16; rept16; rept16; rept16; \ - rept16; rept16; rept16; rept16 - - rept256; rept256; rept256; rept256 - rept256; rept256; rept256; rept256 - rept256; rept256; rept256; rept256 - rept256; rept256; rept256; rept256 - -.LUW2: - .size C(ffi_call_v8),. - C(ffi_call_v8) - - -/* 16*4 register window + 1*4 struct return + 6*4 args backing store - + 8*4 return storage + 1*4 alignment. */ -#define STACKFRAME (16*4 + 4 + 6*4 + 8*4 + 4) - -/* ffi_closure_v8(...) - - Receives the closure argument in %g2. */ - -#ifdef HAVE_AS_REGISTER_PSEUDO_OP - .register %g2, #scratch -#endif - - .align 8 - .globl C(ffi_go_closure_v8) - .type C(ffi_go_closure_v8),#function - FFI_HIDDEN(C(ffi_go_closure_v8)) - -C(ffi_go_closure_v8): -.LUW3: - save %sp, -STACKFRAME, %sp -.LUW4: - ld [%g2+4], %o0 ! load cif - ld [%g2+8], %o1 ! load fun - b 0f - mov %g2, %o2 ! load user_data -.LUW5: - .size C(ffi_go_closure_v8), . - C(ffi_go_closure_v8) - - .align 8 - .globl C(ffi_closure_v8) - .type C(ffi_closure_v8),#function - FFI_HIDDEN(C(ffi_closure_v8)) - -C(ffi_closure_v8): -.LUW6: - save %sp, -STACKFRAME, %sp -.LUW7: - ld [%g2+FFI_TRAMPOLINE_SIZE], %o0 ! load cif - ld [%g2+FFI_TRAMPOLINE_SIZE+4], %o1 ! load fun - ld [%g2+FFI_TRAMPOLINE_SIZE+8], %o2 ! load user_data -0: - ! 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. - add %fp, -8*4, %o3 - call ffi_closure_sparc_inner_v8 - add %fp, 64, %o4 - -0: call 1f - and %o0, SPARC_FLAG_RET_MASK, %o0 -1: sll %o0, 4, %o0 ! o0 = o0 * 16 - add %o7, %o0, %o7 ! o7 = 0b + o0*16 - jmp %o7+(2f-0b) - add %fp, -8*4, %i2 - - ! Note that each entry is 4 insns, enforced by the E macro. - .align 16 -2: -E(SPARC_RET_VOID) - ret - restore -E(SPARC_RET_STRUCT) - ld [%i2], %i0 - jmp %i7+12 - restore -E(SPARC_RET_UINT8) - ldub [%i2+3], %i0 - ret - restore -E(SPARC_RET_SINT8) - ldsb [%i2+3], %i0 - ret - restore -E(SPARC_RET_UINT16) - lduh [%i2+2], %i0 - ret - restore -E(SPARC_RET_SINT16) - ldsh [%i2+2], %i0 - ret - restore -E(SPARC_RET_UINT32) - ld [%i2], %i0 - ret - restore -E(SP_V8_RET_CPLX16) - ld [%i2], %i0 - ret - restore -E(SPARC_RET_INT64) - ldd [%i2], %i0 - ret - restore -E(SPARC_RET_INT128) - ldd [%i2], %i0 - ldd [%i2+8], %i2 - ret - restore -E(SPARC_RET_F_8) - ld [%i2+7*4], %f7 - nop - ld [%i2+6*4], %f6 - nop -E(SPARC_RET_F_6) - ld [%i2+5*4], %f5 - nop - ld [%i2+4*4], %f4 - nop -E(SPARC_RET_F_4) - ld [%i2+3*4], %f3 - nop - ld [%i2+2*4], %f2 - nop -E(SPARC_RET_F_2) - ldd [%i2], %f0 - ret - restore -E(SP_V8_RET_CPLX8) - lduh [%i2], %i0 - ret - restore -E(SPARC_RET_F_1) - ld [%i2], %f0 - ret - restore - -.LUW8: - .size C(ffi_closure_v8), . - C(ffi_closure_v8) - -#ifdef HAVE_RO_EH_FRAME - .section ".eh_frame",#alloc -#else - .section ".eh_frame",#alloc,#write -#endif - -#ifdef HAVE_AS_SPARC_UA_PCREL -# define FDE_ADDR(X) %r_disp32(X) -#else -# define FDE_ADDR(X) X -#endif - - .align 4 -.LCIE: - .long .LECIE - .LSCIE ! CIE Length -.LSCIE: - .long 0 ! CIE Identifier Tag - .byte 1 ! CIE Version - .ascii "zR\0" ! CIE Augmentation - .byte 4 ! CIE Code Alignment Factor - .byte 0x7c ! CIE Data Alignment Factor - .byte 15 ! CIE RA Column - .byte 1 ! Augmentation size -#ifdef HAVE_AS_SPARC_UA_PCREL - .byte 0x1b ! FDE Encoding (pcrel sdata4) -#else - .byte 0x50 ! FDE Encoding (aligned absolute) -#endif - .byte 0xc, 14, 0 ! DW_CFA_def_cfa, %o6, offset 0 - .align 4 -.LECIE: - - .long .LEFDE1 - .LSFDE1 ! FDE Length -.LSFDE1: - .long .LSFDE1 - .LCIE ! FDE CIE offset - .long FDE_ADDR(.LUW0) ! Initial location - .long .LUW2 - .LUW0 ! Address range - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 4 -.LEFDE1: - - .long .LEFDE2 - .LSFDE2 ! FDE Length -.LSFDE2: - .long .LSFDE2 - .LCIE ! FDE CIE offset - .long FDE_ADDR(.LUW3) ! Initial location - .long .LUW5 - .LUW3 ! Address range - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 4 -.LEFDE2: - - .long .LEFDE3 - .LSFDE3 ! FDE Length -.LSFDE3: - .long .LSFDE3 - .LCIE ! FDE CIE offset - .long FDE_ADDR(.LUW6) ! Initial location - .long .LUW8 - .LUW6 ! Address range - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 4 -.LEFDE3: - -#endif /* !SPARC64 */ -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v9.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v9.S deleted file mode 100644 index 55f8f43..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/sparc/v9.S +++ /dev/null @@ -1,440 +0,0 @@ -/* ----------------------------------------------------------------------- - 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 -#include "internal.h" - -#ifdef SPARC64 - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) - -#ifdef __USER_LABEL_PREFIX__ -# define C(Y) C1(__USER_LABEL_PREFIX__, Y) -#else -# define C(Y) Y -#endif -#define L(Y) C1(.L, Y) - -#if defined(__sun__) && defined(__svr4__) -# define E(INDEX) .align 16 -#else -# define E(INDEX) .align 16; .org 2b + INDEX * 16 -#endif - -#define STACK_BIAS 2047 - - .text - .align 8 - .globl C(ffi_call_v9) - .type C(ffi_call_v9),#function - FFI_HIDDEN(C(ffi_call_v9)) - -C(ffi_call_v9): -.LUW0: - save %sp, %o4, %sp -.LUW1: - mov %i0, %o0 ! copy cif - add %sp, STACK_BIAS+128+48, %o1 ! load args area - mov %i2, %o2 ! copy rvalue - call C(ffi_prep_args_v9) - mov %i3, %o3 ! copy avalue - - andcc %o0, SPARC_FLAG_FP_ARGS, %g0 ! need fp regs? - add %sp, 48, %sp ! deallocate prep frame - be,pt %xcc, 1f - mov %o0, %l0 ! save flags - - ldd [%sp+STACK_BIAS+128], %f0 ! load all fp arg regs - ldd [%sp+STACK_BIAS+128+8], %f2 - ldd [%sp+STACK_BIAS+128+16], %f4 - ldd [%sp+STACK_BIAS+128+24], %f6 - ldd [%sp+STACK_BIAS+128+32], %f8 - ldd [%sp+STACK_BIAS+128+40], %f10 - ldd [%sp+STACK_BIAS+128+48], %f12 - ldd [%sp+STACK_BIAS+128+56], %f14 - ldd [%sp+STACK_BIAS+128+64], %f16 - ldd [%sp+STACK_BIAS+128+72], %f18 - ldd [%sp+STACK_BIAS+128+80], %f20 - ldd [%sp+STACK_BIAS+128+88], %f22 - ldd [%sp+STACK_BIAS+128+96], %f24 - ldd [%sp+STACK_BIAS+128+104], %f26 - ldd [%sp+STACK_BIAS+128+112], %f28 - ldd [%sp+STACK_BIAS+128+120], %f30 - -1: ldx [%sp+STACK_BIAS+128], %o0 ! load all int arg regs - ldx [%sp+STACK_BIAS+128+8], %o1 - ldx [%sp+STACK_BIAS+128+16], %o2 - ldx [%sp+STACK_BIAS+128+24], %o3 - ldx [%sp+STACK_BIAS+128+32], %o4 - ldx [%sp+STACK_BIAS+128+40], %o5 - call %i1 - mov %i5, %g5 ! load static chain - -0: call 1f ! load pc in %o7 - and %l0, SPARC_FLAG_RET_MASK, %l1 -1: sll %l1, 4, %l1 - add %o7, %l1, %o7 ! o7 = 0b + ret_type*16 - jmp %o7+(2f-0b) - nop - - .align 16 -2: -E(SPARC_RET_VOID) - return %i7+8 - nop -E(SPARC_RET_STRUCT) - add %sp, STACK_BIAS-64+128+48, %l2 - sub %sp, 64, %sp - b 8f - stx %o0, [%l2] -E(SPARC_RET_UINT8) - and %o0, 0xff, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_SINT8) - sll %o0, 24, %o0 - sra %o0, 24, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_UINT16) - sll %o0, 16, %o0 - srl %o0, 16, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_SINT16) - sll %o0, 16, %o0 - sra %o0, 16, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_UINT32) - srl %o0, 0, %i0 - return %i7+8 - stx %o0, [%o2] -E(SP_V9_RET_SINT32) - sra %o0, 0, %i0 - return %i7+8 - stx %o0, [%o2] -E(SPARC_RET_INT64) - stx %o0, [%i2] - return %i7+8 - nop -E(SPARC_RET_INT128) - stx %o0, [%i2] - stx %o1, [%i2+8] - return %i7+8 - nop -E(SPARC_RET_F_8) - st %f7, [%i2+7*4] - nop - st %f6, [%i2+6*4] - nop -E(SPARC_RET_F_6) - st %f5, [%i2+5*4] - nop - st %f4, [%i2+4*4] - nop -E(SPARC_RET_F_4) - std %f2, [%i2+2*4] - return %i7+8 - std %f0, [%o2] -E(SPARC_RET_F_2) - return %i7+8 - std %f0, [%o2] -E(SP_V9_RET_F_3) - st %f2, [%i2+2*4] - nop - st %f1, [%i2+1*4] - nop -E(SPARC_RET_F_1) - return %i7+8 - st %f0, [%o2] - - ! Finish the SPARC_RET_STRUCT sequence. - .align 8 -8: stx %o1, [%l2+8] - stx %o2, [%l2+16] - stx %o3, [%l2+24] - std %f0, [%l2+32] - std %f2, [%l2+40] - std %f4, [%l2+48] - std %f6, [%l2+56] - - ! Copy the structure into place. - srl %l0, SPARC_SIZEMASK_SHIFT, %o0 ! load size_mask - mov %i2, %o1 ! load dst - mov %l2, %o2 ! load src_gp - call C(ffi_struct_float_copy) - add %l2, 32, %o3 ! load src_fp - - return %i7+8 - nop - -.LUW2: - .size C(ffi_call_v9), . - C(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. */ - - .align 8 - .globl C(ffi_go_closure_v9) - .type C(ffi_go_closure_v9),#function - FFI_HIDDEN(C(ffi_go_closure_v9)) - -C(ffi_go_closure_v9): -.LUW3: - save %sp, -STACKFRAME, %sp -.LUW4: - ldx [%g5+8], %o0 - ldx [%g5+16], %o1 - b 0f - mov %g5, %o2 - -.LUW5: - .size C(ffi_go_closure_v9), . - C(ffi_go_closure_v9) - - .align 8 - .globl C(ffi_closure_v9) - .type C(ffi_closure_v9),#function - FFI_HIDDEN(C(ffi_closure_v9)) - -C(ffi_closure_v9): -.LUW6: - save %sp, -STACKFRAME, %sp -.LUW7: - ldx [%g1+FFI_TRAMPOLINE_SIZE], %o0 - ldx [%g1+FFI_TRAMPOLINE_SIZE+8], %o1 - ldx [%g1+FFI_TRAMPOLINE_SIZE+16], %o2 -0: - ! 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. - add %fp, STACK_BIAS-160, %o3 - add %fp, STACK_BIAS+128, %o4 - call C(ffi_closure_sparc_inner_v9) - add %fp, STACK_BIAS-128, %o5 - -0: call 1f ! load pc in %o7 - and %o0, SPARC_FLAG_RET_MASK, %o0 -1: sll %o0, 4, %o0 ! o2 = i2 * 16 - add %o7, %o0, %o7 ! o7 = 0b + i2*16 - jmp %o7+(2f-0b) - nop - - ! Note that we cannot load the data in the delay slot of - ! the return insn because the data is in the stack frame - ! that is deallocated by the return. - .align 16 -2: -E(SPARC_RET_VOID) - return %i7+8 - nop -E(SPARC_RET_STRUCT) - ldx [FP-160], %i0 - ldd [FP-160], %f0 - b 8f - ldx [FP-152], %i1 -E(SPARC_RET_UINT8) - ldub [FP-160+7], %i0 - return %i7+8 - nop -E(SPARC_RET_SINT8) - ldsb [FP-160+7], %i0 - return %i7+8 - nop -E(SPARC_RET_UINT16) - lduh [FP-160+6], %i0 - return %i7+8 - nop -E(SPARC_RET_SINT16) - ldsh [FP-160+6], %i0 - return %i7+8 - nop -E(SPARC_RET_UINT32) - lduw [FP-160+4], %i0 - return %i7+8 - nop -E(SP_V9_RET_SINT32) - ldsw [FP-160+4], %i0 - return %i7+8 - nop -E(SPARC_RET_INT64) - ldx [FP-160], %i0 - return %i7+8 - nop -E(SPARC_RET_INT128) - ldx [FP-160], %i0 - ldx [FP-160+8], %i1 - return %i7+8 - nop -E(SPARC_RET_F_8) - ld [FP-160+7*4], %f7 - nop - ld [FP-160+6*4], %f6 - nop -E(SPARC_RET_F_6) - ld [FP-160+5*4], %f5 - nop - ld [FP-160+4*4], %f4 - nop -E(SPARC_RET_F_4) - ldd [FP-160], %f0 - ldd [FP-160+8], %f2 - return %i7+8 - nop -E(SPARC_RET_F_2) - ldd [FP-160], %f0 - return %i7+8 - nop -E(SP_V9_RET_F_3) - ld [FP-160+2*4], %f2 - nop - ld [FP-160+1*4], %f1 - nop -E(SPARC_RET_F_1) - ld [FP-160], %f0 - return %i7+8 - nop - - ! Finish the SPARC_RET_STRUCT sequence. - .align 8 -8: ldd [FP-152], %f2 - ldx [FP-144], %i2 - ldd [FP-144], %f4 - ldx [FP-136], %i3 - ldd [FP-136], %f6 - return %i7+8 - nop - -.LUW8: - .size C(ffi_closure_v9), . - C(ffi_closure_v9) - -#ifdef HAVE_RO_EH_FRAME - .section ".eh_frame",#alloc -#else - .section ".eh_frame",#alloc,#write -#endif - -#ifdef HAVE_AS_SPARC_UA_PCREL -# define FDE_RANGE(B, E) .long %r_disp32(B), E - B -#else -# define FDE_RANGE(B, E) .align 8; .xword B, E - B -#endif - - .align 8 -.LCIE: - .long .LECIE - .LSCIE ! CIE Length -.LSCIE: - .long 0 ! CIE Identifier Tag - .byte 1 ! CIE Version - .ascii "zR\0" ! CIE Augmentation - .byte 4 ! CIE Code Alignment Factor - .byte 0x78 ! CIE Data Alignment Factor - .byte 15 ! CIE RA Column - .byte 1 ! Augmentation size -#ifdef HAVE_AS_SPARC_UA_PCREL - .byte 0x1b ! FDE Encoding (pcrel sdata4) -#else - .byte 0x50 ! FDE Encoding (aligned absolute) -#endif - .byte 0xc, 14, 0xff, 0xf ! DW_CFA_def_cfa, %o6, offset 0x7ff - .align 8 -.LECIE: - - .long .LEFDE1 - .LSFDE1 ! FDE Length -.LSFDE1: - .long .LSFDE1 - .LCIE ! FDE CIE offset - FDE_RANGE(.LUW0, .LUW2) - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 8 -.LEFDE1: - - .long .LEFDE2 - .LSFDE2 ! FDE Length -.LSFDE2: - .long .LSFDE2 - .LCIE ! FDE CIE offset - FDE_RANGE(.LUW3, .LUW5) - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 8 -.LEFDE2: - - .long .LEFDE3 - .LSFDE3 ! FDE Length -.LSFDE3: - .long .LSFDE3 - .LCIE ! FDE CIE offset - FDE_RANGE(.LUW6, .LUW8) - .byte 0 ! Augmentation size - .byte 0x40+1 ! DW_CFA_advance_loc 4 - .byte 0xd, 30 ! DW_CFA_def_cfa_register, %i6 - .byte 0x2d ! DW_CFA_GNU_window_save - .byte 0x9, 15, 31 ! DW_CFA_register, %o7, %i7 - .align 8 -.LEFDE3: - -#endif /* SPARC64 */ -#ifdef __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffi.c deleted file mode 100644 index 3a94469..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffi.c +++ /dev/null @@ -1,355 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2012 Tilera Corp. - - TILE 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 -#include -#include - - -/* The first 10 registers are used to pass arguments and return values. */ -#define NUM_ARG_REGS 10 - -/* Performs a raw function call with the given NUM_ARG_REGS register arguments - and the specified additional stack arguments (if any). */ -extern void ffi_call_tile(ffi_sarg reg_args[NUM_ARG_REGS], - const ffi_sarg *stack_args, - size_t stack_args_bytes, - void (*fnaddr)(void)) - FFI_HIDDEN; - -/* This handles the raw call from the closure stub, cleaning up the - parameters and delegating to ffi_closure_tile_inner. */ -extern void ffi_closure_tile(void) FFI_HIDDEN; - - -ffi_status -ffi_prep_cif_machdep(ffi_cif *cif) -{ - /* We always allocate room for all registers. Even if we don't - use them as parameters, they get returned in the same array - as struct return values so we need to make room. */ - if (cif->bytes < NUM_ARG_REGS * FFI_SIZEOF_ARG) - cif->bytes = NUM_ARG_REGS * FFI_SIZEOF_ARG; - - if (cif->rtype->size > NUM_ARG_REGS * FFI_SIZEOF_ARG) - cif->flags = FFI_TYPE_STRUCT; - else - cif->flags = FFI_TYPE_INT; - - /* Nothing to do. */ - return FFI_OK; -} - - -static long -assign_to_ffi_arg(ffi_sarg *out, void *in, const ffi_type *type, - int write_to_reg) -{ - switch (type->type) - { - case FFI_TYPE_SINT8: - *out = *(SINT8 *)in; - return 1; - - case FFI_TYPE_UINT8: - *out = *(UINT8 *)in; - return 1; - - case FFI_TYPE_SINT16: - *out = *(SINT16 *)in; - return 1; - - case FFI_TYPE_UINT16: - *out = *(UINT16 *)in; - return 1; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: -#ifndef __LP64__ - case FFI_TYPE_POINTER: -#endif - /* Note that even unsigned 32-bit quantities are sign extended - on tilegx when stored in a register. */ - *out = *(SINT32 *)in; - return 1; - - case FFI_TYPE_FLOAT: -#ifdef __tilegx__ - if (write_to_reg) - { - /* Properly sign extend the value. */ - union { float f; SINT32 s32; } val; - val.f = *(float *)in; - *out = val.s32; - } - else -#endif - { - *(float *)out = *(float *)in; - } - return 1; - - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - case FFI_TYPE_DOUBLE: -#ifdef __LP64__ - case FFI_TYPE_POINTER: -#endif - *(UINT64 *)out = *(UINT64 *)in; - return sizeof(UINT64) / FFI_SIZEOF_ARG; - - case FFI_TYPE_STRUCT: - memcpy(out, in, type->size); - return (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - - case FFI_TYPE_VOID: - /* Must be a return type. Nothing to do. */ - return 0; - - default: - FFI_ASSERT(0); - return -1; - } -} - - -void -ffi_call(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_sarg * const arg_mem = alloca(cif->bytes); - ffi_sarg * const reg_args = arg_mem; - ffi_sarg * const stack_args = ®_args[NUM_ARG_REGS]; - ffi_sarg *argp = arg_mem; - ffi_type ** const arg_types = cif->arg_types; - const long num_args = cif->nargs; - long i; - - if (cif->flags == FFI_TYPE_STRUCT) - { - /* Pass a hidden pointer to the return value. We make sure there - is scratch space for the callee to store the return value even if - our caller doesn't care about it. */ - *argp++ = (intptr_t)(rvalue ? rvalue : alloca(cif->rtype->size)); - - /* No more work needed to return anything. */ - rvalue = NULL; - } - - for (i = 0; i < num_args; i++) - { - ffi_type *type = arg_types[i]; - void * const arg_in = avalue[i]; - ptrdiff_t arg_word = argp - arg_mem; - -#ifndef __tilegx__ - /* Doubleword-aligned values are always in an even-number register - pair, or doubleword-aligned stack slot if out of registers. */ - long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); - argp += align; - arg_word += align; -#endif - - if (type->type == FFI_TYPE_STRUCT) - { - const size_t arg_size_in_words = - (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - - if (arg_word < NUM_ARG_REGS && - arg_word + arg_size_in_words > NUM_ARG_REGS) - { - /* Args are not allowed to span registers and the stack. */ - argp = stack_args; - } - - memcpy(argp, arg_in, type->size); - argp += arg_size_in_words; - } - else - { - argp += assign_to_ffi_arg(argp, arg_in, arg_types[i], 1); - } - } - - /* Actually do the call. */ - ffi_call_tile(reg_args, stack_args, - cif->bytes - (NUM_ARG_REGS * FFI_SIZEOF_ARG), fn); - - if (rvalue != NULL) - assign_to_ffi_arg(rvalue, reg_args, cif->rtype, 0); -} - - -/* Template code for closure. */ -extern const UINT64 ffi_template_tramp_tile[] FFI_HIDDEN; - - -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 __tilegx__ - /* TILE-Gx */ - SINT64 c; - SINT64 h; - int s; - UINT64 *out; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - out = (UINT64 *)closure->tramp; - - c = (intptr_t)closure; - h = (intptr_t)ffi_closure_tile; - s = 0; - - /* Find the smallest shift count that doesn't lose information - (i.e. no need to explicitly insert high bits of the address that - are just the sign extension of the low bits). */ - while ((c >> s) != (SINT16)(c >> s) || (h >> s) != (SINT16)(h >> s)) - s += 16; - -#define OPS(a, b, shift) \ - (create_Imm16_X0((a) >> (shift)) | create_Imm16_X1((b) >> (shift))) - - /* Emit the moveli. */ - *out++ = ffi_template_tramp_tile[0] | OPS(c, h, s); - for (s -= 16; s >= 0; s -= 16) - *out++ = ffi_template_tramp_tile[1] | OPS(c, h, s); - -#undef OPS - - *out++ = ffi_template_tramp_tile[2]; - -#else - /* TILEPro */ - UINT64 *out; - intptr_t delta; - - if (cif->abi != FFI_UNIX) - return FFI_BAD_ABI; - - out = (UINT64 *)closure->tramp; - delta = (intptr_t)ffi_closure_tile - (intptr_t)codeloc; - - *out++ = ffi_template_tramp_tile[0] | create_JOffLong_X1(delta >> 3); -#endif - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - invalidate_icache(closure->tramp, (char *)out - closure->tramp, - getpagesize()); - - return FFI_OK; -} - - -/* This is called by the assembly wrapper for closures. This does - all of the work. On entry reg_args[0] holds the values the registers - had when the closure was invoked. On return reg_args[1] holds the register - values to be returned to the caller (many of which may be garbage). */ -void FFI_HIDDEN -ffi_closure_tile_inner(ffi_closure *closure, - ffi_sarg reg_args[2][NUM_ARG_REGS], - ffi_sarg *stack_args) -{ - ffi_cif * const cif = closure->cif; - void ** const avalue = alloca(cif->nargs * sizeof(void *)); - void *rvalue; - ffi_type ** const arg_types = cif->arg_types; - ffi_sarg * const reg_args_in = reg_args[0]; - ffi_sarg * const reg_args_out = reg_args[1]; - ffi_sarg * argp; - long i, arg_word, nargs = cif->nargs; - /* Use a union to guarantee proper alignment for double. */ - union { ffi_sarg arg[NUM_ARG_REGS]; double d; UINT64 u64; } closure_ret; - - /* Start out reading register arguments. */ - argp = reg_args_in; - - /* Copy the caller's structure return address to that the closure - returns the data directly to the caller. */ - if (cif->flags == FFI_TYPE_STRUCT) - { - /* Return by reference via hidden pointer. */ - rvalue = (void *)(intptr_t)*argp++; - arg_word = 1; - } - else - { - /* Return the value in registers. */ - rvalue = &closure_ret; - arg_word = 0; - } - - /* Grab the addresses of the arguments. */ - for (i = 0; i < nargs; i++) - { - ffi_type * const type = arg_types[i]; - const size_t arg_size_in_words = - (type->size + FFI_SIZEOF_ARG - 1) / FFI_SIZEOF_ARG; - -#ifndef __tilegx__ - /* Doubleword-aligned values are always in an even-number register - pair, or doubleword-aligned stack slot if out of registers. */ - long align = arg_word & (type->alignment > FFI_SIZEOF_ARG); - argp += align; - arg_word += align; -#endif - - if (arg_word == NUM_ARG_REGS || - (arg_word < NUM_ARG_REGS && - arg_word + arg_size_in_words > NUM_ARG_REGS)) - { - /* Switch to reading arguments from the stack. */ - argp = stack_args; - arg_word = NUM_ARG_REGS; - } - - avalue[i] = argp; - argp += arg_size_in_words; - arg_word += arg_size_in_words; - } - - /* Invoke the closure. */ - closure->fun(cif, rvalue, avalue, closure->user_data); - - if (cif->flags != FFI_TYPE_STRUCT) - { - /* Canonicalize for register representation. */ - assign_to_ffi_arg(reg_args_out, &closure_ret, cif->rtype, 1); - } -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffitarget.h deleted file mode 100644 index 679fb5d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/ffitarget.h +++ /dev/null @@ -1,65 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012 Tilera Corp. - Target configuration macros for TILE. - - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#ifndef LIBFFI_ASM - -#include - -typedef uint_reg_t ffi_arg; -typedef int_reg_t ffi_sarg; - -typedef enum ffi_abi { - FFI_FIRST_ABI = 0, - FFI_UNIX, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_UNIX -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ -#define FFI_CLOSURES 1 - -#ifdef __tilegx__ -/* We always pass 8-byte values, even in -m32 mode. */ -# define FFI_SIZEOF_ARG 8 -# ifdef __LP64__ -# define FFI_TRAMPOLINE_SIZE (8 * 5) /* 5 bundles */ -# else -# define FFI_TRAMPOLINE_SIZE (8 * 3) /* 3 bundles */ -# endif -#else -# define FFI_SIZEOF_ARG 4 -# define FFI_TRAMPOLINE_SIZE 8 /* 1 bundle */ -#endif -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/tile.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/tile.S deleted file mode 100644 index d1f82cb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/tile/tile.S +++ /dev/null @@ -1,360 +0,0 @@ -/* ----------------------------------------------------------------------- - tile.S - Copyright (c) 2011 Tilera Corp. - - Tilera TILEPro and TILE-Gx 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 - -/* Number of bytes in a register. */ -#define REG_SIZE FFI_SIZEOF_ARG - -/* Number of bytes in stack linkage area for backtracing. - - A note about the ABI: on entry to a procedure, sp points to a stack - slot where it must spill the return address if it's not a leaf. - REG_SIZE bytes beyond that is a slot owned by the caller which - contains the sp value that the caller had when it was originally - entered (i.e. the caller's frame pointer). */ -#define LINKAGE_SIZE (2 * REG_SIZE) - -/* The first 10 registers are used to pass arguments and return values. */ -#define NUM_ARG_REGS 10 - -#ifdef __tilegx__ -#define SW st -#define LW ld -#define BGZT bgtzt -#else -#define SW sw -#define LW lw -#define BGZT bgzt -#endif - - -/* void ffi_call_tile (int_reg_t reg_args[NUM_ARG_REGS], - const int_reg_t *stack_args, - unsigned long stack_args_bytes, - void (*fnaddr)(void)); - - On entry, REG_ARGS contain the outgoing register values, - and STACK_ARGS contains STACK_ARG_BYTES of additional values - to be passed on the stack. If STACK_ARG_BYTES is zero, then - STACK_ARGS is ignored. - - When the invoked function returns, the values of r0-r9 are - blindly stored back into REG_ARGS for the caller to examine. */ - - .section .text.ffi_call_tile, "ax", @progbits - .align 8 - .globl ffi_call_tile - FFI_HIDDEN(ffi_call_tile) -ffi_call_tile: - -/* Incoming arguments. */ -#define REG_ARGS r0 -#define INCOMING_STACK_ARGS r1 -#define STACK_ARG_BYTES r2 -#define ORIG_FNADDR r3 - -/* Temporary values. */ -#define FRAME_SIZE r10 -#define TMP r11 -#define TMP2 r12 -#define OUTGOING_STACK_ARGS r13 -#define REG_ADDR_PTR r14 -#define RETURN_REG_ADDR r15 -#define FNADDR r16 - - .cfi_startproc - { - /* Save return address. */ - SW sp, lr - .cfi_offset lr, 0 - /* Prepare to spill incoming r52. */ - addi TMP, sp, -REG_SIZE - /* Increase frame size to have room to spill r52 and REG_ARGS. - The +7 is to round up mod 8. */ - addi FRAME_SIZE, STACK_ARG_BYTES, \ - REG_SIZE + REG_SIZE + LINKAGE_SIZE + 7 - } - { - /* Round stack frame size to a multiple of 8 to satisfy ABI. */ - andi FRAME_SIZE, FRAME_SIZE, -8 - /* Compute where to spill REG_ARGS value. */ - addi TMP2, sp, -(REG_SIZE * 2) - } - { - /* Spill incoming r52. */ - SW TMP, r52 - .cfi_offset r52, -REG_SIZE - /* Set up our frame pointer. */ - move r52, sp - .cfi_def_cfa_register r52 - /* Push stack frame. */ - sub sp, sp, FRAME_SIZE - } - { - /* Prepare to set up stack linkage. */ - addi TMP, sp, REG_SIZE - /* Prepare to memcpy stack args. */ - addi OUTGOING_STACK_ARGS, sp, LINKAGE_SIZE - /* Save REG_ARGS which we will need after we call the subroutine. */ - SW TMP2, REG_ARGS - } - { - /* Set up linkage info to hold incoming stack pointer. */ - SW TMP, r52 - } - { - /* Skip stack args memcpy if we don't have any stack args (common). */ - blezt STACK_ARG_BYTES, .Ldone_stack_args_memcpy - } - -.Lmemcpy_stack_args: - { - /* Load incoming argument from stack_args. */ - LW TMP, INCOMING_STACK_ARGS - addi INCOMING_STACK_ARGS, INCOMING_STACK_ARGS, REG_SIZE - } - { - /* Store stack argument into outgoing stack argument area. */ - SW OUTGOING_STACK_ARGS, TMP - addi OUTGOING_STACK_ARGS, OUTGOING_STACK_ARGS, REG_SIZE - addi STACK_ARG_BYTES, STACK_ARG_BYTES, -REG_SIZE - } - { - BGZT STACK_ARG_BYTES, .Lmemcpy_stack_args - } -.Ldone_stack_args_memcpy: - - { - /* Copy aside ORIG_FNADDR so we can overwrite its register. */ - move FNADDR, ORIG_FNADDR - /* Prepare to load argument registers. */ - addi REG_ADDR_PTR, r0, REG_SIZE - /* Load outgoing r0. */ - LW r0, r0 - } - - /* Load up argument registers from the REG_ARGS array. */ -#define LOAD_REG(REG, PTR) \ - { \ - LW REG, PTR ; \ - addi PTR, PTR, REG_SIZE \ - } - - LOAD_REG(r1, REG_ADDR_PTR) - LOAD_REG(r2, REG_ADDR_PTR) - LOAD_REG(r3, REG_ADDR_PTR) - LOAD_REG(r4, REG_ADDR_PTR) - LOAD_REG(r5, REG_ADDR_PTR) - LOAD_REG(r6, REG_ADDR_PTR) - LOAD_REG(r7, REG_ADDR_PTR) - LOAD_REG(r8, REG_ADDR_PTR) - LOAD_REG(r9, REG_ADDR_PTR) - - { - /* Call the subroutine. */ - jalr FNADDR - } - - { - /* Restore original lr. */ - LW lr, r52 - /* Prepare to recover ARGS, which we spilled earlier. */ - addi TMP, r52, -(2 * REG_SIZE) - } - { - /* Restore ARGS, so we can fill it in with the return regs r0-r9. */ - LW RETURN_REG_ADDR, TMP - /* Prepare to restore original r52. */ - addi TMP, r52, -REG_SIZE - } - - { - /* Pop stack frame. */ - move sp, r52 - /* Restore original r52. */ - LW r52, TMP - } - -#define STORE_REG(REG, PTR) \ - { \ - SW PTR, REG ; \ - addi PTR, PTR, REG_SIZE \ - } - - /* Return all register values by reference. */ - STORE_REG(r0, RETURN_REG_ADDR) - STORE_REG(r1, RETURN_REG_ADDR) - STORE_REG(r2, RETURN_REG_ADDR) - STORE_REG(r3, RETURN_REG_ADDR) - STORE_REG(r4, RETURN_REG_ADDR) - STORE_REG(r5, RETURN_REG_ADDR) - STORE_REG(r6, RETURN_REG_ADDR) - STORE_REG(r7, RETURN_REG_ADDR) - STORE_REG(r8, RETURN_REG_ADDR) - STORE_REG(r9, RETURN_REG_ADDR) - - { - jrp lr - } - - .cfi_endproc - .size ffi_call_tile, .-ffi_call_tile - -/* ffi_closure_tile(...) - - On entry, lr points to the closure plus 8 bytes, and r10 - contains the actual return address. - - This function simply dumps all register parameters into a stack array - and passes the closure, the registers array, and the stack arguments - to C code that does all of the actual closure processing. */ - - .section .text.ffi_closure_tile, "ax", @progbits - .align 8 - .globl ffi_closure_tile - FFI_HIDDEN(ffi_closure_tile) - - .cfi_startproc -/* Room to spill all NUM_ARG_REGS incoming registers, plus frame linkage. */ -#define CLOSURE_FRAME_SIZE (((NUM_ARG_REGS * REG_SIZE * 2 + LINKAGE_SIZE) + 7) & -8) -ffi_closure_tile: - { -#ifdef __tilegx__ - st sp, lr - .cfi_offset lr, 0 -#else - /* Save return address (in r10 due to closure stub wrapper). */ - SW sp, r10 - .cfi_return_column r10 - .cfi_offset r10, 0 -#endif - /* Compute address for stack frame linkage. */ - addli r10, sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) - } - { - /* Save incoming stack pointer in linkage area. */ - SW r10, sp - .cfi_offset sp, -(CLOSURE_FRAME_SIZE - REG_SIZE) - /* Push a new stack frame. */ - addli sp, sp, -CLOSURE_FRAME_SIZE - .cfi_adjust_cfa_offset CLOSURE_FRAME_SIZE - } - - { - /* Create pointer to where to start spilling registers. */ - addi r10, sp, LINKAGE_SIZE - } - - /* Spill all the incoming registers. */ - STORE_REG(r0, r10) - STORE_REG(r1, r10) - STORE_REG(r2, r10) - STORE_REG(r3, r10) - STORE_REG(r4, r10) - STORE_REG(r5, r10) - STORE_REG(r6, r10) - STORE_REG(r7, r10) - STORE_REG(r8, r10) - { - /* Save r9. */ - SW r10, r9 -#ifdef __tilegx__ - /* Pointer to closure is passed in r11. */ - move r0, r11 -#else - /* Compute pointer to the closure object. Because the closure - starts with a "jal ffi_closure_tile", we can just take the - value of lr (a phony return address pointing into the closure) - and subtract 8. */ - addi r0, lr, -8 -#endif - /* Compute a pointer to the register arguments we just spilled. */ - addi r1, sp, LINKAGE_SIZE - } - { - /* Compute a pointer to the extra stack arguments (if any). */ - addli r2, sp, CLOSURE_FRAME_SIZE + LINKAGE_SIZE - /* Call C code to deal with all of the grotty details. */ - jal ffi_closure_tile_inner - } - { - addli r10, sp, CLOSURE_FRAME_SIZE - } - { - /* Restore the return address. */ - LW lr, r10 - /* Compute pointer to registers array. */ - addli r10, sp, LINKAGE_SIZE + (NUM_ARG_REGS * REG_SIZE) - } - /* Return all the register values, which C code may have set. */ - LOAD_REG(r0, r10) - LOAD_REG(r1, r10) - LOAD_REG(r2, r10) - LOAD_REG(r3, r10) - LOAD_REG(r4, r10) - LOAD_REG(r5, r10) - LOAD_REG(r6, r10) - LOAD_REG(r7, r10) - LOAD_REG(r8, r10) - LOAD_REG(r9, r10) - { - /* Pop the frame. */ - addli sp, sp, CLOSURE_FRAME_SIZE - jrp lr - } - - .cfi_endproc - .size ffi_closure_tile, . - ffi_closure_tile - - -/* What follows are code template instructions that get copied to the - closure trampoline by ffi_prep_closure_loc. The zeroed operands - get replaced by their proper values at runtime. */ - - .section .text.ffi_template_tramp_tile, "ax", @progbits - .align 8 - .globl ffi_template_tramp_tile - FFI_HIDDEN(ffi_template_tramp_tile) -ffi_template_tramp_tile: -#ifdef __tilegx__ - { - moveli r11, 0 /* backpatched to address of containing closure. */ - moveli r10, 0 /* backpatched to ffi_closure_tile. */ - } - /* Note: the following bundle gets generated multiple times - depending on the pointer value (esp. useful for -m32 mode). */ - { shl16insli r11, r11, 0 ; shl16insli r10, r10, 0 } - { info 2+8 /* for backtracer: -> pc in lr, frame size 0 */ ; jr r10 } -#else - /* 'jal .' yields a PC-relative offset of zero so we can OR in the - right offset at runtime. */ - { move r10, lr ; jal . /* ffi_closure_tile */ } -#endif - - .size ffi_template_tramp_tile, . - ffi_template_tramp_tile diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c deleted file mode 100644 index 9ec27f6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/types.c +++ /dev/null @@ -1,108 +0,0 @@ -/* ----------------------------------------------------------------------- - 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, maybe_const)\ -struct struct_align_##name { \ - char c; \ - type x; \ -}; \ -FFI_EXTERN \ -maybe_const ffi_type ffi_type_##name = { \ - sizeof(type), \ - offsetof(struct struct_align_##name, x), \ - id, NULL \ -} - -#define FFI_COMPLEX_TYPEDEF(name, type, maybe_const) \ -static ffi_type *ffi_elements_complex_##name [2] = { \ - (ffi_type *)(&ffi_type_##name), NULL \ -}; \ -struct struct_align_complex_##name { \ - char c; \ - _Complex type x; \ -}; \ -FFI_EXTERN \ -maybe_const ffi_type ffi_type_complex_##name = { \ - sizeof(_Complex type), \ - offsetof(struct struct_align_complex_##name, x), \ - FFI_TYPE_COMPLEX, \ - (ffi_type **)ffi_elements_complex_##name \ -} - -/* Size and alignment are fake here. They must not be 0. */ -FFI_EXTERN const ffi_type ffi_type_void = { - 1, 1, FFI_TYPE_VOID, NULL -}; - -FFI_TYPEDEF(uint8, UINT8, FFI_TYPE_UINT8, const); -FFI_TYPEDEF(sint8, SINT8, FFI_TYPE_SINT8, const); -FFI_TYPEDEF(uint16, UINT16, FFI_TYPE_UINT16, const); -FFI_TYPEDEF(sint16, SINT16, FFI_TYPE_SINT16, const); -FFI_TYPEDEF(uint32, UINT32, FFI_TYPE_UINT32, const); -FFI_TYPEDEF(sint32, SINT32, FFI_TYPE_SINT32, const); -FFI_TYPEDEF(uint64, UINT64, FFI_TYPE_UINT64, const); -FFI_TYPEDEF(sint64, SINT64, FFI_TYPE_SINT64, const); - -FFI_TYPEDEF(pointer, void*, FFI_TYPE_POINTER, const); - -FFI_TYPEDEF(float, float, FFI_TYPE_FLOAT, const); -FFI_TYPEDEF(double, double, FFI_TYPE_DOUBLE, const); - -#if !defined HAVE_LONG_DOUBLE_VARIANT || defined __alpha__ -#define FFI_LDBL_CONST const -#else -#define FFI_LDBL_CONST -#endif - -#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, FFI_LDBL_CONST); -#endif - -#ifdef FFI_TARGET_HAS_COMPLEX_TYPE -FFI_COMPLEX_TYPEDEF(float, float, const); -FFI_COMPLEX_TYPEDEF(double, double, const); -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -FFI_COMPLEX_TYPEDEF(longdouble, long double, FFI_LDBL_CONST); -#endif -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/elfbsd.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/elfbsd.S deleted file mode 100644 index 01ca313..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/elfbsd.S +++ /dev/null @@ -1,195 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * vax Foreign Function Interface - */ - -#define LIBFFI_ASM -#include -#include - - .text - -/* - * void * %r0 - * ffi_call_elfbsd(extended_cif *ecif, 4(%ap) - * unsigned bytes, 8(%ap) - * unsigned flags, 12(%ap) - * void *rvalue, 16(%ap) - * void (*fn)()); 20(%ap) - */ - .globl ffi_call_elfbsd - .type ffi_call_elfbsd,@function - .align 2 -ffi_call_elfbsd: - .word 0x00c # save R2 and R3 - - # Allocate stack space for the args - subl2 8(%ap), %sp - - # Call ffi_prep_args - pushl %sp - pushl 4(%ap) - calls $2, ffi_prep_args - - # Get function pointer - movl 20(%ap), %r1 - - # Build a CALLS frame - ashl $-2, 8(%ap), %r0 - pushl %r0 # argument stack usage - movl %sp, %r0 # future %ap - # saved registers - bbc $11, 0(%r1), 1f - pushl %r11 -1: bbc $10, 0(%r1), 1f - pushl %r10 -1: bbc $9, 0(%r1), 1f - pushl %r9 -1: bbc $8, 0(%r1), 1f - pushl %r8 -1: bbc $7, 0(%r1), 1f - pushl %r7 -1: bbc $6, 0(%r1), 1f - pushl %r6 -1: bbc $5, 0(%r1), 1f - pushl %r5 -1: bbc $4, 0(%r1), 1f - pushl %r4 -1: bbc $3, 0(%r1), 1f - pushl %r3 -1: bbc $2, 0(%r1), 1f - pushl %r2 -1: - pushal 9f - pushl %fp - pushl %ap - movl 16(%ap), %r3 # struct return address, if needed - movl %r0, %ap - movzwl 4(%fp), %r0 # previous PSW, without the saved registers mask - bisl2 $0x20000000, %r0 # calls frame - movzwl 0(%r1), %r2 - bicw2 $0xf003, %r2 # only keep R11-R2 - ashl $16, %r2, %r2 - bisl2 %r2, %r0 # saved register mask of the called function - pushl %r0 - pushl $0 - movl %sp, %fp - - # Invoke the function - pushal 2(%r1) # skip procedure entry mask - movl %r3, %r1 - bicpsw $0x000f - rsb - -9: - # Copy return value if necessary - tstl 16(%ap) - jeql 9f - movl 16(%ap), %r2 - - bbc $0, 12(%ap), 1f # CIF_FLAGS_CHAR - movb %r0, 0(%r2) - brb 9f -1: - bbc $1, 12(%ap), 1f # CIF_FLAGS_SHORT - movw %r0, 0(%r2) - brb 9f -1: - bbc $2, 12(%ap), 1f # CIF_FLAGS_INT - movl %r0, 0(%r2) - brb 9f -1: - bbc $3, 12(%ap), 1f # CIF_FLAGS_DINT - movq %r0, 0(%r2) - brb 9f -1: - movl %r1, %r0 # might have been a struct - #brb 9f - -9: - ret - -/* - * ffi_closure_elfbsd(void); - * invoked with %r0: ffi_closure *closure - */ - .globl ffi_closure_elfbsd - .type ffi_closure_elfbsd, @function - .align 2 -ffi_closure_elfbsd: - .word 0 - - # Allocate room on stack for return value - subl2 $8, %sp - - # Invoke the closure function - pushal 4(%ap) # calling stack - pushal 4(%sp) # return value - pushl %r0 # closure - calls $3, ffi_closure_elfbsd_inner - - # Copy return value if necessary - bitb $1, %r0 # CIF_FLAGS_CHAR - beql 1f - movb 0(%sp), %r0 - brb 9f -1: - bitb $2, %r0 # CIF_FLAGS_SHORT - beql 1f - movw 0(%sp), %r0 - brb 9f -1: - bitb $4, %r0 # CIF_FLAGS_INT - beql 1f - movl 0(%sp), %r0 - brb 9f -1: - bitb $8, %r0 # CIF_FLAGS_DINT - beql 1f - movq 0(%sp), %r0 - #brb 9f -1: - -9: - ret - -/* - * ffi_closure_struct_elfbsd(void); - * invoked with %r0: ffi_closure *closure - * %r1: struct return address - */ - .globl ffi_closure_struct_elfbsd - .type ffi_closure_struct_elfbsd, @function - .align 2 -ffi_closure_struct_elfbsd: - .word 0 - - # Invoke the closure function - pushal 4(%ap) # calling stack - pushl %r1 # return value - pushl %r0 # closure - calls $3, ffi_closure_elfbsd_inner - - ret diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffi.c deleted file mode 100644 index e52caec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffi.c +++ /dev/null @@ -1,276 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * vax Foreign Function Interface - * - * This file attempts to provide all the FFI entry points which can reliably - * be implemented in C. - */ - -#include -#include - -#include -#include - -#define CIF_FLAGS_CHAR 1 /* for struct only */ -#define CIF_FLAGS_SHORT 2 /* for struct only */ -#define CIF_FLAGS_INT 4 -#define CIF_FLAGS_DINT 8 - -/* - * Foreign Function Interface API - */ - -void ffi_call_elfbsd (extended_cif *, unsigned, unsigned, void *, - void (*) ()); -void *ffi_prep_args (extended_cif *ecif, void *stack); - -void * -ffi_prep_args (extended_cif *ecif, void *stack) -{ - 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, *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 = FFI_ALIGN(z, sizeof(int)); - } - - p_argv++; - argp += z; - } - - return struct_value_ptr; -} - -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: - if (cif->rtype->elements[0]->type == FFI_TYPE_STRUCT && - cif->rtype->elements[1]) - { - cif->flags = 0; - break; - } - - if (cif->rtype->size == sizeof (char)) - cif->flags = CIF_FLAGS_CHAR; - else if (cif->rtype->size == sizeof (short)) - cif->flags = CIF_FLAGS_SHORT; - else if (cif->rtype->size == sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else if (cif->rtype->size == 2 * sizeof (int)) - cif->flags = CIF_FLAGS_DINT; - else - cif->flags = 0; - break; - - default: - if (cif->rtype->size <= sizeof (int)) - cif->flags = CIF_FLAGS_INT; - else - cif->flags = CIF_FLAGS_DINT; - 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->flags == 0) - ecif.rvalue = alloca (cif->rtype->size); - else - ecif.rvalue = rvalue; - - switch (cif->abi) - { - case FFI_ELFBSD: - ffi_call_elfbsd (&ecif, cif->bytes, cif->flags, ecif.rvalue, fn); - break; - - default: - FFI_ASSERT (0); - break; - } -} - -/* - * Closure API - */ - -void ffi_closure_elfbsd (void); -void ffi_closure_struct_elfbsd (void); -unsigned int ffi_closure_elfbsd_inner (ffi_closure *, void *, char *); - -static void -ffi_prep_closure_elfbsd (ffi_cif *cif, void **avalue, char *stackp) -{ - unsigned int i; - void **p_argv; - ffi_type **p_arg; - - p_argv = avalue; - - for (i = cif->nargs, p_arg = cif->arg_types; i != 0; i--, p_arg++) - { - size_t z; - - z = (*p_arg)->size; - *p_argv = stackp; - - /* Align if necessary */ - if ((sizeof (int) - 1) & z) - z = FFI_ALIGN(z, sizeof (int)); - - p_argv++; - stackp += z; - } -} - -unsigned int -ffi_closure_elfbsd_inner (ffi_closure *closure, void *resp, char *stack) -{ - ffi_cif *cif; - void **arg_area; - - cif = closure->cif; - arg_area = (void **) alloca (cif->nargs * sizeof (void *)); - - ffi_prep_closure_elfbsd (cif, arg_area, stack); - - (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) -{ - char *tramp = (char *) codeloc; - void *fn; - - FFI_ASSERT (cif->abi == FFI_ELFBSD); - - /* entry mask */ - *(unsigned short *)(tramp + 0) = 0x0000; - /* movl #closure, r0 */ - tramp[2] = 0xd0; - tramp[3] = 0x8f; - *(unsigned int *)(tramp + 4) = (unsigned int) closure; - tramp[8] = 0x50; - - if (cif->rtype->type == FFI_TYPE_STRUCT - && !cif->flags) - fn = &ffi_closure_struct_elfbsd; - else - fn = &ffi_closure_elfbsd; - - /* jmpl #fn */ - tramp[9] = 0x17; - tramp[10] = 0xef; - *(unsigned int *)(tramp + 11) = (unsigned int)fn + 2 - - (unsigned int)tramp - 9 - 6; - - 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.25/ext/ffi_c/libffi/src/vax/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffitarget.h deleted file mode 100644 index 2fc9488..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/vax/ffitarget.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright (c) 2013 Miodrag Vallat. - * - * 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. - */ - -/* - * vax Foreign Function Interface - */ - -#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_ELFBSD, - FFI_DEFAULT_ABI = FFI_ELFBSD, - FFI_LAST_ABI = FFI_DEFAULT_ABI + 1 -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_TRAMPOLINE_SIZE 15 -#define FFI_NATIVE_RAW_API 0 - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/asmnames.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/asmnames.h deleted file mode 100644 index 7551021..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/asmnames.h +++ /dev/null @@ -1,30 +0,0 @@ -#ifndef ASMNAMES_H -#define ASMNAMES_H - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) -#ifdef __USER_LABEL_PREFIX__ -# define C(X) C1(__USER_LABEL_PREFIX__, X) -#else -# define C(X) X -#endif - -#ifdef __APPLE__ -# define L(X) C1(L, X) -#else -# define L(X) C1(.L, X) -#endif - -#if defined(__ELF__) && defined(__PIC__) -# define PLT(X) X@PLT -#else -# define PLT(X) X -#endif - -#ifdef __ELF__ -# define ENDF(X) .type X,@function; .size X, . - X -#else -# define ENDF(X) -#endif - -#endif /* ASMNAMES_H */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi.c deleted file mode 100644 index 021f683..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi.c +++ /dev/null @@ -1,753 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2017 Anthony Green - 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. - ----------------------------------------------------------------------- */ - -#ifndef __x86_64__ -#include -#include -#include -#include -#include "internal.h" - -/* Force FFI_TYPE_LONGDOUBLE to be different than FFI_TYPE_DOUBLE; - all further uses in this file will refer to the 80-bit type. */ -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE -# if FFI_TYPE_LONGDOUBLE != 4 -# error FFI_TYPE_LONGDOUBLE out of date -# endif -#else -# undef FFI_TYPE_LONGDOUBLE -# define FFI_TYPE_LONGDOUBLE 4 -#endif - -#if defined(__GNUC__) && !defined(__declspec) -# define __declspec(x) __attribute__((x)) -#endif - -/* Perform machine dependent cif processing. */ -ffi_status FFI_HIDDEN -ffi_prep_cif_machdep(ffi_cif *cif) -{ - size_t bytes = 0; - int i, n, flags, cabi = cif->abi; - - switch (cabi) - { - case FFI_SYSV: - case FFI_STDCALL: - case FFI_THISCALL: - case FFI_FASTCALL: - case FFI_MS_CDECL: - case FFI_PASCAL: - case FFI_REGISTER: - break; - default: - return FFI_BAD_ABI; - } - - switch (cif->rtype->type) - { - case FFI_TYPE_VOID: - flags = X86_RET_VOID; - break; - case FFI_TYPE_FLOAT: - flags = X86_RET_FLOAT; - break; - case FFI_TYPE_DOUBLE: - flags = X86_RET_DOUBLE; - break; - case FFI_TYPE_LONGDOUBLE: - flags = X86_RET_LDOUBLE; - break; - case FFI_TYPE_UINT8: - flags = X86_RET_UINT8; - break; - case FFI_TYPE_UINT16: - flags = X86_RET_UINT16; - break; - case FFI_TYPE_SINT8: - flags = X86_RET_SINT8; - break; - case FFI_TYPE_SINT16: - flags = X86_RET_SINT16; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - flags = X86_RET_INT32; - break; - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - flags = X86_RET_INT64; - break; - case FFI_TYPE_STRUCT: -#ifndef X86 - /* ??? This should be a different ABI rather than an ifdef. */ - if (cif->rtype->size == 1) - flags = X86_RET_STRUCT_1B; - else if (cif->rtype->size == 2) - flags = X86_RET_STRUCT_2B; - else if (cif->rtype->size == 4) - flags = X86_RET_INT32; - else if (cif->rtype->size == 8) - flags = X86_RET_INT64; - else -#endif - { - do_struct: - switch (cabi) - { - case FFI_THISCALL: - case FFI_FASTCALL: - case FFI_STDCALL: - case FFI_MS_CDECL: - flags = X86_RET_STRUCTARG; - break; - default: - flags = X86_RET_STRUCTPOP; - break; - } - /* Allocate space for return value pointer. */ - bytes += FFI_ALIGN (sizeof(void*), FFI_SIZEOF_ARG); - } - break; - case FFI_TYPE_COMPLEX: - switch (cif->rtype->elements[0]->type) - { - case FFI_TYPE_DOUBLE: - case FFI_TYPE_LONGDOUBLE: - case FFI_TYPE_SINT64: - case FFI_TYPE_UINT64: - goto do_struct; - case FFI_TYPE_FLOAT: - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - flags = X86_RET_INT64; - break; - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - flags = X86_RET_INT32; - break; - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - flags = X86_RET_STRUCT_2B; - break; - default: - return FFI_BAD_TYPEDEF; - } - break; - default: - return FFI_BAD_TYPEDEF; - } - cif->flags = flags; - - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *t = cif->arg_types[i]; - - bytes = FFI_ALIGN (bytes, t->alignment); - bytes += FFI_ALIGN (t->size, FFI_SIZEOF_ARG); - } - cif->bytes = FFI_ALIGN (bytes, 16); - - return FFI_OK; -} - -static ffi_arg -extend_basic_type(void *arg, int type) -{ - switch (type) - { - case FFI_TYPE_SINT8: - return *(SINT8 *)arg; - case FFI_TYPE_UINT8: - return *(UINT8 *)arg; - case FFI_TYPE_SINT16: - return *(SINT16 *)arg; - case FFI_TYPE_UINT16: - return *(UINT16 *)arg; - - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT32: - case FFI_TYPE_POINTER: - case FFI_TYPE_FLOAT: - return *(UINT32 *)arg; - - default: - abort(); - } -} - -struct call_frame -{ - void *ebp; /* 0 */ - void *retaddr; /* 4 */ - void (*fn)(void); /* 8 */ - int flags; /* 12 */ - void *rvalue; /* 16 */ - unsigned regs[3]; /* 20-28 */ -}; - -struct abi_params -{ - int dir; /* parameter growth direction */ - int static_chain; /* the static chain register used by gcc */ - int nregs; /* number of register parameters */ - int regs[3]; -}; - -static const struct abi_params abi_params[FFI_LAST_ABI] = { - [FFI_SYSV] = { 1, R_ECX, 0 }, - [FFI_THISCALL] = { 1, R_EAX, 1, { R_ECX } }, - [FFI_FASTCALL] = { 1, R_EAX, 2, { R_ECX, R_EDX } }, - [FFI_STDCALL] = { 1, R_ECX, 0 }, - [FFI_PASCAL] = { -1, R_ECX, 0 }, - /* ??? No defined static chain; gcc does not support REGISTER. */ - [FFI_REGISTER] = { -1, R_ECX, 3, { R_EAX, R_EDX, R_ECX } }, - [FFI_MS_CDECL] = { 1, R_ECX, 0 } -}; - -#ifdef HAVE_FASTCALL - #ifdef _MSC_VER - #define FFI_DECLARE_FASTCALL __fastcall - #else - #define FFI_DECLARE_FASTCALL __declspec(fastcall) - #endif -#else - #define FFI_DECLARE_FASTCALL -#endif - -extern void FFI_DECLARE_FASTCALL ffi_call_i386(struct call_frame *, char *) FFI_HIDDEN; - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - size_t rsize, bytes; - struct call_frame *frame; - char *stack, *argp; - ffi_type **arg_types; - int flags, cabi, i, n, dir, narg_reg; - const struct abi_params *pabi; - - flags = cif->flags; - cabi = cif->abi; - pabi = &abi_params[cabi]; - dir = pabi->dir; - - rsize = 0; - if (rvalue == NULL) - { - switch (flags) - { - case X86_RET_FLOAT: - case X86_RET_DOUBLE: - case X86_RET_LDOUBLE: - case X86_RET_STRUCTPOP: - case X86_RET_STRUCTARG: - /* The float cases need to pop the 387 stack. - The struct cases need to pass a valid pointer to the callee. */ - rsize = cif->rtype->size; - break; - default: - /* We can pretend that the callee returns nothing. */ - flags = X86_RET_VOID; - break; - } - } - - bytes = cif->bytes; - stack = alloca(bytes + sizeof(*frame) + rsize); - argp = (dir < 0 ? stack + bytes : stack); - frame = (struct call_frame *)(stack + bytes); - if (rsize) - rvalue = frame + 1; - - frame->fn = fn; - frame->flags = flags; - frame->rvalue = rvalue; - frame->regs[pabi->static_chain] = (unsigned)closure; - - narg_reg = 0; - switch (flags) - { - case X86_RET_STRUCTARG: - /* The pointer is passed as the first argument. */ - if (pabi->nregs > 0) - { - frame->regs[pabi->regs[0]] = (unsigned)rvalue; - narg_reg = 1; - break; - } - /* fallthru */ - case X86_RET_STRUCTPOP: - *(void **)argp = rvalue; - argp += sizeof(void *); - break; - } - - arg_types = cif->arg_types; - for (i = 0, n = cif->nargs; i < n; i++) - { - ffi_type *ty = arg_types[i]; - void *valp = avalue[i]; - size_t z = ty->size; - int t = ty->type; - - if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) - { - ffi_arg val = extend_basic_type (valp, t); - - if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) - frame->regs[pabi->regs[narg_reg++]] = val; - else if (dir < 0) - { - argp -= 4; - *(ffi_arg *)argp = val; - } - else - { - *(ffi_arg *)argp = val; - argp += 4; - } - } - else - { - size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); - size_t align = FFI_SIZEOF_ARG; - - /* Issue 434: For thiscall and fastcall, if the paramter passed - as 64-bit integer or struct, all following integer paramters - will be passed on stack. */ - if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) - && (t == FFI_TYPE_SINT64 - || t == FFI_TYPE_UINT64 - || t == FFI_TYPE_STRUCT)) - narg_reg = 2; - - /* Alignment rules for arguments are quite complex. Vectors and - structures with 16 byte alignment get it. Note that long double - on Darwin does have 16 byte alignment, and does not get this - alignment if passed directly; a structure with a long double - inside, however, would get 16 byte alignment. Since libffi does - not support vectors, we need non concern ourselves with other - cases. */ - if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) - align = 16; - - if (dir < 0) - { - /* ??? These reverse argument ABIs are probably too old - to have cared about alignment. Someone should check. */ - argp -= za; - memcpy (argp, valp, z); - } - else - { - argp = (char *)FFI_ALIGN (argp, align); - memcpy (argp, valp, z); - argp += za; - } - } - } - FFI_ASSERT (dir > 0 || argp == stack); - - ffi_call_i386 (frame, stack); -} - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - -/** private members **/ - -void FFI_HIDDEN ffi_closure_i386(void); -void FFI_HIDDEN ffi_closure_STDCALL(void); -void FFI_HIDDEN ffi_closure_REGISTER(void); - -struct closure_frame -{ - unsigned rettemp[4]; /* 0 */ - unsigned regs[3]; /* 16-24 */ - ffi_cif *cif; /* 28 */ - void (*fun)(ffi_cif*,void*,void**,void*); /* 32 */ - void *user_data; /* 36 */ -}; - -int FFI_HIDDEN FFI_DECLARE_FASTCALL -ffi_closure_inner (struct closure_frame *frame, char *stack) -{ - ffi_cif *cif = frame->cif; - int cabi, i, n, flags, dir, narg_reg; - const struct abi_params *pabi; - ffi_type **arg_types; - char *argp; - void *rvalue; - void **avalue; - - cabi = cif->abi; - flags = cif->flags; - narg_reg = 0; - rvalue = frame->rettemp; - pabi = &abi_params[cabi]; - dir = pabi->dir; - argp = (dir < 0 ? stack + cif->bytes : stack); - - switch (flags) - { - case X86_RET_STRUCTARG: - if (pabi->nregs > 0) - { - rvalue = (void *)frame->regs[pabi->regs[0]]; - narg_reg = 1; - frame->rettemp[0] = (unsigned)rvalue; - break; - } - /* fallthru */ - case X86_RET_STRUCTPOP: - rvalue = *(void **)argp; - argp += sizeof(void *); - frame->rettemp[0] = (unsigned)rvalue; - break; - } - - n = cif->nargs; - avalue = alloca(sizeof(void *) * n); - - arg_types = cif->arg_types; - for (i = 0; i < n; ++i) - { - ffi_type *ty = arg_types[i]; - size_t z = ty->size; - int t = ty->type; - void *valp; - - if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT) - { - if (t != FFI_TYPE_FLOAT && narg_reg < pabi->nregs) - valp = &frame->regs[pabi->regs[narg_reg++]]; - else if (dir < 0) - { - argp -= 4; - valp = argp; - } - else - { - valp = argp; - argp += 4; - } - } - else - { - size_t za = FFI_ALIGN (z, FFI_SIZEOF_ARG); - size_t align = FFI_SIZEOF_ARG; - - /* See the comment in ffi_call_int. */ - if (t == FFI_TYPE_STRUCT && ty->alignment >= 16) - align = 16; - - /* Issue 434: For thiscall and fastcall, if the paramter passed - as 64-bit integer or struct, all following integer paramters - will be passed on stack. */ - if ((cabi == FFI_THISCALL || cabi == FFI_FASTCALL) - && (t == FFI_TYPE_SINT64 - || t == FFI_TYPE_UINT64 - || t == FFI_TYPE_STRUCT)) - narg_reg = 2; - - if (dir < 0) - { - /* ??? These reverse argument ABIs are probably too old - to have cared about alignment. Someone should check. */ - argp -= za; - valp = argp; - } - else - { - argp = (char *)FFI_ALIGN (argp, align); - valp = argp; - argp += za; - } - } - - avalue[i] = valp; - } - - frame->fun (cif, rvalue, avalue, frame->user_data); - - if (cabi == FFI_STDCALL) - return flags + (cif->bytes << X86_RET_POP_SHIFT); - else - return 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) -{ - char *tramp = closure->tramp; - void (*dest)(void); - int op = 0xb8; /* movl imm, %eax */ - - switch (cif->abi) - { - case FFI_SYSV: - case FFI_THISCALL: - case FFI_FASTCALL: - case FFI_MS_CDECL: - dest = ffi_closure_i386; - break; - case FFI_STDCALL: - case FFI_PASCAL: - dest = ffi_closure_STDCALL; - break; - case FFI_REGISTER: - dest = ffi_closure_REGISTER; - op = 0x68; /* pushl imm */ - default: - return FFI_BAD_ABI; - } - - /* movl or pushl immediate. */ - tramp[0] = op; - *(void **)(tramp + 1) = codeloc; - - /* jmp dest */ - tramp[5] = 0xe9; - *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -void FFI_HIDDEN ffi_go_closure_EAX(void); -void FFI_HIDDEN ffi_go_closure_ECX(void); -void FFI_HIDDEN ffi_go_closure_STDCALL(void); - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*,void*,void**,void*)) -{ - void (*dest)(void); - - switch (cif->abi) - { - case FFI_SYSV: - case FFI_MS_CDECL: - dest = ffi_go_closure_ECX; - break; - case FFI_THISCALL: - case FFI_FASTCALL: - dest = ffi_go_closure_EAX; - break; - case FFI_STDCALL: - case FFI_PASCAL: - dest = ffi_go_closure_STDCALL; - break; - case FFI_REGISTER: - default: - return FFI_BAD_ABI; - } - - closure->tramp = dest; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -/* ------- Native raw API support -------------------------------- */ - -#if !FFI_NO_RAW_API - -void FFI_HIDDEN ffi_closure_raw_SYSV(void); -void FFI_HIDDEN ffi_closure_raw_THISCALL(void); - -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) -{ - char *tramp = closure->tramp; - void (*dest)(void); - int i; - - /* 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--) - switch (cif->arg_types[i]->type) - { - case FFI_TYPE_STRUCT: - case FFI_TYPE_LONGDOUBLE: - return FFI_BAD_TYPEDEF; - } - - switch (cif->abi) - { - case FFI_THISCALL: - dest = ffi_closure_raw_THISCALL; - break; - case FFI_SYSV: - dest = ffi_closure_raw_SYSV; - break; - default: - return FFI_BAD_ABI; - } - - /* movl imm, %eax. */ - tramp[0] = 0xb8; - *(void **)(tramp + 1) = codeloc; - - /* jmp dest */ - tramp[5] = 0xe9; - *(unsigned *)(tramp + 6) = (unsigned)dest - ((unsigned)codeloc + 10); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -void -ffi_raw_call(ffi_cif *cif, void (*fn)(void), void *rvalue, ffi_raw *avalue) -{ - size_t rsize, bytes; - struct call_frame *frame; - char *stack, *argp; - ffi_type **arg_types; - int flags, cabi, i, n, narg_reg; - const struct abi_params *pabi; - - flags = cif->flags; - cabi = cif->abi; - pabi = &abi_params[cabi]; - - rsize = 0; - if (rvalue == NULL) - { - switch (flags) - { - case X86_RET_FLOAT: - case X86_RET_DOUBLE: - case X86_RET_LDOUBLE: - case X86_RET_STRUCTPOP: - case X86_RET_STRUCTARG: - /* The float cases need to pop the 387 stack. - The struct cases need to pass a valid pointer to the callee. */ - rsize = cif->rtype->size; - break; - default: - /* We can pretend that the callee returns nothing. */ - flags = X86_RET_VOID; - break; - } - } - - bytes = cif->bytes; - argp = stack = - (void *)((uintptr_t)alloca(bytes + sizeof(*frame) + rsize + 15) & ~16); - frame = (struct call_frame *)(stack + bytes); - if (rsize) - rvalue = frame + 1; - - frame->fn = fn; - frame->flags = flags; - frame->rvalue = rvalue; - - narg_reg = 0; - switch (flags) - { - case X86_RET_STRUCTARG: - /* The pointer is passed as the first argument. */ - if (pabi->nregs > 0) - { - frame->regs[pabi->regs[0]] = (unsigned)rvalue; - narg_reg = 1; - break; - } - /* fallthru */ - case X86_RET_STRUCTPOP: - *(void **)argp = rvalue; - argp += sizeof(void *); - bytes -= sizeof(void *); - break; - } - - arg_types = cif->arg_types; - for (i = 0, n = cif->nargs; narg_reg < pabi->nregs && i < n; i++) - { - ffi_type *ty = arg_types[i]; - size_t z = ty->size; - int t = ty->type; - - if (z <= FFI_SIZEOF_ARG && t != FFI_TYPE_STRUCT && t != FFI_TYPE_FLOAT) - { - ffi_arg val = extend_basic_type (avalue, t); - frame->regs[pabi->regs[narg_reg++]] = val; - z = FFI_SIZEOF_ARG; - } - else - { - memcpy (argp, avalue, z); - z = FFI_ALIGN (z, FFI_SIZEOF_ARG); - argp += z; - } - avalue += z; - bytes -= z; - } - if (i < n) - memcpy (argp, avalue, bytes); - - ffi_call_i386 (frame, stack); -} -#endif /* !FFI_NO_RAW_API */ -#endif /* !__x86_64__ */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c deleted file mode 100644 index 41d6acd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffi64.c +++ /dev/null @@ -1,884 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi64.c - Copyright (c) 2011, 2018 Anthony Green - Copyright (c) 2013 The Written Word, Inc. - 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 -#include -#include "internal64.h" - -#ifdef __x86_64__ - -#define MAX_GPR_REGS 6 -#define MAX_SSE_REGS 8 - -#if defined(__INTEL_COMPILER) -#include "xmmintrin.h" -#define UINT128 __m128 -#else -#if defined(__SUNPRO_C) -#include -#define UINT128 __m128i -#else -#define UINT128 __int128_t -#endif -#endif - -union big_int_union -{ - UINT32 i32; - UINT64 i64; - UINT128 i128; -}; - -struct register_args -{ - /* Registers for argument passing. */ - UINT64 gpr[MAX_GPR_REGS]; - union big_int_union sse[MAX_SSE_REGS]; - UINT64 rax; /* ssecount */ - UINT64 r10; /* static chain */ -}; - -extern void ffi_call_unix64 (void *args, unsigned long bytes, unsigned flags, - void *raddr, void (*fnaddr)(void)) FFI_HIDDEN; - -/* 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 size_t -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: - do_integer: - { - size_t 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_INTEGER_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; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - classes[0] = X86_64_X87_CLASS; - classes[1] = X86_64_X87UP_CLASS; - return 2; -#endif - case FFI_TYPE_STRUCT: - { - const size_t UNITS_PER_WORD = 8; - size_t words = (type->size + UNITS_PER_WORD - 1) / UNITS_PER_WORD; - ffi_type **ptr; - unsigned 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) - { - case FFI_TYPE_VOID: - classes[0] = X86_64_NO_CLASS; - return 1; - } - - /* Merge the fields of structure. */ - for (ptr = type->elements; *ptr != NULL; ptr++) - { - size_t num; - - byte_offset = FFI_ALIGN (byte_offset, (*ptr)->alignment); - - num = classify_argument (*ptr, subclasses, byte_offset % 8); - if (num == 0) - return 0; - for (i = 0; i < num; i++) - { - size_t 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; - } - case FFI_TYPE_COMPLEX: - { - ffi_type *inner = type->elements[0]; - switch (inner->type) - { - case FFI_TYPE_INT: - 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: - goto do_integer; - - case FFI_TYPE_FLOAT: - classes[0] = X86_64_SSE_CLASS; - if (byte_offset % 8) - { - classes[1] = X86_64_SSESF_CLASS; - return 2; - } - return 1; - case FFI_TYPE_DOUBLE: - classes[0] = classes[1] = X86_64_SSEDF_CLASS; - return 2; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - classes[0] = X86_64_COMPLEX_X87_CLASS; - return 1; -#endif - } - } - } - abort(); -} - -/* 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 size_t -examine_argument (ffi_type *type, enum x86_64_reg_class classes[MAX_CLASSES], - _Bool in_return, int *pngpr, int *pnsse) -{ - size_t n; - unsigned int i; - int 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. */ - -#ifndef __ILP32__ -extern ffi_status -ffi_prep_cif_machdep_efi64(ffi_cif *cif); -#endif - -ffi_status -ffi_prep_cif_machdep (ffi_cif *cif) -{ - int gprcount, ssecount, i, avn, ngpr, nsse; - unsigned flags; - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t bytes, n, rtype_size; - ffi_type *rtype; - -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - return ffi_prep_cif_machdep_efi64(cif); -#endif - if (cif->abi != FFI_UNIX64) - return FFI_BAD_ABI; - - gprcount = ssecount = 0; - - rtype = cif->rtype; - rtype_size = rtype->size; - switch (rtype->type) - { - case FFI_TYPE_VOID: - flags = UNIX64_RET_VOID; - break; - case FFI_TYPE_UINT8: - flags = UNIX64_RET_UINT8; - break; - case FFI_TYPE_SINT8: - flags = UNIX64_RET_SINT8; - break; - case FFI_TYPE_UINT16: - flags = UNIX64_RET_UINT16; - break; - case FFI_TYPE_SINT16: - flags = UNIX64_RET_SINT16; - break; - case FFI_TYPE_UINT32: - flags = UNIX64_RET_UINT32; - break; - case FFI_TYPE_INT: - case FFI_TYPE_SINT32: - flags = UNIX64_RET_SINT32; - break; - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags = UNIX64_RET_INT64; - break; - case FFI_TYPE_POINTER: - flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); - break; - case FFI_TYPE_FLOAT: - flags = UNIX64_RET_XMM32; - break; - case FFI_TYPE_DOUBLE: - flags = UNIX64_RET_XMM64; - break; - case FFI_TYPE_LONGDOUBLE: - flags = UNIX64_RET_X87; - break; - case FFI_TYPE_STRUCT: - 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 = UNIX64_RET_VOID | UNIX64_FLAG_RET_IN_MEM; - } - else - { - _Bool sse0 = SSE_CLASS_P (classes[0]); - - if (rtype_size == 4 && sse0) - flags = UNIX64_RET_XMM32; - else if (rtype_size == 8) - flags = sse0 ? UNIX64_RET_XMM64 : UNIX64_RET_INT64; - else - { - _Bool sse1 = n == 2 && SSE_CLASS_P (classes[1]); - if (sse0 && sse1) - flags = UNIX64_RET_ST_XMM0_XMM1; - else if (sse0) - flags = UNIX64_RET_ST_XMM0_RAX; - else if (sse1) - flags = UNIX64_RET_ST_RAX_XMM0; - else - flags = UNIX64_RET_ST_RAX_RDX; - flags |= rtype_size << UNIX64_SIZE_SHIFT; - } - } - break; - case FFI_TYPE_COMPLEX: - switch (rtype->elements[0]->type) - { - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT16: - case FFI_TYPE_SINT16: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - flags = UNIX64_RET_ST_RAX_RDX | ((unsigned) rtype_size << UNIX64_SIZE_SHIFT); - break; - case FFI_TYPE_FLOAT: - flags = UNIX64_RET_XMM64; - break; - case FFI_TYPE_DOUBLE: - flags = UNIX64_RET_ST_XMM0_XMM1 | (16 << UNIX64_SIZE_SHIFT); - break; -#if FFI_TYPE_LONGDOUBLE != FFI_TYPE_DOUBLE - case FFI_TYPE_LONGDOUBLE: - flags = UNIX64_RET_X87_2; - break; -#endif - default: - return FFI_BAD_TYPEDEF; - } - break; - default: - return FFI_BAD_TYPEDEF; - } - - /* 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 = FFI_ALIGN (bytes, align); - bytes += cif->arg_types[i]->size; - } - else - { - gprcount += ngpr; - ssecount += nsse; - } - } - if (ssecount) - flags |= UNIX64_FLAG_XMM_ARGS; - - cif->flags = flags; - cif->bytes = (unsigned) FFI_ALIGN (bytes, 8); - - return FFI_OK; -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - enum x86_64_reg_class classes[MAX_CLASSES]; - char *stack, *argp; - ffi_type **arg_types; - int gprcount, ssecount, ngpr, nsse, i, avn, flags; - 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. Otherwise we can ignore it. */ - flags = cif->flags; - if (rvalue == NULL) - { - if (flags & UNIX64_FLAG_RET_IN_MEM) - rvalue = alloca (cif->rtype->size); - else - flags = UNIX64_RET_VOID; - } - - /* 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); - - reg_args->r10 = (uintptr_t) closure; - - gprcount = ssecount = 0; - - /* If the return value is passed in memory, add the pointer as the - first integer argument. */ - if (flags & UNIX64_FLAG_RET_IN_MEM) - reg_args->gpr[gprcount++] = (unsigned long) rvalue; - - avn = cif->nargs; - arg_types = cif->arg_types; - - for (i = 0; i < avn; ++i) - { - size_t n, size = arg_types[i]->size; - - 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 *) FFI_ALIGN (argp, align); - memcpy (argp, avalue[i], size); - argp += size; - } - else - { - /* The argument is passed entirely in registers. */ - char *a = (char *) avalue[i]; - unsigned int j; - - for (j = 0; j < n; j++, a += 8, size -= 8) - { - switch (classes[j]) - { - case X86_64_NO_CLASS: - case X86_64_SSEUP_CLASS: - break; - case X86_64_INTEGER_CLASS: - case X86_64_INTEGERSI_CLASS: - /* Sign-extend integer arguments passed in general - purpose registers, to cope with the fact that - LLVM incorrectly assumes that this will be done - (the x86-64 PS ABI does not specify this). */ - switch (arg_types[i]->type) - { - case FFI_TYPE_SINT8: - reg_args->gpr[gprcount] = (SINT64) *((SINT8 *) a); - break; - case FFI_TYPE_SINT16: - reg_args->gpr[gprcount] = (SINT64) *((SINT16 *) a); - break; - case FFI_TYPE_SINT32: - reg_args->gpr[gprcount] = (SINT64) *((SINT32 *) a); - break; - default: - reg_args->gpr[gprcount] = 0; - memcpy (®_args->gpr[gprcount], a, size); - } - gprcount++; - break; - case X86_64_SSE_CLASS: - case X86_64_SSEDF_CLASS: - memcpy (®_args->sse[ssecount++].i64, a, sizeof(UINT64)); - break; - case X86_64_SSESF_CLASS: - memcpy (®_args->sse[ssecount++].i32, a, sizeof(UINT32)); - break; - default: - abort(); - } - } - } - } - reg_args->rax = ssecount; - - ffi_call_unix64 (stack, cif->bytes + sizeof (struct register_args), - flags, rvalue, fn); -} - -#ifndef __ILP32__ -extern void -ffi_call_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue); -#endif - -void -ffi_call (ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - { - ffi_call_efi64(cif, fn, rvalue, avalue); - return; - } -#endif - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -#ifndef __ILP32__ -extern void -ffi_call_go_efi64(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure); -#endif - -void -ffi_call_go (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - { - ffi_call_go_efi64(cif, fn, rvalue, avalue, closure); - return; - } -#endif - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - - -extern void ffi_closure_unix64(void) FFI_HIDDEN; -extern void ffi_closure_unix64_sse(void) FFI_HIDDEN; - -#ifndef __ILP32__ -extern ffi_status -ffi_prep_closure_loc_efi64(ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc); -#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) -{ - static const unsigned char trampoline[16] = { - /* leaq -0x7(%rip),%r10 # 0x0 */ - 0x4c, 0x8d, 0x15, 0xf9, 0xff, 0xff, 0xff, - /* jmpq *0x3(%rip) # 0x10 */ - 0xff, 0x25, 0x03, 0x00, 0x00, 0x00, - /* nopl (%rax) */ - 0x0f, 0x1f, 0x00 - }; - void (*dest)(void); - char *tramp = closure->tramp; - -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - return ffi_prep_closure_loc_efi64(closure, cif, fun, user_data, codeloc); -#endif - if (cif->abi != FFI_UNIX64) - return FFI_BAD_ABI; - - if (cif->flags & UNIX64_FLAG_XMM_ARGS) - dest = ffi_closure_unix64_sse; - else - dest = ffi_closure_unix64; - - memcpy (tramp, trampoline, sizeof(trampoline)); - *(UINT64 *)(tramp + 16) = (uintptr_t)dest; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -int FFI_HIDDEN -ffi_closure_unix64_inner(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *rvalue, - struct register_args *reg_args, - char *argp) -{ - void **avalue; - ffi_type **arg_types; - long i, avn; - int gprcount, ssecount, ngpr, nsse; - int flags; - - avn = cif->nargs; - flags = cif->flags; - avalue = alloca(avn * sizeof(void *)); - gprcount = ssecount = 0; - - if (flags & UNIX64_FLAG_RET_IN_MEM) - { - /* On return, %rax will contain the address that was passed - by the caller in %rdi. */ - void *r = (void *)(uintptr_t)reg_args->gpr[gprcount++]; - *(void **)rvalue = r; - rvalue = r; - flags = (sizeof(void *) == 4 ? UNIX64_RET_UINT32 : UNIX64_RET_INT64); - } - - arg_types = cif->arg_types; - for (i = 0; i < avn; ++i) - { - enum x86_64_reg_class classes[MAX_CLASSES]; - size_t 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 *) FFI_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); - unsigned 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. */ - fun (cif, rvalue, avalue, user_data); - - /* Tell assembly how to perform return type promotions. */ - return flags; -} - -extern void ffi_go_closure_unix64(void) FFI_HIDDEN; -extern void ffi_go_closure_unix64_sse(void) FFI_HIDDEN; - -#ifndef __ILP32__ -extern ffi_status -ffi_prep_go_closure_efi64(ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)); -#endif - -ffi_status -ffi_prep_go_closure (ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ -#ifndef __ILP32__ - if (cif->abi == FFI_EFI64 || cif->abi == FFI_GNUW64) - return ffi_prep_go_closure_efi64(closure, cif, fun); -#endif - if (cif->abi != FFI_UNIX64) - return FFI_BAD_ABI; - - closure->tramp = (cif->flags & UNIX64_FLAG_XMM_ARGS - ? ffi_go_closure_unix64_sse - : ffi_go_closure_unix64); - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -#endif /* __x86_64__ */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffitarget.h deleted file mode 100644 index 85ccedf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffitarget.h +++ /dev/null @@ -1,147 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2012, 2014, 2018 Anthony Green - 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 - -#ifndef LIBFFI_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -/* ---- 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 - -#define FFI_TARGET_SPECIFIC_STACK_SPACE_ALLOCATION -#ifndef _MSC_VER -#define FFI_TARGET_HAS_COMPLEX_TYPE -#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 -#if defined __x86_64__ && defined __ILP32__ -#define FFI_SIZEOF_ARG 8 -#define FFI_SIZEOF_JAVA_RAW 4 -typedef unsigned long long ffi_arg; -typedef long long ffi_sarg; -#else -typedef unsigned long ffi_arg; -typedef signed long ffi_sarg; -#endif -#endif - -typedef enum ffi_abi { -#if defined(X86_WIN64) - FFI_FIRST_ABI = 0, - FFI_WIN64, /* sizeof(long double) == 8 - microsoft compilers */ - FFI_GNUW64, /* sizeof(long double) == 16 - GNU compilers */ - FFI_LAST_ABI, -#ifdef __GNUC__ - FFI_DEFAULT_ABI = FFI_GNUW64 -#else - FFI_DEFAULT_ABI = FFI_WIN64 -#endif - -#elif defined(X86_64) || (defined (__x86_64__) && defined (X86_DARWIN)) - FFI_FIRST_ABI = 1, - FFI_UNIX64, - FFI_WIN64, - FFI_EFI64 = FFI_WIN64, - FFI_GNUW64, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_UNIX64 - -#elif defined(X86_WIN32) - FFI_FIRST_ABI = 0, - FFI_SYSV = 1, - FFI_STDCALL = 2, - FFI_THISCALL = 3, - FFI_FASTCALL = 4, - FFI_MS_CDECL = 5, - FFI_PASCAL = 6, - FFI_REGISTER = 7, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_MS_CDECL -#else - FFI_FIRST_ABI = 0, - FFI_SYSV = 1, - FFI_THISCALL = 3, - FFI_FASTCALL = 4, - FFI_STDCALL = 5, - FFI_PASCAL = 6, - FFI_REGISTER = 7, - FFI_MS_CDECL = 8, - FFI_LAST_ABI, - FFI_DEFAULT_ABI = FFI_SYSV -#endif -} ffi_abi; -#endif - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_GO_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) -#define FFI_TYPE_MS_STRUCT (FFI_TYPE_LAST + 4) - -#if defined (X86_64) || defined(X86_WIN64) \ - || (defined (__x86_64__) && defined (X86_DARWIN)) -# define FFI_TRAMPOLINE_SIZE 24 -# define FFI_NATIVE_RAW_API 0 -#else -# define FFI_TRAMPOLINE_SIZE 12 -# define FFI_NATIVE_RAW_API 1 /* x86 has native raw api support */ -#endif - -#endif - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c deleted file mode 100644 index f787525..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/ffiw64.c +++ /dev/null @@ -1,308 +0,0 @@ -/* ----------------------------------------------------------------------- - ffiw64.c - Copyright (c) 2018 Anthony Green - Copyright (c) 2014 Red Hat, Inc. - - x86 win64 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_WIN64 -#define EFI64(name) name -#else -#define EFI64(name) name##_efi64 -#endif - -struct win64_call_frame -{ - UINT64 rbp; /* 0 */ - UINT64 retaddr; /* 8 */ - UINT64 fn; /* 16 */ - UINT64 flags; /* 24 */ - UINT64 rvalue; /* 32 */ -}; - -extern void ffi_call_win64 (void *stack, struct win64_call_frame *, - void *closure) FFI_HIDDEN; - -ffi_status -EFI64(ffi_prep_cif_machdep)(ffi_cif *cif) -{ - int flags, n; - - switch (cif->abi) - { - case FFI_WIN64: - case FFI_GNUW64: - break; - default: - return FFI_BAD_ABI; - } - - flags = cif->rtype->type; - switch (flags) - { - default: - break; - case FFI_TYPE_LONGDOUBLE: - /* GCC returns long double values by reference, like a struct */ - if (cif->abi == FFI_GNUW64) - flags = FFI_TYPE_STRUCT; - break; - case FFI_TYPE_COMPLEX: - flags = FFI_TYPE_STRUCT; - /* FALLTHRU */ - case FFI_TYPE_STRUCT: - switch (cif->rtype->size) - { - case 8: - flags = FFI_TYPE_UINT64; - break; - case 4: - flags = FFI_TYPE_SMALL_STRUCT_4B; - break; - case 2: - flags = FFI_TYPE_SMALL_STRUCT_2B; - break; - case 1: - flags = FFI_TYPE_SMALL_STRUCT_1B; - break; - } - break; - } - cif->flags = flags; - - /* Each argument either fits in a register, an 8 byte slot, or is - passed by reference with the pointer in the 8 byte slot. */ - n = cif->nargs; - n += (flags == FFI_TYPE_STRUCT); - if (n < 4) - n = 4; - cif->bytes = n * 8; - - return FFI_OK; -} - -static void -ffi_call_int (ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - int i, j, n, flags; - UINT64 *stack; - size_t rsize; - struct win64_call_frame *frame; - - FFI_ASSERT(cif->abi == FFI_GNUW64 || cif->abi == FFI_WIN64); - - flags = cif->flags; - rsize = 0; - - /* If we have no return value for a structure, we need to create one. - Otherwise we can ignore the return type entirely. */ - if (rvalue == NULL) - { - if (flags == FFI_TYPE_STRUCT) - rsize = cif->rtype->size; - else - flags = FFI_TYPE_VOID; - } - - stack = alloca(cif->bytes + sizeof(struct win64_call_frame) + rsize); - frame = (struct win64_call_frame *)((char *)stack + cif->bytes); - if (rsize) - rvalue = frame + 1; - - frame->fn = (uintptr_t)fn; - frame->flags = flags; - frame->rvalue = (uintptr_t)rvalue; - - j = 0; - if (flags == FFI_TYPE_STRUCT) - { - stack[0] = (uintptr_t)rvalue; - j = 1; - } - - for (i = 0, n = cif->nargs; i < n; ++i, ++j) - { - switch (cif->arg_types[i]->size) - { - case 8: - stack[j] = *(UINT64 *)avalue[i]; - break; - case 4: - stack[j] = *(UINT32 *)avalue[i]; - break; - case 2: - stack[j] = *(UINT16 *)avalue[i]; - break; - case 1: - stack[j] = *(UINT8 *)avalue[i]; - break; - default: - stack[j] = (uintptr_t)avalue[i]; - break; - } - } - - ffi_call_win64 (stack, frame, closure); -} - -void -EFI64(ffi_call)(ffi_cif *cif, void (*fn)(void), void *rvalue, void **avalue) -{ - ffi_call_int (cif, fn, rvalue, avalue, NULL); -} - -void -EFI64(ffi_call_go)(ffi_cif *cif, void (*fn)(void), void *rvalue, - void **avalue, void *closure) -{ - ffi_call_int (cif, fn, rvalue, avalue, closure); -} - - -extern void ffi_closure_win64(void) FFI_HIDDEN; -extern void ffi_go_closure_win64(void) FFI_HIDDEN; - -ffi_status -EFI64(ffi_prep_closure_loc)(ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - static const unsigned char trampoline[16] = { - /* leaq -0x7(%rip),%r10 # 0x0 */ - 0x4c, 0x8d, 0x15, 0xf9, 0xff, 0xff, 0xff, - /* jmpq *0x3(%rip) # 0x10 */ - 0xff, 0x25, 0x03, 0x00, 0x00, 0x00, - /* nopl (%rax) */ - 0x0f, 0x1f, 0x00 - }; - char *tramp = closure->tramp; - - switch (cif->abi) - { - case FFI_WIN64: - case FFI_GNUW64: - break; - default: - return FFI_BAD_ABI; - } - - memcpy (tramp, trampoline, sizeof(trampoline)); - *(UINT64 *)(tramp + 16) = (uintptr_t)ffi_closure_win64; - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - - return FFI_OK; -} - -ffi_status -EFI64(ffi_prep_go_closure)(ffi_go_closure* closure, ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*)) -{ - switch (cif->abi) - { - case FFI_WIN64: - case FFI_GNUW64: - break; - default: - return FFI_BAD_ABI; - } - - closure->tramp = ffi_go_closure_win64; - closure->cif = cif; - closure->fun = fun; - - return FFI_OK; -} - -struct win64_closure_frame -{ - UINT64 rvalue[2]; - UINT64 fargs[4]; - UINT64 retaddr; - UINT64 args[]; -}; - -/* Force the inner function to use the MS ABI. When compiling on win64 - this is a nop. When compiling on unix, this simplifies the assembly, - and places the burden of saving the extra call-saved registers on - the compiler. */ -int FFI_HIDDEN __attribute__((ms_abi)) -ffi_closure_win64_inner(ffi_cif *cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - struct win64_closure_frame *frame) -{ - void **avalue; - void *rvalue; - int i, n, nreg, flags; - - avalue = alloca(cif->nargs * sizeof(void *)); - rvalue = frame->rvalue; - nreg = 0; - - /* When returning a structure, the address is in the first argument. - We must also be prepared to return the same address in eax, so - install that address in the frame and pretend we return a pointer. */ - flags = cif->flags; - if (flags == FFI_TYPE_STRUCT) - { - rvalue = (void *)(uintptr_t)frame->args[0]; - frame->rvalue[0] = frame->args[0]; - nreg = 1; - } - - for (i = 0, n = cif->nargs; i < n; ++i, ++nreg) - { - size_t size = cif->arg_types[i]->size; - size_t type = cif->arg_types[i]->type; - void *a; - - if (type == FFI_TYPE_DOUBLE || type == FFI_TYPE_FLOAT) - { - if (nreg < 4) - a = &frame->fargs[nreg]; - else - a = &frame->args[nreg]; - } - else if (size == 1 || size == 2 || size == 4 || size == 8) - a = &frame->args[nreg]; - else - a = (void *)(uintptr_t)frame->args[nreg]; - - avalue[i] = a; - } - - /* Invoke the closure. */ - fun (cif, rvalue, avalue, user_data); - return flags; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal.h deleted file mode 100644 index 09771ba..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal.h +++ /dev/null @@ -1,29 +0,0 @@ -#define X86_RET_FLOAT 0 -#define X86_RET_DOUBLE 1 -#define X86_RET_LDOUBLE 2 -#define X86_RET_SINT8 3 -#define X86_RET_SINT16 4 -#define X86_RET_UINT8 5 -#define X86_RET_UINT16 6 -#define X86_RET_INT64 7 -#define X86_RET_INT32 8 -#define X86_RET_VOID 9 -#define X86_RET_STRUCTPOP 10 -#define X86_RET_STRUCTARG 11 -#define X86_RET_STRUCT_1B 12 -#define X86_RET_STRUCT_2B 13 -#define X86_RET_UNUSED14 14 -#define X86_RET_UNUSED15 15 - -#define X86_RET_TYPE_MASK 15 -#define X86_RET_POP_SHIFT 4 - -#define R_EAX 0 -#define R_EDX 1 -#define R_ECX 2 - -#ifdef __PCC__ -# define HAVE_FASTCALL 0 -#else -# define HAVE_FASTCALL 1 -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal64.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal64.h deleted file mode 100644 index 512e955..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/internal64.h +++ /dev/null @@ -1,22 +0,0 @@ -#define UNIX64_RET_VOID 0 -#define UNIX64_RET_UINT8 1 -#define UNIX64_RET_UINT16 2 -#define UNIX64_RET_UINT32 3 -#define UNIX64_RET_SINT8 4 -#define UNIX64_RET_SINT16 5 -#define UNIX64_RET_SINT32 6 -#define UNIX64_RET_INT64 7 -#define UNIX64_RET_XMM32 8 -#define UNIX64_RET_XMM64 9 -#define UNIX64_RET_X87 10 -#define UNIX64_RET_X87_2 11 -#define UNIX64_RET_ST_XMM0_RAX 12 -#define UNIX64_RET_ST_RAX_XMM0 13 -#define UNIX64_RET_ST_XMM0_XMM1 14 -#define UNIX64_RET_ST_RAX_RDX 15 - -#define UNIX64_RET_LAST 15 - -#define UNIX64_FLAG_RET_IN_MEM (1 << 10) -#define UNIX64_FLAG_XMM_ARGS (1 << 11) -#define UNIX64_SIZE_SHIFT 12 diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/sysv.S deleted file mode 100644 index 27379a4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/sysv.S +++ /dev/null @@ -1,1043 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2017 Anthony Green - - Copyright (c) 2013 The Written Word, Inc. - - 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__ -#ifndef _MSC_VER - -#define LIBFFI_ASM -#include -#include -#include "internal.h" - -#define C2(X, Y) X ## Y -#define C1(X, Y) C2(X, Y) -#ifdef __USER_LABEL_PREFIX__ -# define C(X) C1(__USER_LABEL_PREFIX__, X) -#else -# define C(X) X -#endif - -#ifdef X86_DARWIN -# define L(X) C1(L, X) -#else -# define L(X) C1(.L, X) -#endif - -#ifdef __ELF__ -# define ENDF(X) .type X,@function; .size X, . - X -#else -# define ENDF(X) -#endif - -/* Handle win32 fastcall name mangling. */ -#ifdef X86_WIN32 -# define ffi_call_i386 @ffi_call_i386@8 -# define ffi_closure_inner @ffi_closure_inner@8 -#else -# define ffi_call_i386 C(ffi_call_i386) -# define ffi_closure_inner C(ffi_closure_inner) -#endif - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) .balign 8 -#else -# define E(BASE, X) .balign 8; .org BASE + X * 8 -#endif - - .text - .balign 16 - .globl ffi_call_i386 - FFI_HIDDEN(ffi_call_i386) - -/* This is declared as - - void ffi_call_i386(struct call_frame *frame, char *argp) - __attribute__((fastcall)); - - Thus the arguments are present in - - ecx: frame - edx: argp -*/ - -ffi_call_i386: -L(UW0): - # cfi_startproc -#if !HAVE_FASTCALL - movl 4(%esp), %ecx - movl 8(%esp), %edx -#endif - movl (%esp), %eax /* move the return address */ - movl %ebp, (%ecx) /* store %ebp into local frame */ - movl %eax, 4(%ecx) /* store retaddr into local frame */ - - /* New stack frame based off ebp. 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-4, so from the - perspective of the unwind info, it hasn't moved. */ - movl %ecx, %ebp -L(UW1): - # cfi_def_cfa(%ebp, 8) - # cfi_rel_offset(%ebp, 0) - - movl %edx, %esp /* set outgoing argument stack */ - movl 20+R_EAX*4(%ebp), %eax /* set register arguments */ - movl 20+R_EDX*4(%ebp), %edx - movl 20+R_ECX*4(%ebp), %ecx - - call *8(%ebp) - - movl 12(%ebp), %ecx /* load return type code */ - movl %ebx, 8(%ebp) /* preserve %ebx */ -L(UW2): - # cfi_rel_offset(%ebx, 8) - - andl $X86_RET_TYPE_MASK, %ecx -#ifdef __PIC__ - call C(__x86.get_pc_thunk.bx) -L(pc1): - leal L(store_table)-L(pc1)(%ebx, %ecx, 8), %ebx -#else - leal L(store_table)(,%ecx, 8), %ebx -#endif - movl 16(%ebp), %ecx /* load result address */ - jmp *%ebx - - .balign 8 -L(store_table): -E(L(store_table), X86_RET_FLOAT) - fstps (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_DOUBLE) - fstpl (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_LDOUBLE) - fstpt (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_SINT8) - movsbl %al, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_SINT16) - movswl %ax, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_UINT8) - movzbl %al, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_UINT16) - movzwl %ax, %eax - mov %eax, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_INT64) - movl %edx, 4(%ecx) - /* fallthru */ -E(L(store_table), X86_RET_INT32) - movl %eax, (%ecx) - /* fallthru */ -E(L(store_table), X86_RET_VOID) -L(e1): - movl 8(%ebp), %ebx - movl %ebp, %esp - popl %ebp -L(UW3): - # cfi_remember_state - # cfi_def_cfa(%esp, 4) - # cfi_restore(%ebx) - # cfi_restore(%ebp) - ret -L(UW4): - # cfi_restore_state - -E(L(store_table), X86_RET_STRUCTPOP) - jmp L(e1) -E(L(store_table), X86_RET_STRUCTARG) - jmp L(e1) -E(L(store_table), X86_RET_STRUCT_1B) - movb %al, (%ecx) - jmp L(e1) -E(L(store_table), X86_RET_STRUCT_2B) - movw %ax, (%ecx) - jmp L(e1) - - /* Fill out the table so that bad values are predictable. */ -E(L(store_table), X86_RET_UNUSED14) - ud2 -E(L(store_table), X86_RET_UNUSED15) - ud2 - -L(UW5): - # cfi_endproc -ENDF(ffi_call_i386) - -/* The inner helper is declared as - - void ffi_closure_inner(struct closure_frame *frame, char *argp) - __attribute_((fastcall)) - - Thus the arguments are placed in - - ecx: frame - edx: argp -*/ - -/* Macros to help setting up the closure_data structure. */ - -#if HAVE_FASTCALL -# define closure_FS (40 + 4) -# define closure_CF 0 -#else -# define closure_FS (8 + 40 + 12) -# define closure_CF 8 -#endif - -#define FFI_CLOSURE_SAVE_REGS \ - movl %eax, closure_CF+16+R_EAX*4(%esp); \ - movl %edx, closure_CF+16+R_EDX*4(%esp); \ - movl %ecx, closure_CF+16+R_ECX*4(%esp) - -#define FFI_CLOSURE_COPY_TRAMP_DATA \ - movl FFI_TRAMPOLINE_SIZE(%eax), %edx; /* copy cif */ \ - movl FFI_TRAMPOLINE_SIZE+4(%eax), %ecx; /* copy fun */ \ - movl FFI_TRAMPOLINE_SIZE+8(%eax), %eax; /* copy user_data */ \ - movl %edx, closure_CF+28(%esp); \ - movl %ecx, closure_CF+32(%esp); \ - movl %eax, closure_CF+36(%esp) - -#if HAVE_FASTCALL -# define FFI_CLOSURE_PREP_CALL \ - movl %esp, %ecx; /* load closure_data */ \ - leal closure_FS+4(%esp), %edx; /* load incoming stack */ -#else -# define FFI_CLOSURE_PREP_CALL \ - leal closure_CF(%esp), %ecx; /* load closure_data */ \ - leal closure_FS+4(%esp), %edx; /* load incoming stack */ \ - movl %ecx, (%esp); \ - movl %edx, 4(%esp) -#endif - -#define FFI_CLOSURE_CALL_INNER(UWN) \ - call ffi_closure_inner - -#define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ - andl $X86_RET_TYPE_MASK, %eax; \ - leal L(C1(load_table,N))(, %eax, 8), %edx; \ - movl closure_CF(%esp), %eax; /* optimiztic load */ \ - jmp *%edx - -#ifdef __PIC__ -# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE -# undef FFI_CLOSURE_MASK_AND_JUMP -# define FFI_CLOSURE_MASK_AND_JUMP(N, UW) \ - andl $X86_RET_TYPE_MASK, %eax; \ - call C(__x86.get_pc_thunk.dx); \ -L(C1(pc,N)): \ - leal L(C1(load_table,N))-L(C1(pc,N))(%edx, %eax, 8), %edx; \ - movl closure_CF(%esp), %eax; /* optimiztic load */ \ - jmp *%edx -# else -# define FFI_CLOSURE_CALL_INNER_SAVE_EBX -# undef FFI_CLOSURE_CALL_INNER -# define FFI_CLOSURE_CALL_INNER(UWN) \ - movl %ebx, 40(%esp); /* save ebx */ \ -L(C1(UW,UWN)): \ - /* cfi_rel_offset(%ebx, 40); */ \ - call C(__x86.get_pc_thunk.bx); /* load got register */ \ - addl $C(_GLOBAL_OFFSET_TABLE_), %ebx; \ - call ffi_closure_inner@PLT -# undef FFI_CLOSURE_MASK_AND_JUMP -# define FFI_CLOSURE_MASK_AND_JUMP(N, UWN) \ - andl $X86_RET_TYPE_MASK, %eax; \ - leal L(C1(load_table,N))@GOTOFF(%ebx, %eax, 8), %edx; \ - movl 40(%esp), %ebx; /* restore ebx */ \ -L(C1(UW,UWN)): \ - /* cfi_restore(%ebx); */ \ - movl closure_CF(%esp), %eax; /* optimiztic load */ \ - jmp *%edx -# endif /* DARWIN || HIDDEN */ -#endif /* __PIC__ */ - - .balign 16 - .globl C(ffi_go_closure_EAX) - FFI_HIDDEN(C(ffi_go_closure_EAX)) -C(ffi_go_closure_EAX): -L(UW6): - # cfi_startproc - subl $closure_FS, %esp -L(UW7): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl 4(%eax), %edx /* copy cif */ - movl 8(%eax), %ecx /* copy fun */ - movl %edx, closure_CF+28(%esp) - movl %ecx, closure_CF+32(%esp) - movl %eax, closure_CF+36(%esp) /* closure is user_data */ - jmp L(do_closure_i386) -L(UW8): - # cfi_endproc -ENDF(C(ffi_go_closure_EAX)) - - .balign 16 - .globl C(ffi_go_closure_ECX) - FFI_HIDDEN(C(ffi_go_closure_ECX)) -C(ffi_go_closure_ECX): -L(UW9): - # cfi_startproc - subl $closure_FS, %esp -L(UW10): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl 4(%ecx), %edx /* copy cif */ - movl 8(%ecx), %eax /* copy fun */ - movl %edx, closure_CF+28(%esp) - movl %eax, closure_CF+32(%esp) - movl %ecx, closure_CF+36(%esp) /* closure is user_data */ - jmp L(do_closure_i386) -L(UW11): - # cfi_endproc -ENDF(C(ffi_go_closure_ECX)) - -/* The closure entry points are reached from the ffi_closure trampoline. - On entry, %eax contains the address of the ffi_closure. */ - - .balign 16 - .globl C(ffi_closure_i386) - FFI_HIDDEN(C(ffi_closure_i386)) - -C(ffi_closure_i386): -L(UW12): - # cfi_startproc - subl $closure_FS, %esp -L(UW13): - # cfi_def_cfa_offset(closure_FS + 4) - - FFI_CLOSURE_SAVE_REGS - FFI_CLOSURE_COPY_TRAMP_DATA - - /* Entry point from preceeding Go closures. */ -L(do_closure_i386): - - FFI_CLOSURE_PREP_CALL - FFI_CLOSURE_CALL_INNER(14) - FFI_CLOSURE_MASK_AND_JUMP(2, 15) - - .balign 8 -L(load_table2): -E(L(load_table2), X86_RET_FLOAT) - flds closure_CF(%esp) - jmp L(e2) -E(L(load_table2), X86_RET_DOUBLE) - fldl closure_CF(%esp) - jmp L(e2) -E(L(load_table2), X86_RET_LDOUBLE) - fldt closure_CF(%esp) - jmp L(e2) -E(L(load_table2), X86_RET_SINT8) - movsbl %al, %eax - jmp L(e2) -E(L(load_table2), X86_RET_SINT16) - movswl %ax, %eax - jmp L(e2) -E(L(load_table2), X86_RET_UINT8) - movzbl %al, %eax - jmp L(e2) -E(L(load_table2), X86_RET_UINT16) - movzwl %ax, %eax - jmp L(e2) -E(L(load_table2), X86_RET_INT64) - movl closure_CF+4(%esp), %edx - jmp L(e2) -E(L(load_table2), X86_RET_INT32) - nop - /* fallthru */ -E(L(load_table2), X86_RET_VOID) -L(e2): - addl $closure_FS, %esp -L(UW16): - # cfi_adjust_cfa_offset(-closure_FS) - ret -L(UW17): - # cfi_adjust_cfa_offset(closure_FS) -E(L(load_table2), X86_RET_STRUCTPOP) - addl $closure_FS, %esp -L(UW18): - # cfi_adjust_cfa_offset(-closure_FS) - ret $4 -L(UW19): - # cfi_adjust_cfa_offset(closure_FS) -E(L(load_table2), X86_RET_STRUCTARG) - jmp L(e2) -E(L(load_table2), X86_RET_STRUCT_1B) - movzbl %al, %eax - jmp L(e2) -E(L(load_table2), X86_RET_STRUCT_2B) - movzwl %ax, %eax - jmp L(e2) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table2), X86_RET_UNUSED14) - ud2 -E(L(load_table2), X86_RET_UNUSED15) - ud2 - -L(UW20): - # cfi_endproc -ENDF(C(ffi_closure_i386)) - - .balign 16 - .globl C(ffi_go_closure_STDCALL) - FFI_HIDDEN(C(ffi_go_closure_STDCALL)) -C(ffi_go_closure_STDCALL): -L(UW21): - # cfi_startproc - subl $closure_FS, %esp -L(UW22): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl 4(%ecx), %edx /* copy cif */ - movl 8(%ecx), %eax /* copy fun */ - movl %edx, closure_CF+28(%esp) - movl %eax, closure_CF+32(%esp) - movl %ecx, closure_CF+36(%esp) /* closure is user_data */ - jmp L(do_closure_STDCALL) -L(UW23): - # cfi_endproc -ENDF(C(ffi_go_closure_STDCALL)) - -/* For REGISTER, we have no available parameter registers, and so we - enter here having pushed the closure onto the stack. */ - - .balign 16 - .globl C(ffi_closure_REGISTER) - FFI_HIDDEN(C(ffi_closure_REGISTER)) -C(ffi_closure_REGISTER): -L(UW24): - # cfi_startproc - # cfi_def_cfa(%esp, 8) - # cfi_offset(%eip, -8) - subl $closure_FS-4, %esp -L(UW25): - # cfi_def_cfa_offset(closure_FS + 4) - FFI_CLOSURE_SAVE_REGS - movl closure_FS-4(%esp), %ecx /* load retaddr */ - movl closure_FS(%esp), %eax /* load closure */ - movl %ecx, closure_FS(%esp) /* move retaddr */ - jmp L(do_closure_REGISTER) -L(UW26): - # cfi_endproc -ENDF(C(ffi_closure_REGISTER)) - -/* For STDCALL (and others), we need to pop N bytes of arguments off - the stack following the closure. The amount needing to be popped - is returned to us from ffi_closure_inner. */ - - .balign 16 - .globl C(ffi_closure_STDCALL) - FFI_HIDDEN(C(ffi_closure_STDCALL)) -C(ffi_closure_STDCALL): -L(UW27): - # cfi_startproc - subl $closure_FS, %esp -L(UW28): - # cfi_def_cfa_offset(closure_FS + 4) - - FFI_CLOSURE_SAVE_REGS - - /* Entry point from ffi_closure_REGISTER. */ -L(do_closure_REGISTER): - - FFI_CLOSURE_COPY_TRAMP_DATA - - /* Entry point from preceeding Go closure. */ -L(do_closure_STDCALL): - - FFI_CLOSURE_PREP_CALL - FFI_CLOSURE_CALL_INNER(29) - - movl %eax, %ecx - shrl $X86_RET_POP_SHIFT, %ecx /* isolate pop count */ - leal closure_FS(%esp, %ecx), %ecx /* compute popped esp */ - movl closure_FS(%esp), %edx /* move return address */ - movl %edx, (%ecx) - - /* From this point on, the value of %esp upon return is %ecx+4, - and we've copied the return address to %ecx to make return easy. - There's no point in representing this in the unwind info, as - there is always a window between the mov and the ret which - will be wrong from one point of view or another. */ - - FFI_CLOSURE_MASK_AND_JUMP(3, 30) - - .balign 8 -L(load_table3): -E(L(load_table3), X86_RET_FLOAT) - flds closure_CF(%esp) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_DOUBLE) - fldl closure_CF(%esp) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_LDOUBLE) - fldt closure_CF(%esp) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_SINT8) - movsbl %al, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_SINT16) - movswl %ax, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_UINT8) - movzbl %al, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_UINT16) - movzwl %ax, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_INT64) - movl closure_CF+4(%esp), %edx - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_INT32) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_VOID) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCTPOP) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCTARG) - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCT_1B) - movzbl %al, %eax - movl %ecx, %esp - ret -E(L(load_table3), X86_RET_STRUCT_2B) - movzwl %ax, %eax - movl %ecx, %esp - ret - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table3), X86_RET_UNUSED14) - ud2 -E(L(load_table3), X86_RET_UNUSED15) - ud2 - -L(UW31): - # cfi_endproc -ENDF(C(ffi_closure_STDCALL)) - -#if !FFI_NO_RAW_API - -#define raw_closure_S_FS (16+16+12) - - .balign 16 - .globl C(ffi_closure_raw_SYSV) - FFI_HIDDEN(C(ffi_closure_raw_SYSV)) -C(ffi_closure_raw_SYSV): -L(UW32): - # cfi_startproc - subl $raw_closure_S_FS, %esp -L(UW33): - # cfi_def_cfa_offset(raw_closure_S_FS + 4) - movl %ebx, raw_closure_S_FS-4(%esp) -L(UW34): - # cfi_rel_offset(%ebx, raw_closure_S_FS-4) - - movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ - movl %edx, 12(%esp) - leal raw_closure_S_FS+4(%esp), %edx /* load raw_args */ - movl %edx, 8(%esp) - leal 16(%esp), %edx /* load &res */ - movl %edx, 4(%esp) - movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ - movl %ebx, (%esp) - call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ - - movl 20(%ebx), %eax /* load cif->flags */ - andl $X86_RET_TYPE_MASK, %eax -#ifdef __PIC__ - call C(__x86.get_pc_thunk.bx) -L(pc4): - leal L(load_table4)-L(pc4)(%ebx, %eax, 8), %ecx -#else - leal L(load_table4)(,%eax, 8), %ecx -#endif - movl raw_closure_S_FS-4(%esp), %ebx -L(UW35): - # cfi_restore(%ebx) - movl 16(%esp), %eax /* Optimistic load */ - jmp *%ecx - - .balign 8 -L(load_table4): -E(L(load_table4), X86_RET_FLOAT) - flds 16(%esp) - jmp L(e4) -E(L(load_table4), X86_RET_DOUBLE) - fldl 16(%esp) - jmp L(e4) -E(L(load_table4), X86_RET_LDOUBLE) - fldt 16(%esp) - jmp L(e4) -E(L(load_table4), X86_RET_SINT8) - movsbl %al, %eax - jmp L(e4) -E(L(load_table4), X86_RET_SINT16) - movswl %ax, %eax - jmp L(e4) -E(L(load_table4), X86_RET_UINT8) - movzbl %al, %eax - jmp L(e4) -E(L(load_table4), X86_RET_UINT16) - movzwl %ax, %eax - jmp L(e4) -E(L(load_table4), X86_RET_INT64) - movl 16+4(%esp), %edx - jmp L(e4) -E(L(load_table4), X86_RET_INT32) - nop - /* fallthru */ -E(L(load_table4), X86_RET_VOID) -L(e4): - addl $raw_closure_S_FS, %esp -L(UW36): - # cfi_adjust_cfa_offset(-raw_closure_S_FS) - ret -L(UW37): - # cfi_adjust_cfa_offset(raw_closure_S_FS) -E(L(load_table4), X86_RET_STRUCTPOP) - addl $raw_closure_S_FS, %esp -L(UW38): - # cfi_adjust_cfa_offset(-raw_closure_S_FS) - ret $4 -L(UW39): - # cfi_adjust_cfa_offset(raw_closure_S_FS) -E(L(load_table4), X86_RET_STRUCTARG) - jmp L(e4) -E(L(load_table4), X86_RET_STRUCT_1B) - movzbl %al, %eax - jmp L(e4) -E(L(load_table4), X86_RET_STRUCT_2B) - movzwl %ax, %eax - jmp L(e4) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table4), X86_RET_UNUSED14) - ud2 -E(L(load_table4), X86_RET_UNUSED15) - ud2 - -L(UW40): - # cfi_endproc -ENDF(C(ffi_closure_raw_SYSV)) - -#define raw_closure_T_FS (16+16+8) - - .balign 16 - .globl C(ffi_closure_raw_THISCALL) - FFI_HIDDEN(C(ffi_closure_raw_THISCALL)) -C(ffi_closure_raw_THISCALL): -L(UW41): - # cfi_startproc - /* Rearrange the stack such that %ecx is the first argument. - This means moving the return address. */ - popl %edx -L(UW42): - # cfi_def_cfa_offset(0) - # cfi_register(%eip, %edx) - pushl %ecx -L(UW43): - # cfi_adjust_cfa_offset(4) - pushl %edx -L(UW44): - # cfi_adjust_cfa_offset(4) - # cfi_rel_offset(%eip, 0) - subl $raw_closure_T_FS, %esp -L(UW45): - # cfi_adjust_cfa_offset(raw_closure_T_FS) - movl %ebx, raw_closure_T_FS-4(%esp) -L(UW46): - # cfi_rel_offset(%ebx, raw_closure_T_FS-4) - - movl FFI_TRAMPOLINE_SIZE+8(%eax), %edx /* load cl->user_data */ - movl %edx, 12(%esp) - leal raw_closure_T_FS+4(%esp), %edx /* load raw_args */ - movl %edx, 8(%esp) - leal 16(%esp), %edx /* load &res */ - movl %edx, 4(%esp) - movl FFI_TRAMPOLINE_SIZE(%eax), %ebx /* load cl->cif */ - movl %ebx, (%esp) - call *FFI_TRAMPOLINE_SIZE+4(%eax) /* call cl->fun */ - - movl 20(%ebx), %eax /* load cif->flags */ - andl $X86_RET_TYPE_MASK, %eax -#ifdef __PIC__ - call C(__x86.get_pc_thunk.bx) -L(pc5): - leal L(load_table5)-L(pc5)(%ebx, %eax, 8), %ecx -#else - leal L(load_table5)(,%eax, 8), %ecx -#endif - movl raw_closure_T_FS-4(%esp), %ebx -L(UW47): - # cfi_restore(%ebx) - movl 16(%esp), %eax /* Optimistic load */ - jmp *%ecx - - .balign 8 -L(load_table5): -E(L(load_table5), X86_RET_FLOAT) - flds 16(%esp) - jmp L(e5) -E(L(load_table5), X86_RET_DOUBLE) - fldl 16(%esp) - jmp L(e5) -E(L(load_table5), X86_RET_LDOUBLE) - fldt 16(%esp) - jmp L(e5) -E(L(load_table5), X86_RET_SINT8) - movsbl %al, %eax - jmp L(e5) -E(L(load_table5), X86_RET_SINT16) - movswl %ax, %eax - jmp L(e5) -E(L(load_table5), X86_RET_UINT8) - movzbl %al, %eax - jmp L(e5) -E(L(load_table5), X86_RET_UINT16) - movzwl %ax, %eax - jmp L(e5) -E(L(load_table5), X86_RET_INT64) - movl 16+4(%esp), %edx - jmp L(e5) -E(L(load_table5), X86_RET_INT32) - nop - /* fallthru */ -E(L(load_table5), X86_RET_VOID) -L(e5): - addl $raw_closure_T_FS, %esp -L(UW48): - # cfi_adjust_cfa_offset(-raw_closure_T_FS) - /* Remove the extra %ecx argument we pushed. */ - ret $4 -L(UW49): - # cfi_adjust_cfa_offset(raw_closure_T_FS) -E(L(load_table5), X86_RET_STRUCTPOP) - addl $raw_closure_T_FS, %esp -L(UW50): - # cfi_adjust_cfa_offset(-raw_closure_T_FS) - ret $8 -L(UW51): - # cfi_adjust_cfa_offset(raw_closure_T_FS) -E(L(load_table5), X86_RET_STRUCTARG) - jmp L(e5) -E(L(load_table5), X86_RET_STRUCT_1B) - movzbl %al, %eax - jmp L(e5) -E(L(load_table5), X86_RET_STRUCT_2B) - movzwl %ax, %eax - jmp L(e5) - - /* Fill out the table so that bad values are predictable. */ -E(L(load_table5), X86_RET_UNUSED14) - ud2 -E(L(load_table5), X86_RET_UNUSED15) - ud2 - -L(UW52): - # cfi_endproc -ENDF(C(ffi_closure_raw_THISCALL)) - -#endif /* !FFI_NO_RAW_API */ - -#ifdef X86_DARWIN -# define COMDAT(X) \ - .section __TEXT,__textcoal_nt,coalesced,pure_instructions; \ - .weak_definition X; \ - .private_extern X -#elif defined __ELF__ && !(defined(__sun__) && defined(__svr4__)) -# define COMDAT(X) \ - .section .text.X,"axG",@progbits,X,comdat; \ - .globl X; \ - FFI_HIDDEN(X) -#else -# define COMDAT(X) -#endif - -#if defined(__PIC__) - COMDAT(C(__x86.get_pc_thunk.bx)) -C(__x86.get_pc_thunk.bx): - movl (%esp), %ebx - ret -ENDF(C(__x86.get_pc_thunk.bx)) -# if defined X86_DARWIN || defined HAVE_HIDDEN_VISIBILITY_ATTRIBUTE - COMDAT(C(__x86.get_pc_thunk.dx)) -C(__x86.get_pc_thunk.dx): - movl (%esp), %edx - ret -ENDF(C(__x86.get_pc_thunk.dx)) -#endif /* DARWIN || HIDDEN */ -#endif /* __PIC__ */ - -/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ - -#ifdef __APPLE__ -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EHFrame0: -#elif defined(X86_WIN32) -.section .eh_frame,"r" -#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) -.section .eh_frame,EH_FRAME_FLAGS,@unwind -#else -.section .eh_frame,EH_FRAME_FLAGS,@progbits -#endif - -#ifdef HAVE_AS_X86_PCREL -# define PCREL(X) X - . -#else -# define PCREL(X) X@rel -#endif - -/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ -#define ADV(N, P) .byte 2, L(N)-L(P) - - .balign 4 -L(CIE): - .set L(set0),L(ECIE)-L(SCIE) - .long L(set0) /* CIE Length */ -L(SCIE): - .long 0 /* CIE Identifier Tag */ - .byte 1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .byte 1 /* CIE Code Alignment Factor */ - .byte 0x7c /* CIE Data Alignment Factor */ - .byte 0x8 /* CIE RA Column */ - .byte 1 /* Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ - .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp offset 4 */ - .byte 0x80+8, 1 /* DW_CFA_offset, %eip offset 1*-4 */ - .balign 4 -L(ECIE): - - .set L(set1),L(EFDE1)-L(SFDE1) - .long L(set1) /* FDE Length */ -L(SFDE1): - .long L(SFDE1)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW0)) /* Initial location */ - .long L(UW5)-L(UW0) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW1, UW0) - .byte 0xc, 5, 8 /* DW_CFA_def_cfa, %ebp 8 */ - .byte 0x80+5, 2 /* DW_CFA_offset, %ebp 2*-4 */ - ADV(UW2, UW1) - .byte 0x80+3, 0 /* DW_CFA_offset, %ebx 0*-4 */ - ADV(UW3, UW2) - .byte 0xa /* DW_CFA_remember_state */ - .byte 0xc, 4, 4 /* DW_CFA_def_cfa, %esp 4 */ - .byte 0xc0+3 /* DW_CFA_restore, %ebx */ - .byte 0xc0+5 /* DW_CFA_restore, %ebp */ - ADV(UW4, UW3) - .byte 0xb /* DW_CFA_restore_state */ - .balign 4 -L(EFDE1): - - .set L(set2),L(EFDE2)-L(SFDE2) - .long L(set2) /* FDE Length */ -L(SFDE2): - .long L(SFDE2)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW6)) /* Initial location */ - .long L(UW8)-L(UW6) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW7, UW6) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE2): - - .set L(set3),L(EFDE3)-L(SFDE3) - .long L(set3) /* FDE Length */ -L(SFDE3): - .long L(SFDE3)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW9)) /* Initial location */ - .long L(UW11)-L(UW9) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW10, UW9) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE3): - - .set L(set4),L(EFDE4)-L(SFDE4) - .long L(set4) /* FDE Length */ -L(SFDE4): - .long L(SFDE4)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW12)) /* Initial location */ - .long L(UW20)-L(UW12) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW13, UW12) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ -#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX - ADV(UW14, UW13) - .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ - ADV(UW15, UW14) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW16, UW15) -#else - ADV(UW16, UW13) -#endif - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW17, UW16) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW18, UW17) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW19, UW18) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE4): - - .set L(set5),L(EFDE5)-L(SFDE5) - .long L(set5) /* FDE Length */ -L(SFDE5): - .long L(SFDE5)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW21)) /* Initial location */ - .long L(UW23)-L(UW21) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW22, UW21) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE5): - - .set L(set6),L(EFDE6)-L(SFDE6) - .long L(set6) /* FDE Length */ -L(SFDE6): - .long L(SFDE6)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW24)) /* Initial location */ - .long L(UW26)-L(UW24) /* Address range */ - .byte 0 /* Augmentation size */ - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - .byte 0x80+8, 2 /* DW_CFA_offset %eip, 2*-4 */ - ADV(UW25, UW24) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE6): - - .set L(set7),L(EFDE7)-L(SFDE7) - .long L(set7) /* FDE Length */ -L(SFDE7): - .long L(SFDE7)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW27)) /* Initial location */ - .long L(UW31)-L(UW27) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW28, UW27) - .byte 0xe, closure_FS+4 /* DW_CFA_def_cfa_offset */ -#ifdef FFI_CLOSURE_CALL_INNER_SAVE_EBX - ADV(UW29, UW28) - .byte 0x80+3, (40-(closure_FS+4))/-4 /* DW_CFA_offset %ebx */ - ADV(UW30, UW29) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ -#endif - .balign 4 -L(EFDE7): - -#if !FFI_NO_RAW_API - .set L(set8),L(EFDE8)-L(SFDE8) - .long L(set8) /* FDE Length */ -L(SFDE8): - .long L(SFDE8)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW32)) /* Initial location */ - .long L(UW40)-L(UW32) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW33, UW32) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW34, UW33) - .byte 0x80+3, 2 /* DW_CFA_offset %ebx 2*-4 */ - ADV(UW35, UW34) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW36, UW35) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW37, UW36) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - ADV(UW38, UW37) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW39, UW38) - .byte 0xe, raw_closure_S_FS+4 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE8): - - .set L(set9),L(EFDE9)-L(SFDE9) - .long L(set9) /* FDE Length */ -L(SFDE9): - .long L(SFDE9)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW41)) /* Initial location */ - .long L(UW52)-L(UW41) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW42, UW41) - .byte 0xe, 0 /* DW_CFA_def_cfa_offset */ - .byte 0x9, 8, 2 /* DW_CFA_register %eip, %edx */ - ADV(UW43, UW42) - .byte 0xe, 4 /* DW_CFA_def_cfa_offset */ - ADV(UW44, UW43) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - .byte 0x80+8, 2 /* DW_CFA_offset %eip 2*-4 */ - ADV(UW45, UW44) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - ADV(UW46, UW45) - .byte 0x80+3, 3 /* DW_CFA_offset %ebx 3*-4 */ - ADV(UW47, UW46) - .byte 0xc0+3 /* DW_CFA_restore %ebx */ - ADV(UW48, UW47) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - ADV(UW49, UW48) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - ADV(UW50, UW49) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset */ - ADV(UW51, UW50) - .byte 0xe, raw_closure_T_FS+8 /* DW_CFA_def_cfa_offset */ - .balign 4 -L(EFDE9): -#endif /* !FFI_NO_RAW_API */ - -#endif /* ifndef _MSC_VER */ -#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.25/ext/ffi_c/libffi/src/x86/unix64.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S deleted file mode 100644 index db792c0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/unix64.S +++ /dev/null @@ -1,525 +0,0 @@ -/* ----------------------------------------------------------------------- - unix64.S - Copyright (c) 2013 The Written Word, Inc. - - Copyright (c) 2008 Red Hat, Inc - - Copyright (c) 2002 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. - ----------------------------------------------------------------------- */ - -#ifdef __x86_64__ -#define LIBFFI_ASM -#include -#include -#include "internal64.h" -#include "asmnames.h" - - .text - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) .balign 8 -#else -# define E(BASE, X) .balign 8; .org BASE + X * 8 -#endif - -/* 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. */ - - .balign 8 - .globl C(ffi_call_unix64) - FFI_HIDDEN(C(ffi_call_unix64)) - -C(ffi_call_unix64): -L(UW0): - 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. */ - - /* 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. */ -L(UW1): - /* cfi_def_cfa(%rbp, 32) */ - /* cfi_rel_offset(%rbp, 16) */ - - 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 0x08(%r10), %rsi - movq 0x10(%r10), %rdx - movq 0x18(%r10), %rcx - movq 0x20(%r10), %r8 - movq 0x28(%r10), %r9 - movl 0xb0(%r10), %eax - testl %eax, %eax - jnz L(load_sse) -L(ret_from_load_sse): - - /* Deallocate the reg arg area, except for r10, then load via pop. */ - leaq 0xb8(%r10), %rsp - popq %r10 - - /* 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. */ -L(UW2): - /* cfi_remember_state */ - /* cfi_def_cfa(%rsp, 8) */ - /* cfi_restore(%rbp) */ - - /* The first byte of the flags contains the FFI_TYPE. */ - cmpb $UNIX64_RET_LAST, %cl - movzbl %cl, %r10d - leaq L(store_table)(%rip), %r11 - ja L(sa) - leaq (%r11, %r10, 8), %r10 - - /* Prep for the structure cases: scratch area in redzone. */ - leaq -20(%rsp), %rsi - jmp *%r10 - - .balign 8 -L(store_table): -E(L(store_table), UNIX64_RET_VOID) - ret -E(L(store_table), UNIX64_RET_UINT8) - movzbl %al, %eax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_UINT16) - movzwl %ax, %eax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_UINT32) - movl %eax, %eax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_SINT8) - movsbq %al, %rax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_SINT16) - movswq %ax, %rax - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_SINT32) - cltq - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_INT64) - movq %rax, (%rdi) - ret -E(L(store_table), UNIX64_RET_XMM32) - movd %xmm0, (%rdi) - ret -E(L(store_table), UNIX64_RET_XMM64) - movq %xmm0, (%rdi) - ret -E(L(store_table), UNIX64_RET_X87) - fstpt (%rdi) - ret -E(L(store_table), UNIX64_RET_X87_2) - fstpt (%rdi) - fstpt 16(%rdi) - ret -E(L(store_table), UNIX64_RET_ST_XMM0_RAX) - movq %rax, 8(%rsi) - jmp L(s3) -E(L(store_table), UNIX64_RET_ST_RAX_XMM0) - movq %xmm0, 8(%rsi) - jmp L(s2) -E(L(store_table), UNIX64_RET_ST_XMM0_XMM1) - movq %xmm1, 8(%rsi) - jmp L(s3) -E(L(store_table), UNIX64_RET_ST_RAX_RDX) - movq %rdx, 8(%rsi) -L(s2): - movq %rax, (%rsi) - shrl $UNIX64_SIZE_SHIFT, %ecx - rep movsb - ret - .balign 8 -L(s3): - movq %xmm0, (%rsi) - shrl $UNIX64_SIZE_SHIFT, %ecx - rep movsb - ret - -L(sa): call PLT(C(abort)) - - /* 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. */ - .balign 2 -L(UW3): - /* cfi_restore_state */ -L(load_sse): - movdqa 0x30(%r10), %xmm0 - movdqa 0x40(%r10), %xmm1 - movdqa 0x50(%r10), %xmm2 - movdqa 0x60(%r10), %xmm3 - movdqa 0x70(%r10), %xmm4 - movdqa 0x80(%r10), %xmm5 - movdqa 0x90(%r10), %xmm6 - movdqa 0xa0(%r10), %xmm7 - jmp L(ret_from_load_sse) - -L(UW4): -ENDF(C(ffi_call_unix64)) - -/* 6 general registers, 8 vector registers, - 32 bytes of rvalue, 8 bytes of alignment. */ -#define ffi_closure_OFS_G 0 -#define ffi_closure_OFS_V (6*8) -#define ffi_closure_OFS_RVALUE (ffi_closure_OFS_V + 8*16) -#define ffi_closure_FS (ffi_closure_OFS_RVALUE + 32 + 8) - -/* The location of rvalue within the red zone after deallocating the frame. */ -#define ffi_closure_RED_RVALUE (ffi_closure_OFS_RVALUE - ffi_closure_FS) - - .balign 2 - .globl C(ffi_closure_unix64_sse) - FFI_HIDDEN(C(ffi_closure_unix64_sse)) - -C(ffi_closure_unix64_sse): -L(UW5): - subq $ffi_closure_FS, %rsp -L(UW6): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ - - movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) - movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) - movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) - movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) - movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) - movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) - movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) - movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) - jmp L(sse_entry1) - -L(UW7): -ENDF(C(ffi_closure_unix64_sse)) - - .balign 2 - .globl C(ffi_closure_unix64) - FFI_HIDDEN(C(ffi_closure_unix64)) - -C(ffi_closure_unix64): -L(UW8): - subq $ffi_closure_FS, %rsp -L(UW9): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ -L(sse_entry1): - movq %rdi, ffi_closure_OFS_G+0x00(%rsp) - movq %rsi, ffi_closure_OFS_G+0x08(%rsp) - movq %rdx, ffi_closure_OFS_G+0x10(%rsp) - movq %rcx, ffi_closure_OFS_G+0x18(%rsp) - movq %r8, ffi_closure_OFS_G+0x20(%rsp) - movq %r9, ffi_closure_OFS_G+0x28(%rsp) - -#ifdef __ILP32__ - movl FFI_TRAMPOLINE_SIZE(%r10), %edi /* Load cif */ - movl FFI_TRAMPOLINE_SIZE+4(%r10), %esi /* Load fun */ - movl FFI_TRAMPOLINE_SIZE+8(%r10), %edx /* Load user_data */ -#else - movq FFI_TRAMPOLINE_SIZE(%r10), %rdi /* Load cif */ - movq FFI_TRAMPOLINE_SIZE+8(%r10), %rsi /* Load fun */ - movq FFI_TRAMPOLINE_SIZE+16(%r10), %rdx /* Load user_data */ -#endif -L(do_closure): - leaq ffi_closure_OFS_RVALUE(%rsp), %rcx /* Load rvalue */ - movq %rsp, %r8 /* Load reg_args */ - leaq ffi_closure_FS+8(%rsp), %r9 /* Load argp */ - call PLT(C(ffi_closure_unix64_inner)) - - /* Deallocate stack frame early; return value is now in redzone. */ - addq $ffi_closure_FS, %rsp -L(UW10): - /* cfi_adjust_cfa_offset(-ffi_closure_FS) */ - - /* The first byte of the return value contains the FFI_TYPE. */ - cmpb $UNIX64_RET_LAST, %al - movzbl %al, %r10d - leaq L(load_table)(%rip), %r11 - ja L(la) - leaq (%r11, %r10, 8), %r10 - leaq ffi_closure_RED_RVALUE(%rsp), %rsi - jmp *%r10 - - .balign 8 -L(load_table): -E(L(load_table), UNIX64_RET_VOID) - ret -E(L(load_table), UNIX64_RET_UINT8) - movzbl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_UINT16) - movzwl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_UINT32) - movl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_SINT8) - movsbl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_SINT16) - movswl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_SINT32) - movl (%rsi), %eax - ret -E(L(load_table), UNIX64_RET_INT64) - movq (%rsi), %rax - ret -E(L(load_table), UNIX64_RET_XMM32) - movd (%rsi), %xmm0 - ret -E(L(load_table), UNIX64_RET_XMM64) - movq (%rsi), %xmm0 - ret -E(L(load_table), UNIX64_RET_X87) - fldt (%rsi) - ret -E(L(load_table), UNIX64_RET_X87_2) - fldt 16(%rsi) - fldt (%rsi) - ret -E(L(load_table), UNIX64_RET_ST_XMM0_RAX) - movq 8(%rsi), %rax - jmp L(l3) -E(L(load_table), UNIX64_RET_ST_RAX_XMM0) - movq 8(%rsi), %xmm0 - jmp L(l2) -E(L(load_table), UNIX64_RET_ST_XMM0_XMM1) - movq 8(%rsi), %xmm1 - jmp L(l3) -E(L(load_table), UNIX64_RET_ST_RAX_RDX) - movq 8(%rsi), %rdx -L(l2): - movq (%rsi), %rax - ret - .balign 8 -L(l3): - movq (%rsi), %xmm0 - ret - -L(la): call PLT(C(abort)) - -L(UW11): -ENDF(C(ffi_closure_unix64)) - - .balign 2 - .globl C(ffi_go_closure_unix64_sse) - FFI_HIDDEN(C(ffi_go_closure_unix64_sse)) - -C(ffi_go_closure_unix64_sse): -L(UW12): - subq $ffi_closure_FS, %rsp -L(UW13): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ - - movdqa %xmm0, ffi_closure_OFS_V+0x00(%rsp) - movdqa %xmm1, ffi_closure_OFS_V+0x10(%rsp) - movdqa %xmm2, ffi_closure_OFS_V+0x20(%rsp) - movdqa %xmm3, ffi_closure_OFS_V+0x30(%rsp) - movdqa %xmm4, ffi_closure_OFS_V+0x40(%rsp) - movdqa %xmm5, ffi_closure_OFS_V+0x50(%rsp) - movdqa %xmm6, ffi_closure_OFS_V+0x60(%rsp) - movdqa %xmm7, ffi_closure_OFS_V+0x70(%rsp) - jmp L(sse_entry2) - -L(UW14): -ENDF(C(ffi_go_closure_unix64_sse)) - - .balign 2 - .globl C(ffi_go_closure_unix64) - FFI_HIDDEN(C(ffi_go_closure_unix64)) - -C(ffi_go_closure_unix64): -L(UW15): - subq $ffi_closure_FS, %rsp -L(UW16): - /* cfi_adjust_cfa_offset(ffi_closure_FS) */ -L(sse_entry2): - movq %rdi, ffi_closure_OFS_G+0x00(%rsp) - movq %rsi, ffi_closure_OFS_G+0x08(%rsp) - movq %rdx, ffi_closure_OFS_G+0x10(%rsp) - movq %rcx, ffi_closure_OFS_G+0x18(%rsp) - movq %r8, ffi_closure_OFS_G+0x20(%rsp) - movq %r9, ffi_closure_OFS_G+0x28(%rsp) - -#ifdef __ILP32__ - movl 4(%r10), %edi /* Load cif */ - movl 8(%r10), %esi /* Load fun */ - movl %r10d, %edx /* Load closure (user_data) */ -#else - movq 8(%r10), %rdi /* Load cif */ - movq 16(%r10), %rsi /* Load fun */ - movq %r10, %rdx /* Load closure (user_data) */ -#endif - jmp L(do_closure) - -L(UW17): -ENDF(C(ffi_go_closure_unix64)) - -/* Sadly, OSX cctools-as doesn't understand .cfi directives at all. */ - -#ifdef __APPLE__ -.section __TEXT,__eh_frame,coalesced,no_toc+strip_static_syms+live_support -EHFrame0: -#elif defined(HAVE_AS_X86_64_UNWIND_SECTION_TYPE) -.section .eh_frame,"a",@unwind -#else -.section .eh_frame,"a",@progbits -#endif - -#ifdef HAVE_AS_X86_PCREL -# define PCREL(X) X - . -#else -# define PCREL(X) X@rel -#endif - -/* Simplify advancing between labels. Assume DW_CFA_advance_loc1 fits. */ -#define ADV(N, P) .byte 2, L(N)-L(P) - - .balign 8 -L(CIE): - .set L(set0),L(ECIE)-L(SCIE) - .long L(set0) /* CIE Length */ -L(SCIE): - .long 0 /* CIE Identifier Tag */ - .byte 1 /* CIE Version */ - .ascii "zR\0" /* CIE Augmentation */ - .byte 1 /* CIE Code Alignment Factor */ - .byte 0x78 /* CIE Data Alignment Factor */ - .byte 0x10 /* CIE RA Column */ - .byte 1 /* Augmentation size */ - .byte 0x1b /* FDE Encoding (pcrel sdata4) */ - .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp offset 8 */ - .byte 0x80+16, 1 /* DW_CFA_offset, %rip offset 1*-8 */ - .balign 8 -L(ECIE): - - .set L(set1),L(EFDE1)-L(SFDE1) - .long L(set1) /* FDE Length */ -L(SFDE1): - .long L(SFDE1)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW0)) /* Initial location */ - .long L(UW4)-L(UW0) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW1, UW0) - .byte 0xc, 6, 32 /* DW_CFA_def_cfa, %rbp 32 */ - .byte 0x80+6, 2 /* DW_CFA_offset, %rbp 2*-8 */ - ADV(UW2, UW1) - .byte 0xa /* DW_CFA_remember_state */ - .byte 0xc, 7, 8 /* DW_CFA_def_cfa, %rsp 8 */ - .byte 0xc0+6 /* DW_CFA_restore, %rbp */ - ADV(UW3, UW2) - .byte 0xb /* DW_CFA_restore_state */ - .balign 8 -L(EFDE1): - - .set L(set2),L(EFDE2)-L(SFDE2) - .long L(set2) /* FDE Length */ -L(SFDE2): - .long L(SFDE2)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW5)) /* Initial location */ - .long L(UW7)-L(UW5) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW6, UW5) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - .balign 8 -L(EFDE2): - - .set L(set3),L(EFDE3)-L(SFDE3) - .long L(set3) /* FDE Length */ -L(SFDE3): - .long L(SFDE3)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW8)) /* Initial location */ - .long L(UW11)-L(UW8) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW9, UW8) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - ADV(UW10, UW9) - .byte 0xe, 8 /* DW_CFA_def_cfa_offset 8 */ -L(EFDE3): - - .set L(set4),L(EFDE4)-L(SFDE4) - .long L(set4) /* FDE Length */ -L(SFDE4): - .long L(SFDE4)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW12)) /* Initial location */ - .long L(UW14)-L(UW12) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW13, UW12) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - .balign 8 -L(EFDE4): - - .set L(set5),L(EFDE5)-L(SFDE5) - .long L(set5) /* FDE Length */ -L(SFDE5): - .long L(SFDE5)-L(CIE) /* FDE CIE offset */ - .long PCREL(L(UW15)) /* Initial location */ - .long L(UW17)-L(UW15) /* Address range */ - .byte 0 /* Augmentation size */ - ADV(UW16, UW15) - .byte 0xe /* DW_CFA_def_cfa_offset */ - .byte ffi_closure_FS + 8, 1 /* uleb128, assuming 128 <= FS < 255 */ - .balign 8 -L(EFDE5): -#ifdef __APPLE__ - .subsections_via_symbols -#endif - -#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.25/ext/ffi_c/libffi/src/x86/win64.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S deleted file mode 100644 index 10991b4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64.S +++ /dev/null @@ -1,232 +0,0 @@ -#define LIBFFI_ASM -#include -#include -#include -#include "asmnames.h" - -#if defined(HAVE_AS_CFI_PSEUDO_OP) - .cfi_sections .debug_frame -#endif - -#ifdef X86_WIN64 -#define SEH(...) __VA_ARGS__ -#define arg0 %rcx -#define arg1 %rdx -#define arg2 %r8 -#define arg3 %r9 -#else -#define SEH(...) -#define arg0 %rdi -#define arg1 %rsi -#define arg2 %rdx -#define arg3 %rcx -#endif - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) .balign 8 -#else -# define E(BASE, X) .balign 8; .org BASE + X * 8 -#endif - - .text - -/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10) - - Bit o trickiness here -- FRAME 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 8 - .globl C(ffi_call_win64) - - SEH(.seh_proc ffi_call_win64) -C(ffi_call_win64): - cfi_startproc - /* Set up the local stack frame and install it in rbp/rsp. */ - movq (%rsp), %rax - movq %rbp, (arg1) - movq %rax, 8(arg1) - movq arg1, %rbp - cfi_def_cfa(%rbp, 16) - cfi_rel_offset(%rbp, 0) - SEH(.seh_pushreg %rbp) - SEH(.seh_setframe %rbp, 0) - SEH(.seh_endprologue) - movq arg0, %rsp - - movq arg2, %r10 - - /* Load all slots into both general and xmm registers. */ - movq (%rsp), %rcx - movsd (%rsp), %xmm0 - movq 8(%rsp), %rdx - movsd 8(%rsp), %xmm1 - movq 16(%rsp), %r8 - movsd 16(%rsp), %xmm2 - movq 24(%rsp), %r9 - movsd 24(%rsp), %xmm3 - - call *16(%rbp) - - movl 24(%rbp), %ecx - movq 32(%rbp), %r8 - leaq 0f(%rip), %r10 - cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx - leaq (%r10, %rcx, 8), %r10 - ja 99f - jmp *%r10 - -/* Below, we're space constrained most of the time. Thus we eschew the - modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */ -.macro epilogue - leaveq - cfi_remember_state - cfi_def_cfa(%rsp, 8) - cfi_restore(%rbp) - ret - cfi_restore_state -.endm - - .align 8 -0: -E(0b, FFI_TYPE_VOID) - epilogue -E(0b, FFI_TYPE_INT) - movslq %eax, %rax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_FLOAT) - movss %xmm0, (%r8) - epilogue -E(0b, FFI_TYPE_DOUBLE) - movsd %xmm0, (%r8) - epilogue -E(0b, FFI_TYPE_LONGDOUBLE) - call PLT(C(abort)) -E(0b, FFI_TYPE_UINT8) - movzbl %al, %eax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT8) - movsbq %al, %rax - jmp 98f -E(0b, FFI_TYPE_UINT16) - movzwl %ax, %eax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT16) - movswq %ax, %rax - jmp 98f -E(0b, FFI_TYPE_UINT32) - movl %eax, %eax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT32) - movslq %eax, %rax - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_UINT64) -98: movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT64) - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_STRUCT) - epilogue -E(0b, FFI_TYPE_POINTER) - movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_COMPLEX) - call PLT(C(abort)) -E(0b, FFI_TYPE_SMALL_STRUCT_1B) - movb %al, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_2B) - movw %ax, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_4B) - movl %eax, (%r8) - epilogue - - .align 8 -99: call PLT(C(abort)) - - epilogue - - cfi_endproc - SEH(.seh_endproc) - - -/* 32 bytes of outgoing register stack space, 8 bytes of alignment, - 16 bytes of result, 32 bytes of xmm registers. */ -#define ffi_clo_FS (32+8+16+32) -#define ffi_clo_OFF_R (32+8) -#define ffi_clo_OFF_X (32+8+16) - - .align 8 - .globl C(ffi_go_closure_win64) - - SEH(.seh_proc ffi_go_closure_win64) -C(ffi_go_closure_win64): - cfi_startproc - /* Save all integer arguments into the incoming reg stack space. */ - movq %rcx, 8(%rsp) - movq %rdx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - - movq 8(%r10), %rcx /* load cif */ - movq 16(%r10), %rdx /* load fun */ - movq %r10, %r8 /* closure is user_data */ - jmp 0f - cfi_endproc - SEH(.seh_endproc) - - .align 8 - .globl C(ffi_closure_win64) - - SEH(.seh_proc ffi_closure_win64) -C(ffi_closure_win64): - cfi_startproc - /* Save all integer arguments into the incoming reg stack space. */ - movq %rcx, 8(%rsp) - movq %rdx, 16(%rsp) - movq %r8, 24(%rsp) - movq %r9, 32(%rsp) - - movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */ - movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */ - movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */ -0: - subq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(ffi_clo_FS) - SEH(.seh_stackalloc ffi_clo_FS) - SEH(.seh_endprologue) - - /* Save all sse arguments into the stack frame. */ - movsd %xmm0, ffi_clo_OFF_X(%rsp) - movsd %xmm1, ffi_clo_OFF_X+8(%rsp) - movsd %xmm2, ffi_clo_OFF_X+16(%rsp) - movsd %xmm3, ffi_clo_OFF_X+24(%rsp) - - leaq ffi_clo_OFF_R(%rsp), %r9 - call PLT(C(ffi_closure_win64_inner)) - - /* Load the result into both possible result registers. */ - movq ffi_clo_OFF_R(%rsp), %rax - movsd ffi_clo_OFF_R(%rsp), %xmm0 - - addq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(-ffi_clo_FS) - ret - - cfi_endproc - SEH(.seh_endproc) - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64_intel.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64_intel.S deleted file mode 100644 index 7df78b3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/x86/win64_intel.S +++ /dev/null @@ -1,237 +0,0 @@ -#define LIBFFI_ASM -#include -#include -#include -#include "asmnames.h" - -#if defined(HAVE_AS_CFI_PSEUDO_OP) - .cfi_sections .debug_frame -#endif - -#ifdef X86_WIN64 -#define SEH(...) __VA_ARGS__ -#define arg0 rcx -#define arg1 rdx -#define arg2 r8 -#define arg3 r9 -#else -#define SEH(...) -#define arg0 rdi -#define arg1 rsi -#define arg2 rdx -#define arg3 rcx -#endif - -/* This macro allows the safe creation of jump tables without an - actual table. The entry points into the table are all 8 bytes. - The use of ORG asserts that we're at the correct location. */ -/* ??? The clang assembler doesn't handle .org with symbolic expressions. */ -#if defined(__clang__) || defined(__APPLE__) || (defined (__sun__) && defined(__svr4__)) -# define E(BASE, X) ALIGN 8 -#else -# define E(BASE, X) ALIGN 8; ORG BASE + X * 8 -#endif - - .CODE - extern PLT(C(abort)):near - extern C(ffi_closure_win64_inner):near - -/* ffi_call_win64 (void *stack, struct win64_call_frame *frame, void *r10) - - Bit o trickiness here -- FRAME 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 8 - PUBLIC C(ffi_call_win64) - - ; SEH(.safesh ffi_call_win64) -C(ffi_call_win64) proc SEH(frame) - cfi_startproc - /* Set up the local stack frame and install it in rbp/rsp. */ - mov RAX, [RSP] ; movq (%rsp), %rax - mov [arg1], RBP ; movq %rbp, (arg1) - mov [arg1 + 8], RAX; movq %rax, 8(arg1) - mov RBP, arg1; movq arg1, %rbp - cfi_def_cfa(rbp, 16) - cfi_rel_offset(rbp, 0) - SEH(.pushreg rbp) - SEH(.setframe rbp, 0) - SEH(.endprolog) - mov RSP, arg0 ; movq arg0, %rsp - - mov R10, arg2 ; movq arg2, %r10 - - /* Load all slots into both general and xmm registers. */ - mov RCX, [RSP] ; movq (%rsp), %rcx - movsd XMM0, qword ptr [RSP] ; movsd (%rsp), %xmm0 - mov RDX, [RSP + 8] ;movq 8(%rsp), %rdx - movsd XMM1, qword ptr [RSP + 8]; movsd 8(%rsp), %xmm1 - mov R8, [RSP + 16] ; movq 16(%rsp), %r8 - movsd XMM2, qword ptr [RSP + 16] ; movsd 16(%rsp), %xmm2 - mov R9, [RSP + 24] ; movq 24(%rsp), %r9 - movsd XMM3, qword ptr [RSP + 24] ;movsd 24(%rsp), %xmm3 - - CALL qword ptr [RBP + 16] ; call *16(%rbp) - - mov ECX, [RBP + 24] ; movl 24(%rbp), %ecx - mov R8, [RBP + 32] ; movq 32(%rbp), %r8 - LEA R10, ffi_call_win64_tab ; leaq 0f(%rip), %r10 - CMP ECX, FFI_TYPE_SMALL_STRUCT_4B ; cmpl $FFI_TYPE_SMALL_STRUCT_4B, %ecx - LEA R10, [R10 + RCX*8] ; leaq (%r10, %rcx, 8), %r10 - JA L99 ; ja 99f - JMP R10 ; jmp *%r10 - -/* Below, we're space constrained most of the time. Thus we eschew the - modern "mov, pop, ret" sequence (5 bytes) for "leave, ret" (2 bytes). */ -epilogue macro - LEAVE - cfi_remember_state - cfi_def_cfa(rsp, 8) - cfi_restore(rbp) - RET - cfi_restore_state -endm - - ALIGN 8 -ffi_call_win64_tab LABEL NEAR -E(0b, FFI_TYPE_VOID) - epilogue -E(0b, FFI_TYPE_INT) - movsxd rax, eax ; movslq %eax, %rax - mov qword ptr [r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_FLOAT) - movss dword ptr [r8], xmm0 ; movss %xmm0, (%r8) - epilogue -E(0b, FFI_TYPE_DOUBLE) - movsd qword ptr[r8], xmm0; movsd %xmm0, (%r8) - epilogue -E(0b, FFI_TYPE_LONGDOUBLE) - call PLT(C(abort)) -E(0b, FFI_TYPE_UINT8) - movzx eax, al ;movzbl %al, %eax - mov qword ptr[r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT8) - movsx rax, al ; movsbq %al, %rax - jmp L98 -E(0b, FFI_TYPE_UINT16) - movzx eax, ax ; movzwl %ax, %eax - mov qword ptr[r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT16) - movsx rax, ax; movswq %ax, %rax - jmp L98 -E(0b, FFI_TYPE_UINT32) - mov eax, eax; movl %eax, %eax - mov qword ptr[r8], rax ; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT32) - movsxd rax, eax; movslq %eax, %rax - mov qword ptr [r8], rax; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_UINT64) -L98 LABEL near - mov qword ptr [r8], rax ; movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_SINT64) - mov qword ptr [r8], rax;movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_STRUCT) - epilogue -E(0b, FFI_TYPE_POINTER) - mov qword ptr [r8], rax ;movq %rax, (%r8) - epilogue -E(0b, FFI_TYPE_COMPLEX) - call PLT(C(abort)) -E(0b, FFI_TYPE_SMALL_STRUCT_1B) - mov byte ptr [r8], al ; movb %al, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_2B) - mov word ptr [r8], ax ; movw %ax, (%r8) - epilogue -E(0b, FFI_TYPE_SMALL_STRUCT_4B) - mov dword ptr [r8], eax ; movl %eax, (%r8) - epilogue - - align 8 -L99 LABEL near - call PLT(C(abort)) - - epilogue - - cfi_endproc - C(ffi_call_win64) endp - - -/* 32 bytes of outgoing register stack space, 8 bytes of alignment, - 16 bytes of result, 32 bytes of xmm registers. */ -#define ffi_clo_FS (32+8+16+32) -#define ffi_clo_OFF_R (32+8) -#define ffi_clo_OFF_X (32+8+16) - - align 8 - PUBLIC C(ffi_go_closure_win64) - -C(ffi_go_closure_win64) proc - cfi_startproc - /* Save all integer arguments into the incoming reg stack space. */ - mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp) - mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp) - mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp) - mov qword ptr [rsp + 32], r9 ;movq %r9, 32(%rsp) - - mov rcx, qword ptr [r10 + 8]; movq 8(%r10), %rcx /* load cif */ - mov rdx, qword ptr [r10 + 16]; movq 16(%r10), %rdx /* load fun */ - mov r8, r10 ; movq %r10, %r8 /* closure is user_data */ - jmp ffi_closure_win64_2 - cfi_endproc - C(ffi_go_closure_win64) endp - - align 8 - -PUBLIC C(ffi_closure_win64) -C(ffi_closure_win64) PROC FRAME - cfi_startproc - /* Save all integer arguments into the incoming reg stack space. */ - mov qword ptr [rsp + 8], rcx; movq %rcx, 8(%rsp) - mov qword ptr [rsp + 16], rdx; movq %rdx, 16(%rsp) - mov qword ptr [rsp + 24], r8; movq %r8, 24(%rsp) - mov qword ptr [rsp + 32], r9; movq %r9, 32(%rsp) - - mov rcx, qword ptr [FFI_TRAMPOLINE_SIZE + r10] ;movq FFI_TRAMPOLINE_SIZE(%r10), %rcx /* load cif */ - mov rdx, qword ptr [FFI_TRAMPOLINE_SIZE + 8 + r10] ; movq FFI_TRAMPOLINE_SIZE+8(%r10), %rdx /* load fun */ - mov r8, qword ptr [FFI_TRAMPOLINE_SIZE+16+r10] ;movq FFI_TRAMPOLINE_SIZE+16(%r10), %r8 /* load user_data */ -ffi_closure_win64_2 LABEL near - sub rsp, ffi_clo_FS ;subq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(ffi_clo_FS) - SEH(.allocstack ffi_clo_FS) - SEH(.endprolog) - - /* Save all sse arguments into the stack frame. */ - movsd qword ptr [ffi_clo_OFF_X + rsp], xmm0 ; movsd %xmm0, ffi_clo_OFF_X(%rsp) - movsd qword ptr [ffi_clo_OFF_X+8+rsp], xmm1 ; movsd %xmm1, ffi_clo_OFF_X+8(%rsp) - movsd qword ptr [ffi_clo_OFF_X+16+rsp], xmm2 ; movsd %xmm2, ffi_clo_OFF_X+16(%rsp) - movsd qword ptr [ffi_clo_OFF_X+24+rsp], xmm3 ; movsd %xmm3, ffi_clo_OFF_X+24(%rsp) - - lea r9, [ffi_clo_OFF_R + rsp] ; leaq ffi_clo_OFF_R(%rsp), %r9 - call C(ffi_closure_win64_inner) - - /* Load the result into both possible result registers. */ - - mov rax, qword ptr [ffi_clo_OFF_R + rsp] ;movq ffi_clo_OFF_R(%rsp), %rax - movsd xmm0, qword ptr [rsp + ffi_clo_OFF_R] ;movsd ffi_clo_OFF_R(%rsp), %xmm0 - - add rsp, ffi_clo_FS ;addq $ffi_clo_FS, %rsp - cfi_adjust_cfa_offset(-ffi_clo_FS) - ret - - cfi_endproc - C(ffi_closure_win64) endp - -#if defined __ELF__ && defined __linux__ - .section .note.GNU-stack,"",@progbits -#endif -_text ends -end \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffi.c deleted file mode 100644 index 9a0575f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffi.c +++ /dev/null @@ -1,298 +0,0 @@ -/* ----------------------------------------------------------------------- - ffi.c - Copyright (c) 2013 Tensilica, Inc. - - XTENSA 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 - -/* - |----------------------------------------| - | | - on entry to ffi_call ----> |----------------------------------------| - | caller stack frame for registers a0-a3 | - |----------------------------------------| - | | - | additional arguments | - entry of the function ---> |----------------------------------------| - | copy of function arguments a2-a7 | - | - - - - - - - - - - - - - | - | | - - The area below the entry line becomes the new stack frame for the function. - -*/ - - -#define FFI_TYPE_STRUCT_REGS FFI_TYPE_LAST - - -extern void ffi_call_SYSV(void *rvalue, unsigned rsize, unsigned flags, - void(*fn)(void), unsigned nbytes, extended_cif*); -extern void ffi_closure_SYSV(void) FFI_HIDDEN; - -ffi_status ffi_prep_cif_machdep(ffi_cif *cif) -{ - switch(cif->rtype->type) { - case FFI_TYPE_SINT8: - case FFI_TYPE_UINT8: - case FFI_TYPE_SINT16: - case FFI_TYPE_UINT16: - cif->flags = cif->rtype->type; - break; - case FFI_TYPE_VOID: - case FFI_TYPE_FLOAT: - cif->flags = FFI_TYPE_UINT32; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - cif->flags = FFI_TYPE_UINT64; // cif->rtype->type; - break; - case FFI_TYPE_STRUCT: - cif->flags = FFI_TYPE_STRUCT; //_REGS; - /* Up to 16 bytes are returned in registers */ - if (cif->rtype->size > 4 * 4) { - /* returned structure is referenced by a register; use 8 bytes - (including 4 bytes for potential additional alignment) */ - cif->flags = FFI_TYPE_STRUCT; - cif->bytes += 8; - } - break; - - default: - cif->flags = FFI_TYPE_UINT32; - break; - } - - /* Round the stack up to a full 4 register frame, just in case - (we use this size in movsp). This way, it's also a multiple of - 8 bytes for 64-bit arguments. */ - cif->bytes = FFI_ALIGN(cif->bytes, 16); - - return FFI_OK; -} - -void ffi_prep_args(extended_cif *ecif, unsigned char* stack) -{ - unsigned int i; - unsigned long *addr; - ffi_type **ptr; - - union { - void **v; - char **c; - signed char **sc; - unsigned char **uc; - signed short **ss; - unsigned short **us; - unsigned int **i; - long long **ll; - float **f; - double **d; - } p_argv; - - /* Verify that everything is aligned up properly */ - FFI_ASSERT (((unsigned long) stack & 0x7) == 0); - - p_argv.v = ecif->avalue; - addr = (unsigned long*)stack; - - /* structures with a size greater than 16 bytes are passed in memory */ - if (ecif->cif->rtype->type == FFI_TYPE_STRUCT && ecif->cif->rtype->size > 16) - { - *addr++ = (unsigned long)ecif->rvalue; - } - - for (i = ecif->cif->nargs, ptr = ecif->cif->arg_types; - i > 0; - i--, ptr++, p_argv.v++) - { - switch ((*ptr)->type) - { - case FFI_TYPE_SINT8: - *addr++ = **p_argv.sc; - break; - case FFI_TYPE_UINT8: - *addr++ = **p_argv.uc; - break; - case FFI_TYPE_SINT16: - *addr++ = **p_argv.ss; - break; - case FFI_TYPE_UINT16: - *addr++ = **p_argv.us; - break; - case FFI_TYPE_FLOAT: - case FFI_TYPE_INT: - case FFI_TYPE_UINT32: - case FFI_TYPE_SINT32: - case FFI_TYPE_POINTER: - *addr++ = **p_argv.i; - break; - case FFI_TYPE_DOUBLE: - case FFI_TYPE_UINT64: - case FFI_TYPE_SINT64: - if (((unsigned long)addr & 4) != 0) - addr++; - *(unsigned long long*)addr = **p_argv.ll; - addr += sizeof(unsigned long long) / sizeof (addr); - break; - - case FFI_TYPE_STRUCT: - { - unsigned long offs; - unsigned long size; - - if (((unsigned long)addr & 4) != 0 && (*ptr)->alignment > 4) - addr++; - - offs = (unsigned long) addr - (unsigned long) stack; - size = (*ptr)->size; - - /* Entire structure must fit the argument registers or referenced */ - if (offs < FFI_REGISTER_NARGS * 4 - && offs + size > FFI_REGISTER_NARGS * 4) - addr = (unsigned long*) (stack + FFI_REGISTER_NARGS * 4); - - memcpy((char*) addr, *p_argv.c, size); - addr += (size + 3) / 4; - break; - } - - default: - FFI_ASSERT(0); - } - } -} - - -void ffi_call(ffi_cif* cif, void(*fn)(void), void *rvalue, void **avalue) -{ - extended_cif ecif; - unsigned long rsize = cif->rtype->size; - int flags = cif->flags; - void *alloc = NULL; - - ecif.cif = cif; - ecif.avalue = avalue; - - /* Note that for structures that are returned in registers (size <= 16 bytes) - we allocate a temporary buffer and use memcpy to copy it to the final - destination. The reason is that the target address might be misaligned or - the length not a multiple of 4 bytes. Handling all those cases would be - very complex. */ - - if (flags == FFI_TYPE_STRUCT && (rsize <= 16 || rvalue == NULL)) - { - alloc = alloca(FFI_ALIGN(rsize, 4)); - ecif.rvalue = alloc; - } - else - { - ecif.rvalue = rvalue; - } - - if (cif->abi != FFI_SYSV) - FFI_ASSERT(0); - - ffi_call_SYSV (ecif.rvalue, rsize, cif->flags, fn, cif->bytes, &ecif); - - if (alloc != NULL && rvalue != NULL) - memcpy(rvalue, alloc, rsize); -} - -extern void ffi_trampoline(); -extern void ffi_cacheflush(void* start, void* end); - -ffi_status -ffi_prep_closure_loc (ffi_closure* closure, - ffi_cif* cif, - void (*fun)(ffi_cif*, void*, void**, void*), - void *user_data, - void *codeloc) -{ - /* copye trampoline to stack and patch 'ffi_closure_SYSV' pointer */ - memcpy(closure->tramp, ffi_trampoline, FFI_TRAMPOLINE_SIZE); - *(unsigned int*)(&closure->tramp[8]) = (unsigned int)ffi_closure_SYSV; - - // Do we have this function? - // __builtin___clear_cache(closer->tramp, closer->tramp + FFI_TRAMPOLINE_SIZE) - ffi_cacheflush(closure->tramp, closure->tramp + FFI_TRAMPOLINE_SIZE); - - closure->cif = cif; - closure->fun = fun; - closure->user_data = user_data; - return FFI_OK; -} - - -long FFI_HIDDEN -ffi_closure_SYSV_inner(ffi_closure *closure, void **values, void *rvalue) -{ - ffi_cif *cif; - ffi_type **arg_types; - void **avalue; - int i, areg; - - cif = closure->cif; - if (cif->abi != FFI_SYSV) - return FFI_BAD_ABI; - - areg = 0; - - int rtype = cif->rtype->type; - if (rtype == FFI_TYPE_STRUCT && cif->rtype->size > 4 * 4) - { - rvalue = *values; - areg++; - } - - cif = closure->cif; - arg_types = cif->arg_types; - avalue = alloca(cif->nargs * sizeof(void *)); - - for (i = 0; i < cif->nargs; i++) - { - if (arg_types[i]->alignment == 8 && (areg & 1) != 0) - areg++; - - // skip the entry 16,a1 framework, add 16 bytes (4 registers) - if (areg == FFI_REGISTER_NARGS) - areg += 4; - - if (arg_types[i]->type == FFI_TYPE_STRUCT) - { - int numregs = ((arg_types[i]->size + 3) & ~3) / 4; - if (areg < FFI_REGISTER_NARGS && areg + numregs > FFI_REGISTER_NARGS) - areg = FFI_REGISTER_NARGS + 4; - } - - avalue[i] = &values[areg]; - areg += (arg_types[i]->size + 3) / 4; - } - - (closure->fun)(cif, rvalue, avalue, closure->user_data); - - return rtype; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffitarget.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffitarget.h deleted file mode 100644 index 0ba728b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/ffitarget.h +++ /dev/null @@ -1,53 +0,0 @@ -/* -----------------------------------------------------------------*-C-*- - ffitarget.h - Copyright (c) 2013 Tensilica, Inc. - Target configuration macros for XTENSA. - - 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_H -#error "Please do not include ffitarget.h directly into your source. Use ffi.h instead." -#endif - -#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_REGISTER_NARGS 6 - -/* ---- Definitions for closures ----------------------------------------- */ - -#define FFI_CLOSURES 1 -#define FFI_NATIVE_RAW_API 0 -#define FFI_TRAMPOLINE_SIZE 24 - -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/sysv.S b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/sysv.S deleted file mode 100644 index e942179..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/src/xtensa/sysv.S +++ /dev/null @@ -1,258 +0,0 @@ -/* ----------------------------------------------------------------------- - sysv.S - Copyright (c) 2013 Tensilica, Inc. - - XTENSA 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 ENTRY(name) .text; .globl name; .type name,@function; .align 4; name: -#define END(name) .size name , . - name - -/* Assert that the table below is in sync with ffi.h. */ - -#if 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 -#error "xtensa/sysv.S out of sync with ffi.h" -#endif - - -/* ffi_call_SYSV (rvalue, rbytes, flags, (*fnaddr)(), bytes, ecif) - void *rvalue; a2 - unsigned long rbytes; a3 - unsigned flags; a4 - void (*fnaddr)(); a5 - unsigned long bytes; a6 - extended_cif* ecif) a7 -*/ - -ENTRY(ffi_call_SYSV) - - entry a1, 32 # 32 byte frame for using call8 below - - mov a10, a7 # a10(->arg0): ecif - sub a11, a1, a6 # a11(->arg1): stack pointer - mov a7, a1 # fp - movsp a1, a11 # set new sp = old_sp - bytes - - movi a8, ffi_prep_args - callx8 a8 # ffi_prep_args(ecif, stack) - - # prepare to move stack pointer back up to 6 arguments - # note that 'bytes' is already aligned - - movi a10, 6*4 - sub a11, a6, a10 - movgez a6, a10, a11 - add a6, a1, a6 - - - # we can pass up to 6 arguments in registers - # for simplicity, just load 6 arguments - # (the stack size is at least 32 bytes, so no risk to cross boundaries) - - l32i a10, a1, 0 - l32i a11, a1, 4 - l32i a12, a1, 8 - l32i a13, a1, 12 - l32i a14, a1, 16 - l32i a15, a1, 20 - - # move stack pointer - - movsp a1, a6 - - callx8 a5 # (*fn)(args...) - - # Handle return value(s) - - beqz a2, .Lexit - - movi a5, FFI_TYPE_STRUCT - bne a4, a5, .Lstore - movi a5, 16 - blt a5, a3, .Lexit - - s32i a10, a2, 0 - blti a3, 5, .Lexit - addi a3, a3, -1 - s32i a11, a2, 4 - blti a3, 8, .Lexit - s32i a12, a2, 8 - blti a3, 12, .Lexit - s32i a13, a2, 12 - -.Lexit: retw - -.Lstore: - addi a4, a4, -FFI_TYPE_UINT8 - bgei a4, 7, .Lexit # should never happen - movi a6, store_calls - add a4, a4, a4 - addx4 a6, a4, a6 # store_table + idx * 8 - jx a6 - - .align 8 -store_calls: - # UINT8 - s8i a10, a2, 0 - retw - - # SINT8 - .align 8 - s8i a10, a2, 0 - retw - - # UINT16 - .align 8 - s16i a10, a2, 0 - retw - - # SINT16 - .align 8 - s16i a10, a2, 0 - retw - - # UINT32 - .align 8 - s32i a10, a2, 0 - retw - - # SINT32 - .align 8 - s32i a10, a2, 0 - retw - - # UINT64 - .align 8 - s32i a10, a2, 0 - s32i a11, a2, 4 - retw - -END(ffi_call_SYSV) - - -/* - * void ffi_cacheflush (unsigned long start, unsigned long end) - */ - -#define EXTRA_ARGS_SIZE 24 - -ENTRY(ffi_cacheflush) - - entry a1, 16 - -1: -#if XCHAL_DCACHE_SIZE - dhwbi a2, 0 -#endif -#if XCHAL_ICACHE_SIZE - ihi a2, 0 -#endif - addi a2, a2, 4 - blt a2, a3, 1b - - retw - -END(ffi_cacheflush) - -/* ffi_trampoline is copied to the stack */ - -ENTRY(ffi_trampoline) - - entry a1, 16 + (FFI_REGISTER_NARGS * 4) + (4 * 4) # [ 0] - j 2f # [ 3] - .align 4 # [ 6] -1: .long 0 # [ 8] -2: l32r a15, 1b # [12] - _mov a14, a0 # [15] - callx0 a15 # [18] - # [21] -END(ffi_trampoline) - -/* - * ffi_closure() - * - * a0: closure + 21 - * a14: return address (a0) - */ - -ENTRY(ffi_closure_SYSV) - - /* intentionally omitting entry here */ - - # restore return address (a0) and move pointer to closure to a10 - addi a10, a0, -21 - mov a0, a14 - - # allow up to 4 arguments as return values - addi a11, a1, 4 * 4 - - # save up to 6 arguments to stack (allocated by entry below) - s32i a2, a11, 0 - s32i a3, a11, 4 - s32i a4, a11, 8 - s32i a5, a11, 12 - s32i a6, a11, 16 - s32i a7, a11, 20 - - movi a8, ffi_closure_SYSV_inner - mov a12, a1 - callx8 a8 # .._inner(*closure, **avalue, *rvalue) - - # load up to four return arguments - l32i a2, a1, 0 - l32i a3, a1, 4 - l32i a4, a1, 8 - l32i a5, a1, 12 - - # (sign-)extend return value - movi a11, FFI_TYPE_UINT8 - bne a10, a11, 1f - extui a2, a2, 0, 8 - retw - -1: movi a11, FFI_TYPE_SINT8 - bne a10, a11, 1f - sext a2, a2, 7 - retw - -1: movi a11, FFI_TYPE_UINT16 - bne a10, a11, 1f - extui a2, a2, 0, 16 - retw - -1: movi a11, FFI_TYPE_SINT16 - bne a10, a11, 1f - sext a2, a2, 15 - -1: retw - -END(ffi_closure_SYSV) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/stamp-h.in b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/stamp-h.in deleted file mode 100644 index 9788f70..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/stamp-h.in +++ /dev/null @@ -1 +0,0 @@ -timestamp diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/Makefile.am b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/Makefile.am deleted file mode 100644 index 40c789f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/Makefile.am +++ /dev/null @@ -1,117 +0,0 @@ -## Process this file with automake to produce Makefile.in. - -AUTOMAKE_OPTIONS = foreign dejagnu - -EXTRA_DEJAGNU_SITE_CONFIG=../local.exp - -CLEANFILES = *.exe core* *.log *.sum - -EXTRA_DIST = lib/target-libpath.exp lib/libffi.exp lib/wrapper.exp \ -libffi.call/strlen4.c libffi.call/cls_multi_sshort.c \ -libffi.call/cls_align_longdouble_split2.c libffi.call/cls_1_1byte.c \ -libffi.call/struct10.c libffi.call/cls_uint_va.c \ -libffi.call/many_mixed.c libffi.call/float.c libffi.call/struct5.c \ -libffi.call/return_fl3.c libffi.call/cls_3_1byte.c \ -libffi.call/return_fl1.c libffi.call/cls_many_mixed_args.c \ -libffi.call/cls_20byte1.c libffi.call/cls_pointer_stack.c \ -libffi.call/cls_align_float.c libffi.call/call.exp \ -libffi.call/pyobjc-tc.c libffi.call/float_va.c \ -libffi.call/cls_5_1_byte.c libffi.call/cls_9byte1.c \ -libffi.call/cls_align_uint32.c libffi.call/stret_medium.c \ -libffi.call/cls_3byte1.c libffi.call/cls_align_uint64.c \ -libffi.call/cls_longdouble_va.c libffi.call/cls_align_pointer.c \ -libffi.call/cls_19byte.c libffi.call/cls_ushort.c \ -libffi.call/cls_align_sint32.c libffi.call/struct8.c \ -libffi.call/pr1172638.c libffi.call/cls_ulonglong.c \ -libffi.call/cls_struct_va1.c libffi.call/cls_9byte2.c \ -libffi.call/closure_fn5.c libffi.call/cls_5byte.c \ -libffi.call/cls_3float.c libffi.call/return_sc.c \ -libffi.call/cls_schar.c libffi.call/closure_fn4.c \ -libffi.call/cls_uchar_va.c libffi.call/closure_fn0.c \ -libffi.call/huge_struct.c libffi.call/va_struct1.c \ -libffi.call/cls_ushort_va.c libffi.call/struct9.c libffi.call/va_1.c \ -libffi.call/cls_64byte.c libffi.call/va_struct2.c \ -libffi.call/cls_longdouble.c libffi.call/return_fl2.c \ -libffi.call/cls_ulong_va.c libffi.call/cls_6_1_byte.c \ -libffi.call/cls_align_uint16.c libffi.call/closure_fn2.c \ -libffi.call/align_mixed.c libffi.call/unwindtest_ffi_call.cc \ -libffi.call/cls_multi_ushortchar.c libffi.call/cls_8byte.c \ -libffi.call/ffitest.h libffi.call/nested_struct8.c \ -libffi.call/cls_pointer.c libffi.call/nested_struct2.c \ -libffi.call/nested_struct.c libffi.call/struct4.c \ -libffi.call/cls_multi_schar.c libffi.call/cls_align_longdouble_split.c \ -libffi.call/cls_uchar.c libffi.call/return_ldl.c \ -libffi.call/nested_struct9.c libffi.call/cls_float.c \ -libffi.call/stret_medium2.c libffi.call/closure_loc_fn0.c \ -libffi.call/float3.c libffi.call/cls_6byte.c libffi.call/return_sl.c \ -libffi.call/closure_simple.c libffi.call/return_dbl1.c \ -libffi.call/cls_align_double.c libffi.call/cls_multi_uchar.c \ -libffi.call/err_bad_typedef.c libffi.call/cls_4_1byte.c \ -libffi.call/closure_fn3.c libffi.call/return_ll1.c \ -libffi.call/return_dbl2.c libffi.call/cls_align_sint64.c \ -libffi.call/nested_struct1.c libffi.call/negint.c \ -libffi.call/nested_struct3.c libffi.call/unwindtest.cc \ -libffi.call/struct2.c libffi.call/struct3.c libffi.call/return_fl.c \ -libffi.call/nested_struct5.c libffi.call/cls_multi_ushort.c \ -libffi.call/nested_struct11.c libffi.call/cls_multi_sshortchar.c \ -libffi.call/cls_align_longdouble.c libffi.call/cls_dbls_struct.c \ -libffi.call/cls_many_mixed_float_double.c libffi.call/stret_large.c \ -libffi.call/stret_large2.c libffi.call/cls_align_sint16.c \ -libffi.call/cls_2byte.c libffi.call/offsets.c libffi.call/struct7.c \ -libffi.call/nested_struct4.c libffi.call/problem1.c \ -libffi.call/va_struct3.c libffi.call/testclosure.c \ -libffi.call/float1.c libffi.call/nested_struct6.c \ -libffi.call/cls_4byte.c libffi.call/cls_24byte.c \ -libffi.call/uninitialized.c libffi.call/many2.c \ -libffi.call/nested_struct10.c libffi.call/struct6.c \ -libffi.call/strlen2.c libffi.call/float2.c libffi.call/cls_uint.c \ -libffi.call/cls_12byte.c libffi.call/return_ul.c \ -libffi.call/cls_sint.c libffi.call/cls_7_1_byte.c \ -libffi.call/struct1.c libffi.call/cls_sshort.c \ -libffi.call/cls_16byte.c libffi.call/strlen3.c \ -libffi.call/nested_struct7.c libffi.call/cls_double_va.c \ -libffi.call/return_dbl.c libffi.call/cls_3byte2.c libffi.call/float4.c \ -libffi.call/cls_double.c libffi.call/many.c libffi.call/cls_7byte.c \ -libffi.call/strlen.c libffi.call/closure_fn6.c libffi.call/return_uc.c \ -libffi.call/closure_fn1.c libffi.call/cls_20byte.c \ -libffi.call/cls_18byte.c libffi.call/err_bad_abi.c \ -libffi.call/many_double.c libffi.call/return_ll.c \ -libffi.call/promotion.c libffi.complex/complex_defs_longdouble.inc \ -libffi.complex/cls_align_complex_float.c \ -libffi.complex/cls_complex_va_float.c \ -libffi.complex/cls_complex_struct_float.c \ -libffi.complex/return_complex2_longdouble.c \ -libffi.complex/cls_complex_float.c \ -libffi.complex/return_complex_longdouble.c \ -libffi.complex/return_complex2_float.c libffi.complex/cls_complex.inc \ -libffi.complex/cls_complex_va_longdouble.c \ -libffi.complex/return_complex_double.c \ -libffi.complex/return_complex.inc libffi.complex/many_complex.inc \ -libffi.complex/complex_float.c libffi.complex/cls_align_complex.inc \ -libffi.complex/return_complex2_double.c \ -libffi.complex/many_complex_float.c libffi.complex/ffitest.h \ -libffi.complex/return_complex1_double.c \ -libffi.complex/cls_complex_struct_longdouble.c \ -libffi.complex/complex_defs_double.inc \ -libffi.complex/cls_complex_va_double.c \ -libffi.complex/many_complex_double.c \ -libffi.complex/return_complex2.inc \ -libffi.complex/return_complex1_float.c \ -libffi.complex/complex_longdouble.c \ -libffi.complex/complex_defs_float.inc \ -libffi.complex/cls_complex_double.c \ -libffi.complex/cls_align_complex_double.c \ -libffi.complex/cls_align_complex_longdouble.c \ -libffi.complex/complex_double.c libffi.complex/cls_complex_va.inc \ -libffi.complex/many_complex_longdouble.c libffi.complex/complex.inc \ -libffi.complex/return_complex1_longdouble.c \ -libffi.complex/complex_int.c libffi.complex/cls_complex_longdouble.c \ -libffi.complex/cls_complex_struct_double.c \ -libffi.complex/return_complex1.inc libffi.complex/complex.exp \ -libffi.complex/cls_complex_struct.inc \ -libffi.complex/return_complex_float.c libffi.go/closure1.c \ -libffi.go/aa-direct.c libffi.go/ffitest.h libffi.go/go.exp \ -libffi.go/static-chain.h libffi.bhaible/bhaible.exp \ -libffi.bhaible/test-call.c libffi.bhaible/alignof.h \ -libffi.bhaible/testcases.c libffi.bhaible/test-callback.c \ -libffi.bhaible/Makefile libffi.bhaible/README config/default.exp diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/config/default.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/config/default.exp deleted file mode 100644 index 90967cc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/config/default.exp +++ /dev/null @@ -1 +0,0 @@ -load_lib "standard.exp" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/libffi.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/libffi.exp deleted file mode 100644 index 28f793a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/libffi.exp +++ /dev/null @@ -1,636 +0,0 @@ -# Copyright (C) 2003, 2005, 2008, 2009, 2010, 2011, 2014 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 - -proc check_effective_target_gccbug { } { - global has_gccbug - return $has_gccbug -} - -# Return 1 if the target matches the effective target 'arg', 0 otherwise. -# This can be used with any check_* proc that takes no argument and -# returns only 1 or 0. It could be used with check_* procs that take -# arguments with keywords that pass particular arguments. - -proc is-effective-target { arg } { - global et_index - set selected 0 - if { ![info exists et_index] } { - # Initialize the effective target index that is used in some - # check_effective_target_* procs. - set et_index 0 - } - if { [info procs check_effective_target_${arg}] != [list] } { - set selected [check_effective_target_${arg}] - } else { - error "unknown effective target keyword `$arg'" - } - verbose "is-effective-target: $arg $selected" 2 - return $selected -} - -proc is-effective-target-keyword { arg } { - if { [info procs check_effective_target_${arg}] != [list] } { - return 1 - } else { - return 0 - } -} - -# Intercept the call to the DejaGnu version of dg-process-target to -# support use of an effective-target keyword in place of a list of -# target triplets to xfail or skip a test. -# -# The argument to dg-process-target is the keyword "target" or "xfail" -# followed by a selector: -# target-triplet-1 ... -# effective-target-keyword -# selector-expression -# -# For a target list the result is "S" if the target is selected, "N" otherwise. -# For an xfail list the result is "F" if the target is affected, "P" otherwise. - -# In contexts that allow either "target" or "xfail" the argument can be -# target selector1 xfail selector2 -# which returns "N" if selector1 is not selected, otherwise the result of -# "xfail selector2". -# -# A selector expression appears within curly braces and uses a single logical -# operator: !, &&, or ||. An operand is another selector expression, an -# effective-target keyword, or a list of target triplets within quotes or -# curly braces. - -if { [info procs saved-dg-process-target] == [list] } { - rename dg-process-target saved-dg-process-target - - # Evaluate an operand within a selector expression. - proc selector_opd { op } { - set selector "target" - lappend selector $op - set answer [ expr { [dg-process-target $selector] == "S" } ] - verbose "selector_opd: `$op' $answer" 2 - return $answer - } - - # Evaluate a target triplet list within a selector expression. - # Unlike other operands, this needs to be expanded from a list to - # the same string as "target". - proc selector_list { op } { - set selector "target [join $op]" - set answer [ expr { [dg-process-target $selector] == "S" } ] - verbose "selector_list: `$op' $answer" 2 - return $answer - } - - # Evaluate a selector expression. - proc selector_expression { exp } { - if { [llength $exp] == 2 } { - if [string match "!" [lindex $exp 0]] { - set op1 [lindex $exp 1] - set answer [expr { ! [selector_opd $op1] }] - } else { - # Assume it's a list of target triplets. - set answer [selector_list $exp] - } - } elseif { [llength $exp] == 3 } { - set op1 [lindex $exp 0] - set opr [lindex $exp 1] - set op2 [lindex $exp 2] - if [string match "&&" $opr] { - set answer [expr { [selector_opd $op1] && [selector_opd $op2] }] - } elseif [string match "||" $opr] { - set answer [expr { [selector_opd $op1] || [selector_opd $op2] }] - } else { - # Assume it's a list of target triplets. - set answer [selector_list $exp] - } - } else { - # Assume it's a list of target triplets. - set answer [selector_list $exp] - } - - verbose "selector_expression: `$exp' $answer" 2 - return $answer - } - - # Evaluate "target selector" or "xfail selector". - - proc dg-process-target-1 { args } { - verbose "dg-process-target-1: `$args'" 2 - - # Extract the 'what' keyword from the argument list. - set selector [string trim [lindex $args 0]] - if [regexp "^xfail " $selector] { - set what "xfail" - } elseif [regexp "^target " $selector] { - set what "target" - } else { - error "syntax error in target selector \"$selector\"" - } - - # Extract the rest of the list, which might be a keyword. - regsub "^${what}" $selector "" rest - set rest [string trim $rest] - - if [is-effective-target-keyword $rest] { - # The selector is an effective target keyword. - if [is-effective-target $rest] { - return [expr { $what == "xfail" ? "F" : "S" }] - } else { - return [expr { $what == "xfail" ? "P" : "N" }] - } - } - - if [string match "{*}" $rest] { - if [selector_expression [lindex $rest 0]] { - return [expr { $what == "xfail" ? "F" : "S" }] - } else { - return [expr { $what == "xfail" ? "P" : "N" }] - } - } - - # The selector is not an effective-target keyword, so process - # the list of target triplets. - return [saved-dg-process-target $selector] - } - - # Intercept calls to the DejaGnu function. In addition to - # processing "target selector" or "xfail selector", handle - # "target selector1 xfail selector2". - - proc dg-process-target { args } { - verbose "replacement dg-process-target: `$args'" 2 - - set selector [string trim [lindex $args 0]] - - # If the argument list contains both 'target' and 'xfail', - # process 'target' and, if that succeeds, process 'xfail'. - if [regexp "^target .* xfail .*" $selector] { - set xfail_index [string first "xfail" $selector] - set xfail_selector [string range $selector $xfail_index end] - set target_selector [string range $selector 0 [expr $xfail_index-1]] - set target_selector [string trim $target_selector] - if { [dg-process-target-1 $target_selector] == "N" } { - return "N" - } - return [dg-process-target-1 $xfail_selector] - - } - return [dg-process-target-1 $selector] - } -} - -# 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 - global compiler_vendor - - if ![info exists blddirffi] { - set blddirffi [pwd]/.. - } - - verbose "libffi $blddirffi" - - # Which compiler are we building with? - set tmp [grep "$blddirffi/config.log" "^ax_cv_c_compiler_vendor.*$"] - regexp -- {^[^=]*=(.*)$} $tmp nil compiler_vendor - - if { [string match $compiler_vendor "gnu"] } { - 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 - global compiler_vendor - - 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 "additional_flags=$TOOL_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" - - if { [string match "aarch64*-*-linux*" $target_triplet] } { - lappend options "libs= -lpthread" - } - - # this may be required for g++, but just confused clang. - if { [string match "*.cc" $source] } { - lappend options "c++" - } - - if { [string match "arc*-*-linux*" $target_triplet] } { - lappend options "libs= -lpthread" - } - - verbose "options: $options" - return [target_compile $source $dest $type $options] -} - -# TEST should be a preprocessor condition. Returns true if it holds. -proc libffi_feature_test { test } { - set src "ffitest[pid].c" - - set f [open $src "w"] - puts $f "#include " - puts $f $test - puts $f "/* OK */" - puts $f "#else" - puts $f "# error Failed $test" - puts $f "#endif" - close $f - - set lines [libffi_target_compile $src /dev/null assembly ""] - file delete $src - - return [string match "" $lines] -} - -# 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} - } - } -} - -proc run-many-tests { testcases extra_flags } { - global compiler_vendor - global has_gccbug - switch $compiler_vendor { - "clang" { - set common "-W -Wall" - set optimizations { "-O0" "-O2" "-Os" } - } - "gnu" { - set common "-W -Wall -Wno-psabi" - set optimizations { "-O0" "-O2" "-Os" "-O2 -fomit-frame-pointer" } - } - default { - # Assume we are using the vendor compiler. - set common "" - set optimizations { "" } - } - } - - set targetabis { "" } - if [string match $compiler_vendor "gnu"] { - if [libffi_feature_test "#ifdef __i386__"] { - set targetabis { - "" - "-DABI_NUM=FFI_STDCALL -DABI_ATTR=__STDCALL__" - "-DABI_NUM=FFI_THISCALL -DABI_ATTR=__THISCALL__" - "-DABI_NUM=FFI_FASTCALL -DABI_ATTR=__FASTCALL__" - } - } elseif { [istarget "x86_64-*-*"] \ - && [libffi_feature_test "#if !defined __ILP32__ \ - && !defined __i386__"] } { - set targetabis { - "" - "-DABI_NUM=FFI_GNUW64 -DABI_ATTR=__MSABI__" - } - } - } - - set common [ concat $common $extra_flags ] - foreach test $testcases { - set testname [file tail $test] - if [search_for $test "ABI_NUM"] { - set abis $targetabis - } else { - set abis { "" } - } - foreach opt $optimizations { - foreach abi $abis { - set options [concat $common $opt $abi] - set has_gccbug false; - if { [string match $compiler_vendor "gnu"] \ - && [string match "*MSABI*" $abi] \ - && ( ( [string match "*DGTEST=57 *" $common] \ - && [string match "*call.c*" $testname] ) \ - || ( [string match "*DGTEST=54 *" $common] \ - && [string match "*callback*" $testname] ) \ - || [string match "*DGTEST=55 *" $common] \ - || [string match "*DGTEST=56 *" $common] ) } then { - set has_gccbug true; - } - verbose "Testing $testname, $options" 1 - dg-test $test $options "" - } - } - } -} - -# 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.25/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp deleted file mode 100644 index 6b7beba..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/target-libpath.exp +++ /dev/null @@ -1,283 +0,0 @@ -# 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 -set orig_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_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 orig_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 - } - if [info exists env(PATH)] { - set orig_path "$env(PATH)" - set orig_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" - } - if { [istarget *-*-cygwin*] || [istarget *-*-mingw*] } { - if { $orig_path_saved } { - setenv PATH "$ld_library_path:$orig_path" - } else { - setenv 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_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 orig_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 - } - if { $orig_path_saved } { - setenv PATH "$orig_path" - } elseif [info exists env(PATH)] { - unsetenv 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.25/ext/ffi_c/libffi/testsuite/lib/wrapper.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/wrapper.exp deleted file mode 100644 index 4e5ae43..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/lib/wrapper.exp +++ /dev/null @@ -1,45 +0,0 @@ -# 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.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile deleted file mode 100644 index 3322de9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +++ /dev/null @@ -1,28 +0,0 @@ -CC = gcc -CFLAGS = -O2 -Wall -prefix = -includedir = $(prefix)/include -libdir = $(prefix)/lib -CPPFLAGS = -I$(includedir) -LDFLAGS = -L$(libdir) -Wl,-rpath,$(libdir) - -all: check-call check-callback - -test-call: test-call.c testcases.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-call test-call.c -lffi - -test-callback: test-callback.c testcases.c - $(CC) $(CPPFLAGS) $(CFLAGS) $(LDFLAGS) -o test-callback test-callback.c -lffi - -check-call: test-call - ./test-call > test-call.out - LC_ALL=C uniq -u < test-call.out > failed-call - test '!' -s failed-call - -check-callback: test-callback - ./test-callback > test-callback.out - LC_ALL=C uniq -u < test-callback.out > failed-callback - test '!' -s failed-callback - -clean: - rm -f test-call test-callback test-call.out test-callback.out failed-call failed-callback diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/README b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/README deleted file mode 100644 index be8540b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +++ /dev/null @@ -1,78 +0,0 @@ -This package contains a test suite for libffi. - -This test suite can be compiled with a C compiler. No need for 'expect' -or some other package that is often not installed. - -The test suite consists of 81 C functions, each with a different signature. -* test-call verifies that calling each function directly produces the same - results as calling the function indirectly through 'ffi_call'. -* test-callback verifies that calling each function directly produces the same - results as calling a function that is a callback (object build by - 'ffi_prep_closure_loc') and simulates the original function. - -Each direct or indirect invocation should produce one line of output to -stdout. A correct output consists of paired lines, such as - -void f(void): -void f(void): -int f(void):->99 -int f(void):->99 -int f(int):(1)->2 -int f(int):(1)->2 -int f(2*int):(1,2)->3 -int f(2*int):(1,2)->3 -... - -The Makefile then creates two files: -* failed-call, which consists of the non-paired lines of output of - 'test-call', -* failed-callback, which consists of the non-paired lines of output of - 'test-callback'. - -The test suite passes if both failed-call and failed-callback come out -as empty. - - -How to use the test suite -------------------------- - -1. Modify the Makefile's variables - prefix = the directory in which libffi was installed - CC = the C compiler, often with options such as "-m32" or "-m64" - that enforce a certain ABI, - CFLAGS = optimization options (need to change them only for non-GCC - compilers) -2. Run "make". If it fails already in "test-call", run also - "make check-callback". -3. If this failed, inspect the output files. - - -How to interpret the results ----------------------------- - -The failed-call and failed-callback files consist of paired lines: -The first line is the result of the direct invocation. -The second line is the result of invocation through libffi. - -For example, this output - -uchar f(uchar,ushort,uint,ulong):(97,2,3,4)->255 -uchar f(uchar,ushort,uint,ulong):(97,2,3,4)->0 - -indicates that the arguments were passed correctly, but the return -value came out wrong. - -And this output - -float f(17*float,3*int,L):(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,6,7,8,561,1105,1729,2465,2821,6601)->15319.1 -float f(17*float,3*int,L):(0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.1,1.2,1.3,1.4,1.5,1.6,1.7,1.8,-140443648,10,268042216,-72537980,-140443648,-140443648,-140443648,-140443648,-140443648)->-6.47158e+08 - -indicates that integer arguments that come after 17 floating-point arguments -were not passed correctly. - - -Credits -------- - -The test suite is based on the one of GNU libffcall-2.0. -Authors: Bill Triggs, Bruno Haible diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h deleted file mode 100644 index 00604a5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +++ /dev/null @@ -1,50 +0,0 @@ -/* Determine alignment of types. - Copyright (C) 2003-2004, 2006, 2009-2017 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 . */ - -#ifndef _ALIGNOF_H -#define _ALIGNOF_H - -#include - -/* alignof_slot (TYPE) - Determine the alignment of a structure slot (field) of a given type, - at compile time. Note that the result depends on the ABI. - This is the same as alignof (TYPE) and _Alignof (TYPE), defined in - if __alignof_is_defined is 1. - Note: The result cannot be used as a value for an 'enum' constant, - due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ -#if defined __cplusplus - template struct alignof_helper { char __slot1; type __slot2; }; -# define alignof_slot(type) offsetof (alignof_helper, __slot2) -#else -# define alignof_slot(type) offsetof (struct { char __slot1; type __slot2; }, __slot2) -#endif - -/* alignof_type (TYPE) - Determine the good alignment of an object of the given type at compile time. - Note that this is not necessarily the same as alignof_slot(type). - For example, with GNU C on x86 platforms: alignof_type(double) = 8, but - - when -malign-double is not specified: alignof_slot(double) = 4, - - when -malign-double is specified: alignof_slot(double) = 8. - Note: The result cannot be used as a value for an 'enum' constant, - due to bugs in HP-UX 10.20 cc and AIX 3.2.5 xlc. */ -#if defined __GNUC__ || defined __IBM__ALIGNOF__ -# define alignof_type __alignof__ -#else -# define alignof_type alignof_slot -#endif - -#endif /* _ALIGNOF_H */ diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp deleted file mode 100644 index 4e5051b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +++ /dev/null @@ -1,58 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014, 2018 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 compiler_vendor -global has_gccbug - -# The conversion of this testsuite into a dejagnu compatible testsuite -# was done in a pretty lazy fashion, and requires the use of compiler -# flags to disable warnings for now. -if { [string match $compiler_vendor "gnu"] } { - set warning_options "-Wno-unused-variable -Wno-unused-parameter -Wno-unused-but-set-variable -Wno-uninitialized"; -} -if { [string match $compiler_vendor "microsoft"] } { - # -wd4996 suggest use of vsprintf_s instead of vsprintf - # -wd4116 unnamed type definition - # -wd4101 unreferenced local variable - # -wd4244 warning about implicit double to float conversion - set warning_options "-wd4996 -wd4116 -wd4101 -wd4244"; -} -if { ![string match $compiler_vendor "microsoft"] && ![string match $compiler_vendor "gnu"] } { - set warning_options "-Wno-unused-variable -Wno-unused-parameter -Wno-uninitialized"; -} - - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/test-call.c]] - -for {set i 1} {$i < 82} {incr i} { - run-many-tests $tlist [format "-DDGTEST=%d %s" $i $warning_options] -} - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/test-callback.c]] - -for {set i 1} {$i < 81} {incr i} { - run-many-tests $tlist [format "-DDGTEST=%d %s" $i $warning_options] -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c deleted file mode 100644 index caa77de..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +++ /dev/null @@ -1,1745 +0,0 @@ -/** - Copyright 1993 Bill Triggs - Copyright 1995-2017 Bruno Haible - - 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, see . -**/ - -/* { dg-do run { xfail gccbug } }*/ - -#include -#include -#include -#include -#include "alignof.h" -#include - -/* libffi testsuite local changes -------------------------------- */ -#ifdef DGTEST -/* Redefine exit(1) as a test failure */ -#define exit(V) (void)((V) ? (abort(), 1) : exit(0)) -int count = 0; -char rbuf1[2048]; -char rbuf2[2048]; -int _fprintf(FILE *stream, const char *format, ...) -{ - va_list args; - va_start(args, format); - - switch (count++) - { - case 0: - case 1: - vsprintf(&rbuf1[strlen(rbuf1)], format, args); - break; - case 2: - printf("%s", rbuf1); - vsprintf(rbuf2, format, args); - break; - case 3: - vsprintf(&rbuf2[strlen(rbuf2)], format, args); - printf("%s", rbuf2); - if (strcmp (rbuf1, rbuf2)) abort(); - break; - } - - va_end(args); - - return 0; -} -#define fprintf _fprintf -#endif -/* --------------------------------------------------------------- */ - -#include "testcases.c" - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#endif - -/* Definitions that ought to be part of libffi. */ -static ffi_type ffi_type_char; -#define ffi_type_slonglong ffi_type_sint64 -#define ffi_type_ulonglong ffi_type_uint64 - -/* libffi does not support arrays inside structs. */ -#define SKIP_EXTRA_STRUCTS - -#define FFI_PREP_CIF(cif,argtypes,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,sizeof(argtypes)/sizeof(argtypes[0]),&rettype,argtypes) != FFI_OK) abort() -#define FFI_PREP_CIF_NOARGS(cif,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,0,&rettype,NULL) != FFI_OK) abort() -#define FFI_CALL(cif,fn,args,retaddr) \ - ffi_call(&(cif),(void(*)(void))(fn),retaddr,args) - -long clear_traces_i (long a, long b, long c, long d, long e, long f, long g, long h, - long i, long j, long k, long l, long m, long n, long o, long p) -{ return 0; } -float clear_traces_f (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, float n, - float o, float p) -{ return 0.0; } -double clear_traces_d (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, - double o, double p) -{ return 0.0; } -J clear_traces_J (void) -{ J j; j.l1 = j.l2 = 0; return j; } -void clear_traces (void) -{ clear_traces_i(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - clear_traces_f(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); - clear_traces_d(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); - clear_traces_J(); -} - -void - void_tests (void) -{ -#if (!defined(DGTEST)) || DGTEST == 1 - v_v(); - clear_traces(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_void); - { - FFI_CALL(cif,v_v,NULL,NULL); - } - } -#endif - return; -} -void - int_tests (void) -{ - int ir; - ffi_arg retvalue; -#if (!defined(DGTEST)) || DGTEST == 2 - ir = i_v(); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_sint); - { - FFI_CALL(cif,i_v,NULL,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 3 - ir = i_i(i1); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1 }; - FFI_CALL(cif,i_i,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 4 - ir = i_i2(i1,i2); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2 }; - FFI_CALL(cif,i_i2,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 5 - ir = i_i4(i1,i2,i3,i4); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &i4 }; - FFI_CALL(cif,i_i4,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 6 - ir = i_i8(i1,i2,i3,i4,i5,i6,i7,i8); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8 }; - FFI_CALL(cif,i_i8,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 7 - ir = i_i16(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &i4, &i5, &i6, &i7, &i8, &i9, &i10, &i11, &i12, &i13, &i14, &i15, &i16 }; - FFI_CALL(cif,i_i16,args,&retvalue); - ir = retvalue; - } - } - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - - return; -} -void - float_tests (void) -{ - float fr; - -#if (!defined(DGTEST)) || DGTEST == 8 - fr = f_f(f1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1 }; - FFI_CALL(cif,f_f,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 9 - fr = f_f2(f1,f2); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2 }; - FFI_CALL(cif,f_f2,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 10 - fr = f_f4(f1,f2,f3,f4); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4 }; - FFI_CALL(cif,f_f4,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 11 - fr = f_f8(f1,f2,f3,f4,f5,f6,f7,f8); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8 }; - FFI_CALL(cif,f_f8,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 12 - fr = f_f16(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16 }; - FFI_CALL(cif,f_f16,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 13 - fr = f_f24(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16, &f17, &f18, &f19, &f20, &f21, &f22, &f23, &f24 }; - FFI_CALL(cif,f_f24,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif -} -void - double_tests (void) -{ - double dr; - -#if (!defined(DGTEST)) || DGTEST == 14 - - dr = d_d(d1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1 }; - FFI_CALL(cif,d_d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 15 - dr = d_d2(d1,d2); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2 }; - FFI_CALL(cif,d_d2,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 16 - dr = d_d4(d1,d2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4 }; - FFI_CALL(cif,d_d4,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 17 - dr = d_d8(d1,d2,d3,d4,d5,d6,d7,d8); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8 }; - FFI_CALL(cif,d_d8,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 18 - dr = d_d16(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &d14, &d15, &d16 }; - FFI_CALL(cif,d_d16,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - return; -} -void - pointer_tests (void) -{ - void* vpr; - -#if (!defined(DGTEST)) || DGTEST == 19 - vpr = vp_vpdpcpsp(&uc1,&d2,str3,&I4); - fprintf(out,"->0x%p\n",vpr); - fflush(out); - vpr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_pointer); - { - void* puc1 = &uc1; - void* pd2 = &d2; - void* pstr3 = str3; - void* pI4 = &I4; - /*const*/ void* args[] = { &puc1, &pd2, &pstr3, &pI4 }; - FFI_CALL(cif,vp_vpdpcpsp,args,&vpr); - } - } - fprintf(out,"->0x%p\n",vpr); - fflush(out); -#endif - return; -} -void - mixed_number_tests (void) -{ - uchar ucr; - ushort usr; - float fr; - double dr; - long long llr; - - /* Unsigned types. - */ -#if (!defined(DGTEST)) || DGTEST == 20 - ucr = uc_ucsil(uc1, us2, ui3, ul4); - fprintf(out,"->%u\n",ucr); - fflush(out); - ucr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_uchar, &ffi_type_ushort, &ffi_type_uint, &ffi_type_ulong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_uchar); - { - ffi_arg r; - /*const*/ void* args[] = { &uc1, &us2, &ui3, &ul4 }; - FFI_CALL(cif,uc_ucsil,args,&r); - ucr = (uchar) r; - } - } - fprintf(out,"->%u\n",ucr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 21 - /* Mixed int & float types. - */ - dr = d_iidd(i1,i2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &i1, &i2, &d3, &d4 }; - FFI_CALL(cif,d_iidd,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 22 - dr = d_iiidi(i1,i2,i3,d4,i5); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &d4, &i5 }; - FFI_CALL(cif,d_iiidi,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 23 - dr = d_idid(i1,d2,i3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_double, &ffi_type_sint, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &i1, &d2, &i3, &d4 }; - FFI_CALL(cif,d_idid,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 24 - dr = d_fdi(f1,d2,i3); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &f1, &d2, &i3 }; - FFI_CALL(cif,d_fdi,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 25 - usr = us_cdcd(c1,d2,c3,d4); - fprintf(out,"->%u\n",usr); - fflush(out); - usr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_char, &ffi_type_double, &ffi_type_char, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_ushort); - { - ffi_arg rint; - /*const*/ void* args[] = { &c1, &d2, &c3, &d4 }; - FFI_CALL(cif,us_cdcd,args,&rint); - usr = (ushort) rint; - } - } - fprintf(out,"->%u\n",usr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 26 - /* Long long types. - */ - llr = ll_iiilli(i1,i2,i3,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &i1, &i2, &i3, &ll1, &i13 }; - FFI_CALL(cif,ll_iiilli,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 27 - llr = ll_flli(f13,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &f13, &ll1, &i13 }; - FFI_CALL(cif,ll_flli,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 28 - fr = f_fi(f1,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &i9 }; - FFI_CALL(cif,f_fi,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 29 - fr = f_f2i(f1,f2,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &i9 }; - FFI_CALL(cif,f_f2i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 30 - fr = f_f3i(f1,f2,f3,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &i9 }; - FFI_CALL(cif,f_f3i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 31 - fr = f_f4i(f1,f2,f3,f4,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &i9 }; - FFI_CALL(cif,f_f4i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 32 - fr = f_f7i(f1,f2,f3,f4,f5,f6,f7,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &i9 }; - FFI_CALL(cif,f_f7i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 33 - fr = f_f8i(f1,f2,f3,f4,f5,f6,f7,f8,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &i9 }; - FFI_CALL(cif,f_f8i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 34 - fr = f_f12i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &i9 }; - FFI_CALL(cif,f_f12i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 35 - fr = f_f13i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &i9 }; - FFI_CALL(cif,f_f13i,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 36 - dr = d_di(d1,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &i9 }; - FFI_CALL(cif,d_di,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 37 - dr = d_d2i(d1,d2,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &i9 }; - FFI_CALL(cif,d_d2i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 38 - dr = d_d3i(d1,d2,d3,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &i9 }; - FFI_CALL(cif,d_d3i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 39 - dr = d_d4i(d1,d2,d3,d4,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &i9 }; - FFI_CALL(cif,d_d4i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 40 - dr = d_d7i(d1,d2,d3,d4,d5,d6,d7,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &i9 }; - FFI_CALL(cif,d_d7i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 41 - dr = d_d8i(d1,d2,d3,d4,d5,d6,d7,d8,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &i9 }; - FFI_CALL(cif,d_d8i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 42 - dr = d_d12i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &i9 }; - FFI_CALL(cif,d_d12i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 43 - dr = d_d13i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &i9 }; - FFI_CALL(cif,d_d13i,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - return; -} -void - small_structure_return_tests (void) -{ -#if (!defined(DGTEST)) || DGTEST == 44 - { - Size1 r = S1_v(); - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size1_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Size1; - ffi_type_Size1.type = FFI_TYPE_STRUCT; - ffi_type_Size1.size = sizeof(Size1); - ffi_type_Size1.alignment = alignof_slot(Size1); - ffi_type_Size1.elements = ffi_type_Size1_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size1); - { - FFI_CALL(cif,S1_v,NULL,&r); - } - } - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 45 - { - Size2 r = S2_v(); - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size2_elements[] = { &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size2; - ffi_type_Size2.type = FFI_TYPE_STRUCT; - ffi_type_Size2.size = sizeof(Size2); - ffi_type_Size2.alignment = alignof_slot(Size2); - ffi_type_Size2.elements = ffi_type_Size2_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size2); - { - FFI_CALL(cif,S2_v,NULL,&r); - } - } - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 46 - { - Size3 r = S3_v(); - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size3_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size3; - ffi_type_Size3.type = FFI_TYPE_STRUCT; - ffi_type_Size3.size = sizeof(Size3); - ffi_type_Size3.alignment = alignof_slot(Size3); - ffi_type_Size3.elements = ffi_type_Size3_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size3); - { - FFI_CALL(cif,S3_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 47 - { - Size4 r = S4_v(); - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size4_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size4; - ffi_type_Size4.type = FFI_TYPE_STRUCT; - ffi_type_Size4.size = sizeof(Size4); - ffi_type_Size4.alignment = alignof_slot(Size4); - ffi_type_Size4.elements = ffi_type_Size4_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size4); - { - FFI_CALL(cif,S4_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 48 - { - Size7 r = S7_v(); - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size7_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size7; - ffi_type_Size7.type = FFI_TYPE_STRUCT; - ffi_type_Size7.size = sizeof(Size7); - ffi_type_Size7.alignment = alignof_slot(Size7); - ffi_type_Size7.elements = ffi_type_Size7_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size7); - { - FFI_CALL(cif,S7_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 49 - { - Size8 r = S8_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size8_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size8; - ffi_type_Size8.type = FFI_TYPE_STRUCT; - ffi_type_Size8.size = sizeof(Size8); - ffi_type_Size8.alignment = alignof_slot(Size8); - ffi_type_Size8.elements = ffi_type_Size8_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size8); - { - FFI_CALL(cif,S8_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 50 - { - Size12 r = S12_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size12_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size12; - ffi_type_Size12.type = FFI_TYPE_STRUCT; - ffi_type_Size12.size = sizeof(Size12); - ffi_type_Size12.alignment = alignof_slot(Size12); - ffi_type_Size12.elements = ffi_type_Size12_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size12); - { - FFI_CALL(cif,S12_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 51 - { - Size15 r = S15_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size15_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size15; - ffi_type_Size15.type = FFI_TYPE_STRUCT; - ffi_type_Size15.size = sizeof(Size15); - ffi_type_Size15.alignment = alignof_slot(Size15); - ffi_type_Size15.elements = ffi_type_Size15_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size15); - { - FFI_CALL(cif,S15_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - } -#endif -#if (!defined(DGTEST)) || DGTEST == 52 - { - Size16 r = S16_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - { - ffi_type* ffi_type_Size16_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size16; - ffi_type_Size16.type = FFI_TYPE_STRUCT; - ffi_type_Size16.size = sizeof(Size16); - ffi_type_Size16.alignment = alignof_slot(Size16); - ffi_type_Size16.elements = ffi_type_Size16_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size16); - { - FFI_CALL(cif,S16_v,NULL,&r); - } - } - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - } -#endif -} -void - structure_tests (void) -{ - Int Ir; - Char Cr; - Float Fr; - Double Dr; - J Jr; -#ifndef SKIP_EXTRA_STRUCTS - T Tr; - X Xr; -#endif - -#if (!defined(DGTEST)) || DGTEST == 53 - Ir = I_III(I1,I2,I3); - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); - Ir.x = 0; clear_traces(); - { - ffi_type* ffi_type_Int_elements[] = { &ffi_type_sint, NULL }; - ffi_type ffi_type_Int; - ffi_type_Int.type = FFI_TYPE_STRUCT; - ffi_type_Int.size = sizeof(Int); - ffi_type_Int.alignment = alignof_slot(Int); - ffi_type_Int.elements = ffi_type_Int_elements; - ffi_type* argtypes[] = { &ffi_type_Int, &ffi_type_Int, &ffi_type_Int }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Int); - { - /*const*/ void* args[] = { &I1, &I2, &I3 }; - FFI_CALL(cif,I_III,args,&Ir); - } - } - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 54 - Cr = C_CdC(C1,d2,C3); - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); - Cr.x = '\0'; clear_traces(); - { - ffi_type* ffi_type_Char_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Char; - ffi_type_Char.type = FFI_TYPE_STRUCT; - ffi_type_Char.size = sizeof(Char); - ffi_type_Char.alignment = alignof_slot(Char); - ffi_type_Char.elements = ffi_type_Char_elements; - ffi_type* argtypes[] = { &ffi_type_Char, &ffi_type_double, &ffi_type_Char }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Char); - { - /*const*/ void* args[] = { &C1, &d2, &C3 }; - FFI_CALL(cif,C_CdC,args,&Cr); - } - } - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 55 - Fr = F_Ffd(F1,f2,d3); - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); - Fr.x = 0.0; clear_traces(); - { - ffi_type* ffi_type_Float_elements[] = { &ffi_type_float, NULL }; - ffi_type ffi_type_Float; - ffi_type_Float.type = FFI_TYPE_STRUCT; - ffi_type_Float.size = sizeof(Float); - ffi_type_Float.alignment = alignof_slot(Float); - ffi_type_Float.elements = ffi_type_Float_elements; - ffi_type* argtypes[] = { &ffi_type_Float, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Float); - { - /*const*/ void* args[] = { &F1, &f2, &d3 }; - FFI_CALL(cif,F_Ffd,args,&Fr); - } - } - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 56 - Dr = D_fDd(f1,D2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_Double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - { - /*const*/ void* args[] = { &f1, &D2, &d3 }; - FFI_CALL(cif,D_fDd,args,&Dr); - } - } - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 57 - Dr = D_Dfd(D1,f2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_Double, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - { - /*const*/ void* args[] = { &D1, &f2, &d3 }; - FFI_CALL(cif,D_Dfd,args,&Dr); - } - } - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 58 - Jr = J_JiJ(J1,i2,J2); - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); - Jr.l1 = Jr.l2 = 0; clear_traces(); - { - ffi_type* ffi_type_J_elements[] = { &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_J; - ffi_type_J.type = FFI_TYPE_STRUCT; - ffi_type_J.size = sizeof(J); - ffi_type_J.alignment = alignof_slot(J); - ffi_type_J.elements = ffi_type_J_elements; - ffi_type* argtypes[] = { &ffi_type_J, &ffi_type_sint, &ffi_type_J }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_J); - { - /*const*/ void* args[] = { &J1, &i2, &J2 }; - FFI_CALL(cif,J_JiJ,args,&Jr); - } - } - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); -#endif -#ifndef SKIP_EXTRA_STRUCTS -#if (!defined(DGTEST)) || DGTEST == 59 - Tr = T_TcT(T1,' ',T2); - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); - Tr.c[0] = Tr.c[1] = Tr.c[2] = 0; clear_traces(); - { - ffi_type* ffi_type_T_elements[] = { ??, NULL }; - ffi_type ffi_type_T; - ffi_type_T.type = FFI_TYPE_STRUCT; - ffi_type_T.size = sizeof(T); - ffi_type_T.alignment = alignof_slot(T); - ffi_type_T.elements = ffi_type_T_elements; - ffi_type* argtypes[] = { &ffi_type_T, &ffi_type_char, &ffi_type_T }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_T); - { - char space = ' '; - /*const*/ void* args[] = { &T1, &space, &T2 }; - FFI_CALL(cif,T_TcT,args,&Tr); - } - } - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 60 - Xr = X_BcdB(B1,c2,d3,B2); - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); - Xr.c[0]=Xr.c1='\0'; clear_traces(); - { - ffi_type* ffi_type_X_elements[] = { ??, NULL }; - ffi_type ffi_type_X; - ffi_type_X.type = FFI_TYPE_STRUCT; - ffi_type_X.size = sizeof(X); - ffi_type_X.alignment = alignof_slot(X); - ffi_type_X.elements = ffi_type_X_elements; - ffi_type* argtypes[] = { &ffi_type_X, &ffi_type_char, &ffi_type_double, &ffi_type_X }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_X); - { - /*const*/ void* args[] = { &B1, &c2, &d3, &B2 }; - FFI_CALL(cif,X_BcdB,args,&Xr); - } - } - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); -#endif -#endif - - return; -} - -void - gpargs_boundary_tests (void) -{ - ffi_type* ffi_type_K_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_K; - ffi_type* ffi_type_L_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_L; - long lr; - long long llr; - float fr; - double dr; - - ffi_type_K.type = FFI_TYPE_STRUCT; - ffi_type_K.size = sizeof(K); - ffi_type_K.alignment = alignof_slot(K); - ffi_type_K.elements = ffi_type_K_elements; - - ffi_type_L.type = FFI_TYPE_STRUCT; - ffi_type_L.size = sizeof(L); - ffi_type_L.alignment = alignof_slot(L); - ffi_type_L.elements = ffi_type_L_elements; - -#if (!defined(DGTEST)) || DGTEST == 61 - lr = l_l0K(K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &K1, &l9 }; - FFI_CALL(cif,l_l0K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 62 - lr = l_l1K(l1,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &K1, &l9 }; - FFI_CALL(cif,l_l1K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 63 - lr = l_l2K(l1,l2,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &K1, &l9 }; - FFI_CALL(cif,l_l2K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 64 - lr = l_l3K(l1,l2,l3,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &K1, &l9 }; - FFI_CALL(cif,l_l3K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 65 - lr = l_l4K(l1,l2,l3,l4,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &K1, &l9 }; - FFI_CALL(cif,l_l4K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 66 - lr = l_l5K(l1,l2,l3,l4,l5,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &K1, &l9 }; - FFI_CALL(cif,l_l5K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 67 - lr = l_l6K(l1,l2,l3,l4,l5,l6,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &K1, &l9 }; - FFI_CALL(cif,l_l6K,args,&lr); - } - } - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 68 - fr = f_f17l3L(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - { - /*const*/ void* args[] = { &f1, &f2, &f3, &f4, &f5, &f6, &f7, &f8, &f9, &f10, &f11, &f12, &f13, &f14, &f15, &f16, &f17, &l6, &l7, &l8, &L1 }; - FFI_CALL(cif,f_f17l3L,args,&fr); - } - } - fprintf(out,"->%g\n",fr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 69 - dr = d_d17l3L(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &d1, &d2, &d3, &d4, &d5, &d6, &d7, &d8, &d9, &d10, &d11, &d12, &d13, &d14, &d15, &d16, &d17, &l6, &l7, &l8, &L1 }; - FFI_CALL(cif,d_d17l3L,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 70 - llr = ll_l2ll(l1,l2,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &ll1, &l9 }; - FFI_CALL(cif,ll_l2ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 71 - llr = ll_l3ll(l1,l2,l3,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &ll1, &l9 }; - FFI_CALL(cif,ll_l3ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 72 - llr = ll_l4ll(l1,l2,l3,l4,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &ll1, &l9 }; - FFI_CALL(cif,ll_l4ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 73 - llr = ll_l5ll(l1,l2,l3,l4,l5,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &ll1, &l9 }; - FFI_CALL(cif,ll_l5ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 74 - llr = ll_l6ll(l1,l2,l3,l4,l5,l6,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &ll1, &l9 }; - FFI_CALL(cif,ll_l6ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 75 - llr = ll_l7ll(l1,l2,l3,l4,l5,l6,l7,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &l7, &ll1, &l9 }; - FFI_CALL(cif,ll_l7ll,args,&llr); - } - } - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 76 - dr = d_l2d(l1,l2,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &d2, &l9 }; - FFI_CALL(cif,d_l2d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 77 - dr = d_l3d(l1,l2,l3,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &d2, &l9 }; - FFI_CALL(cif,d_l3d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 78 - dr = d_l4d(l1,l2,l3,l4,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &d2, &l9 }; - FFI_CALL(cif,d_l4d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 79 - dr = d_l5d(l1,l2,l3,l4,l5,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &d2, &l9 }; - FFI_CALL(cif,d_l5d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 80 - dr = d_l6d(l1,l2,l3,l4,l5,l6,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &d2, &l9 }; - FFI_CALL(cif,d_l6d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif -#if (!defined(DGTEST)) || DGTEST == 81 - dr = d_l7d(l1,l2,l3,l4,l5,l6,l7,d2,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - { - /*const*/ void* args[] = { &l1, &l2, &l3, &l4, &l5, &l6, &l7, &d2, &l9 }; - FFI_CALL(cif,d_l7d,args,&dr); - } - } - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - return; -} - -int - main (void) -{ - ffi_type_char = (char)(-1) < 0 ? ffi_type_schar : ffi_type_uchar; - out = stdout; - - void_tests(); - int_tests(); - float_tests(); - double_tests(); - pointer_tests(); - mixed_number_tests(); - small_structure_return_tests(); - structure_tests(); - gpargs_boundary_tests(); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c deleted file mode 100644 index 67a8145..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +++ /dev/null @@ -1,2885 +0,0 @@ -/* - * Copyright 1993 Bill Triggs - * Copyright 1995-2017 Bruno Haible - * - * 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, see . - */ - -/* { dg-do run { xfail gccbug } }*/ - -#include -#include -#include -#include -#include "alignof.h" -#include - -/* libffi testsuite local changes -------------------------------- */ -#ifdef DGTEST -/* Redefine exit(1) as a test failure */ -#define exit(V) (void)((V) ? (abort(), 1) : exit(0)) -int count = 0; -char rbuf1[2048]; -char rbuf2[2048]; -int _fprintf(FILE *stream, const char *format, ...) -{ - va_list args; - va_start(args, format); - - switch (count++) - { - case 0: - case 1: - vsprintf(&rbuf1[strlen(rbuf1)], format, args); - break; - case 2: - printf("%s", rbuf1); - vsprintf(rbuf2, format, args); - break; - case 3: - vsprintf(&rbuf2[strlen(rbuf2)], format, args); - printf("%s", rbuf2); - if (strcmp (rbuf1, rbuf2)) abort(); - break; - } - - va_end(args); - - return 0; -} -#define fprintf _fprintf -#endif -/* --------------------------------------------------------------- */ - -#include "testcases.c" - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#endif - -/* Definitions that ought to be part of libffi. */ -static ffi_type ffi_type_char; -#define ffi_type_slonglong ffi_type_sint64 -#define ffi_type_ulonglong ffi_type_uint64 - -/* libffi does not support arrays inside structs. */ -#define SKIP_EXTRA_STRUCTS - -#define FFI_PREP_CIF(cif,argtypes,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,sizeof(argtypes)/sizeof(argtypes[0]),&rettype,argtypes) != FFI_OK) abort() -#define FFI_PREP_CIF_NOARGS(cif,rettype) \ - if (ffi_prep_cif(&(cif),ABI_NUM,0,&rettype,NULL) != FFI_OK) abort() - -#if defined(__sparc__) && defined(__sun) && defined(__SUNPRO_C) /* SUNWspro cc */ -/* SunPRO cc miscompiles the simulator function for X_BcdB: d.i[1] is - * temporarily stored in %l2 and put onto the stack from %l2, but in between - * the copy of X has used %l2 as a counter without saving and restoring its - * value. - */ -#define SKIP_X -#endif -#if defined(__mipsn32__) && !defined(__GNUC__) -/* The X test crashes for an unknown reason. */ -#define SKIP_X -#endif - - -/* These functions simulate the behaviour of the functions defined in testcases.c. */ - -/* void tests */ -void v_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&v_v) { fprintf(out,"wrong data for v_v\n"); exit(1); } - fprintf(out,"void f(void):\n"); - fflush(out); -} - -/* int tests */ -void i_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_v) { fprintf(out,"wrong data for i_v\n"); exit(1); } - {int r=99; - fprintf(out,"int f(void):"); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i) { fprintf(out,"wrong data for i_i\n"); exit(1); } - int a = *(int*)(*args++); - int r=a+1; - fprintf(out,"int f(int):(%d)",a); - fflush(out); - *(ffi_arg*)retp = r; -} -void i_i2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i2) { fprintf(out,"wrong data for i_i2\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int r=a+b; - fprintf(out,"int f(2*int):(%d,%d)",a,b); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i4) { fprintf(out,"wrong data for i_i4\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - int d = *(int*)(*args++); - int r=a+b+c+d; - fprintf(out,"int f(4*int):(%d,%d,%d,%d)",a,b,c,d); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i8) { fprintf(out,"wrong data for i_i8\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - int d = *(int*)(*args++); - int e = *(int*)(*args++); - int f = *(int*)(*args++); - int g = *(int*)(*args++); - int h = *(int*)(*args++); - int r=a+b+c+d+e+f+g+h; - fprintf(out,"int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h); - fflush(out); - *(ffi_arg*)retp = r; -}} -void i_i16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&i_i16) { fprintf(out,"wrong data for i_i16\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - int d = *(int*)(*args++); - int e = *(int*)(*args++); - int f = *(int*)(*args++); - int g = *(int*)(*args++); - int h = *(int*)(*args++); - int i = *(int*)(*args++); - int j = *(int*)(*args++); - int k = *(int*)(*args++); - int l = *(int*)(*args++); - int m = *(int*)(*args++); - int n = *(int*)(*args++); - int o = *(int*)(*args++); - int p = *(int*)(*args++); - int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", - a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - *(ffi_arg*)retp = r; -}} - -/* float tests */ -void f_f_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f) { fprintf(out,"wrong data for f_f\n"); exit(1); } - {float a = *(float*)(*args++); - float r=a+1.0; - fprintf(out,"float f(float):(%g)",a); - fflush(out); - *(float*)retp = r; -}} -void f_f2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f2) { fprintf(out,"wrong data for f_f2\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float r=a+b; - fprintf(out,"float f(2*float):(%g,%g)",a,b); - fflush(out); - *(float*)retp = r; -}} -void f_f4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f4) { fprintf(out,"wrong data for f_f4\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float r=a+b+c+d; - fprintf(out,"float f(4*float):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - *(float*)retp = r; -}} -void f_f8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f8) { fprintf(out,"wrong data for f_f8\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float r=a+b+c+d+e+f+g+h; - fprintf(out,"float f(8*float):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - *(float*)retp = r; -}} -void f_f16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f16) { fprintf(out,"wrong data for f_f16\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - float n = *(float*)(*args++); - float o = *(float*)(*args++); - float p = *(float*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"float f(16*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - *(float*)retp = r; -}} -void f_f24_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f24) { fprintf(out,"wrong data for f_f24\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - float n = *(float*)(*args++); - float o = *(float*)(*args++); - float p = *(float*)(*args++); - float q = *(float*)(*args++); - float s = *(float*)(*args++); - float t = *(float*)(*args++); - float u = *(float*)(*args++); - float v = *(float*)(*args++); - float w = *(float*)(*args++); - float x = *(float*)(*args++); - float y = *(float*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+v+w+x+y; - fprintf(out,"float f(24*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y); - fflush(out); - *(float*)retp = r; -}} - -/* double tests */ -void d_d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d) { fprintf(out,"wrong data for d_d\n"); exit(1); } - {double a = *(double*)(*args++); - double r=a+1.0; - fprintf(out,"double f(double):(%g)",a); - fflush(out); - *(double*)retp = r; -}} -void d_d2_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d2) { fprintf(out,"wrong data for d_d2\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double r=a+b; - fprintf(out,"double f(2*double):(%g,%g)",a,b); - fflush(out); - *(double*)retp = r; -}} -void d_d4_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d4) { fprintf(out,"wrong data for d_d4\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double r=a+b+c+d; - fprintf(out,"double f(4*double):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - *(double*)retp = r; -}} -void d_d8_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d8) { fprintf(out,"wrong data for d_d8\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double r=a+b+c+d+e+f+g+h; - fprintf(out,"double f(8*double):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - *(double*)retp = r; -}} -void d_d16_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d16) { fprintf(out,"wrong data for d_d16\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - double m = *(double*)(*args++); - double n = *(double*)(*args++); - double o = *(double*)(*args++); - double p = *(double*)(*args++); - double r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"double f(16*double):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - *(double*)retp = r; -}} - -/* pointer tests */ -void vp_vpdpcpsp_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&vp_vpdpcpsp) { fprintf(out,"wrong data for vp_vpdpcpsp\n"); exit(1); } - {void* a = *(void* *)(*args++); - double* b = *(double* *)(*args++); - char* c = *(char* *)(*args++); - Int* d = *(Int* *)(*args++); - void* ret = (char*)b + 1; - fprintf(out,"void* f(void*,double*,char*,Int*):(0x%p,0x%p,0x%p,0x%p)",a,b,c,d); - fflush(out); - *(void* *)retp = ret; -}} - -/* mixed number tests */ -void uc_ucsil_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&uc_ucsil) { fprintf(out,"wrong data for uc_ucsil\n"); exit(1); } - {uchar a = *(unsigned char *)(*args++); - ushort b = *(unsigned short *)(*args++); - uint c = *(unsigned int *)(*args++); - ulong d = *(unsigned long *)(*args++); - uchar r = (uchar)-1; - fprintf(out,"uchar f(uchar,ushort,uint,ulong):(%u,%u,%u,%lu)",a,b,c,d); - fflush(out); - *(ffi_arg *)retp = r; -}} -void d_iidd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_iidd) { fprintf(out,"wrong data for d_iidd\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double r=a+b+c+d; - fprintf(out,"double f(int,int,double,double):(%d,%d,%g,%g)",a,b,c,d); - fflush(out); - *(double*)retp = r; -}} -void d_iiidi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_iiidi) { fprintf(out,"wrong data for d_iiidi\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - double d = *(double*)(*args++); - int e = *(int*)(*args++); - double r=a+b+c+d+e; - fprintf(out,"double f(int,int,int,double,int):(%d,%d,%d,%g,%d)",a,b,c,d,e); - fflush(out); - *(double*)retp = r; -}} -void d_idid_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_idid) { fprintf(out,"wrong data for d_idid\n"); exit(1); } - {int a = *(int*)(*args++); - double b = *(double*)(*args++); - int c = *(int*)(*args++); - double d = *(double*)(*args++); - double r=a+b+c+d; - fprintf(out,"double f(int,double,int,double):(%d,%g,%d,%g)",a,b,c,d); - fflush(out); - *(double*)retp = r; -}} -void d_fdi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_fdi) { fprintf(out,"wrong data for d_fdi\n"); exit(1); } - {float a = *(float*)(*args++); - double b = *(double*)(*args++); - int c = *(int*)(*args++); - double r=a+b+c; - fprintf(out,"double f(float,double,int):(%g,%g,%d)",a,b,c); - fflush(out); - *(double*)retp = r; -}} -void us_cdcd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&us_cdcd) { fprintf(out,"wrong data for us_cdcd\n"); exit(1); } - {char a = *(char*)(*args++); - double b = *(double*)(*args++); - char c = *(char*)(*args++); - double d = *(double*)(*args++); - ushort r = (ushort)(a + b + c + d); - fprintf(out,"ushort f(char,double,char,double):('%c',%g,'%c',%g)",a,b,c,d); - fflush(out); - *(ffi_arg *)retp = r; -}} -void ll_iiilli_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_iiilli) { fprintf(out,"wrong data for ll_iiilli\n"); exit(1); } - {int a = *(int*)(*args++); - int b = *(int*)(*args++); - int c = *(int*)(*args++); - long long d = *(long long *)(*args++); - int e = *(int*)(*args++); - long long r = (long long)(int)a + (long long)(int)b + (long long)(int)c + d + (long long)e; - fprintf(out,"long long f(int,int,int,long long,int):(%d,%d,%d,0x%lx%08lx,%d)",a,b,c,(long)(d>>32),(long)(d&0xffffffff),e); - fflush(out); - *(long long *)retp = r; -}} -void ll_flli_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_flli) { fprintf(out,"wrong data for ll_flli\n"); exit(1); } - {float a = *(float*)(*args++); - long long b = *(long long *)(*args++); - int c = *(int*)(*args++); - long long r = (long long)(int)a + b + (long long)c; - fprintf(out,"long long f(float,long long,int):(%g,0x%lx%08lx,0x%lx)",a,(long)(b>>32),(long)(b&0xffffffff),(long)c); - fflush(out); - *(long long *)retp = r; -}} -void f_fi_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_fi) { fprintf(out,"wrong data for f_fi\n"); exit(1); } - {float a = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+z; - fprintf(out,"float f(float,int):(%g,%d)",a,z); - fflush(out); - *(float*)retp = r; -}} -void f_f2i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f2i) { fprintf(out,"wrong data for f_f2i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+z; - fprintf(out,"float f(2*float,int):(%g,%g,%d)",a,b,z); - fflush(out); - *(float*)retp = r; -}} -void f_f3i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f3i) { fprintf(out,"wrong data for f_f3i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+z; - fprintf(out,"float f(3*float,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - *(float*)retp = r; -}} -void f_f4i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f4i) { fprintf(out,"wrong data for f_f4i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+z; - fprintf(out,"float f(4*float,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - *(float*)retp = r; -}} -void f_f7i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f7i) { fprintf(out,"wrong data for f_f7i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+z; - fprintf(out,"float f(7*float,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - *(float*)retp = r; -}} -void f_f8i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f8i) { fprintf(out,"wrong data for f_f8i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+h+z; - fprintf(out,"float f(8*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - *(float*)retp = r; -}} -void f_f12i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f12i) { fprintf(out,"wrong data for f_f12i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"float f(12*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - *(float*)retp = r; -}} -void f_f13i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f13i) { fprintf(out,"wrong data for f_f13i\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - int z = *(int*)(*args++); - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"float f(13*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - *(float*)retp = r; -}} -void d_di_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_di) { fprintf(out,"wrong data for d_di\n"); exit(1); } - {double a = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+z; - fprintf(out,"double f(double,int):(%g,%d)",a,z); - fflush(out); - *(double*)retp = r; -}} -void d_d2i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d2i) { fprintf(out,"wrong data for d_d2i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+z; - fprintf(out,"double f(2*double,int):(%g,%g,%d)",a,b,z); - fflush(out); - *(double*)retp = r; -}} -void d_d3i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d3i) { fprintf(out,"wrong data for d_d3i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+z; - fprintf(out,"double f(3*double,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - *(double*)retp = r; -}} -void d_d4i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d4i) { fprintf(out,"wrong data for d_d4i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+z; - fprintf(out,"double f(4*double,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - *(double*)retp = r; -}} -void d_d7i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d7i) { fprintf(out,"wrong data for d_d7i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+z; - fprintf(out,"double f(7*double,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - *(double*)retp = r; -}} -void d_d8i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d8i) { fprintf(out,"wrong data for d_d8i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+h+z; - fprintf(out,"double f(8*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - *(double*)retp = r; -}} -void d_d12i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d12i) { fprintf(out,"wrong data for d_d12i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"double f(12*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - *(double*)retp = r; -}} -void d_d13i_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d13i) { fprintf(out,"wrong data for d_d13i\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - double m = *(double*)(*args++); - int z = *(int*)(*args++); - double r=a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"double f(13*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - *(double*)retp = r; -}} - -/* small structure return tests */ -void S1_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S1_v) { fprintf(out,"wrong data for S1_v\n"); exit(1); } - {Size1 r = Size1_1; - fprintf(out,"Size1 f(void):"); - fflush(out); - *(Size1*)retp = r; -}} -void S2_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S2_v) { fprintf(out,"wrong data for S2_v\n"); exit(1); } - {Size2 r = Size2_1; - fprintf(out,"Size2 f(void):"); - fflush(out); - *(Size2*)retp = r; -}} -void S3_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S3_v) { fprintf(out,"wrong data for S3_v\n"); exit(1); } - {Size3 r = Size3_1; - fprintf(out,"Size3 f(void):"); - fflush(out); - *(Size3*)retp = r; -}} -void S4_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S4_v) { fprintf(out,"wrong data for S4_v\n"); exit(1); } - {Size4 r = Size4_1; - fprintf(out,"Size4 f(void):"); - fflush(out); - *(Size4*)retp = r; -}} -void S7_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S7_v) { fprintf(out,"wrong data for S7_v\n"); exit(1); } - {Size7 r = Size7_1; - fprintf(out,"Size7 f(void):"); - fflush(out); - *(Size7*)retp = r; -}} -void S8_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S8_v) { fprintf(out,"wrong data for S8_v\n"); exit(1); } - {Size8 r = Size8_1; - fprintf(out,"Size8 f(void):"); - fflush(out); - *(Size8*)retp = r; -}} -void S12_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S12_v) { fprintf(out,"wrong data for S12_v\n"); exit(1); } - {Size12 r = Size12_1; - fprintf(out,"Size12 f(void):"); - fflush(out); - *(Size12*)retp = r; -}} -void S15_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S15_v) { fprintf(out,"wrong data for S15_v\n"); exit(1); } - {Size15 r = Size15_1; - fprintf(out,"Size15 f(void):"); - fflush(out); - *(Size15*)retp = r; -}} -void S16_v_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&S16_v) { fprintf(out,"wrong data for S16_v\n"); exit(1); } - {Size16 r = Size16_1; - fprintf(out,"Size16 f(void):"); - fflush(out); - *(Size16*)retp = r; -}} - -/* structure tests */ -void I_III_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&I_III) { fprintf(out,"wrong data for I_III\n"); exit(1); } - {Int a = *(Int*)(*args++); - Int b = *(Int*)(*args++); - Int c = *(Int*)(*args++); - Int r; - r.x = a.x + b.x + c.x; - fprintf(out,"Int f(Int,Int,Int):({%d},{%d},{%d})",a.x,b.x,c.x); - fflush(out); - *(Int*)retp = r; -}} -void C_CdC_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&C_CdC) { fprintf(out,"wrong data for C_CdC\n"); exit(1); } - {Char a = *(Char*)(*args++); - double b = *(double*)(*args++); - Char c = *(Char*)(*args++); - Char r; - r.x = (a.x + c.x)/2; - fprintf(out,"Char f(Char,double,Char):({'%c'},%g,{'%c'})",a.x,b,c.x); - fflush(out); - *(Char*)retp = r; -}} -void F_Ffd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&F_Ffd) { fprintf(out,"wrong data for F_Ffd\n"); exit(1); } - {Float a = *(Float*)(*args++); - float b = *(float*)(*args++); - double c = *(double*)(*args++); - Float r; - r.x = a.x + b + c; - fprintf(out,"Float f(Float,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - *(Float*)retp = r; -}} -void D_fDd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&D_fDd) { fprintf(out,"wrong data for D_fDd\n"); exit(1); } - {float a = *(float*)(*args++); - Double b = *(Double*)(*args++); - double c = *(double*)(*args++); - Double r; - r.x = a + b.x + c; - fprintf(out,"Double f(float,Double,double):(%g,{%g},%g)",a,b.x,c); - fflush(out); - *(Double*)retp = r; -}} -void D_Dfd_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&D_Dfd) { fprintf(out,"wrong data for D_Dfd\n"); exit(1); } - {Double a = *(Double*)(*args++); - float b = *(float*)(*args++); - double c = *(double*)(*args++); - Double r; - r.x = a.x + b + c; - fprintf(out,"Double f(Double,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - *(Double*)retp = r; -}} -void J_JiJ_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&J_JiJ) { fprintf(out,"wrong data for J_JiJ\n"); exit(1); } - {J a = *(J*)(*args++); - int b= *(int*)(*args++); - J c = *(J*)(*args++); - J r; - r.l1 = a.l1+c.l1; r.l2 = a.l2+b+c.l2; - fprintf(out,"J f(J,int,J):({%ld,%ld},%d,{%ld,%ld})",a.l1,a.l2,b,c.l1,c.l2); - fflush(out); - *(J*)retp = r; -}} -#ifndef SKIP_EXTRA_STRUCTS -void T_TcT_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&T_TcT) { fprintf(out,"wrong data for T_TcT\n"); exit(1); } - {T a = *(T*)(*args++); - char b = *(char*)(*args++); - T c = *(T*)(*args++); - T r; - r.c[0]='b'; r.c[1]=c.c[1]; r.c[2]=c.c[2]; - fprintf(out,"T f(T,char,T):({\"%c%c%c\"},'%c',{\"%c%c%c\"})",a.c[0],a.c[1],a.c[2],b,c.c[0],c.c[1],c.c[2]); - fflush(out); - *(T*)retp = r; -}} -void X_BcdB_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&X_BcdB) { fprintf(out,"wrong data for X_BcdB\n"); exit(1); } - {B a = *(B*)(*args++); - char b = *(char*)(*args++); - double c = *(double*)(*args++); - B d = *(B*)(*args++); - static X xr={"return val",'R'}; - X r; - r = xr; - r.c1 = b; - fprintf(out,"X f(B,char,double,B):({%g,{%d,%d,%d}},'%c',%g,{%g,{%d,%d,%d}})", - a.d,a.i[0],a.i[1],a.i[2],b,c,d.d,d.i[0],d.i[1],d.i[2]); - fflush(out); - *(X*)retp = r; -}} -#endif - -/* gpargs boundary tests */ -void l_l0K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l0K) { fprintf(out,"wrong data for l_l0K\n"); exit(1); } - {K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(K,long):(%ld,%ld,%ld,%ld,%ld)",b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l1K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l1K) { fprintf(out,"wrong data for l_l1K\n"); exit(1); } - {long a1 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld)",a1,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l2K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l2K) { fprintf(out,"wrong data for l_l2K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(2*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l3K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l3K) { fprintf(out,"wrong data for l_l3K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(3*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l4K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l4K) { fprintf(out,"wrong data for l_l4K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + a4 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(4*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l5K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l5K) { fprintf(out,"wrong data for l_l5K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + a4 + a5 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(5*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void l_l6K_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&l_l6K) { fprintf(out,"wrong data for l_l6K\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - K b = *(K*)(*args++); - long c = *(long*)(*args++); - long r = a1 + a2 + a3 + a4 + a5 + a6 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(6*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,a6,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - *(ffi_arg*)retp = r; -}} -void f_f17l3L_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&f_f17l3L) { fprintf(out,"wrong data for f_f17l3L\n"); exit(1); } - {float a = *(float*)(*args++); - float b = *(float*)(*args++); - float c = *(float*)(*args++); - float d = *(float*)(*args++); - float e = *(float*)(*args++); - float f = *(float*)(*args++); - float g = *(float*)(*args++); - float h = *(float*)(*args++); - float i = *(float*)(*args++); - float j = *(float*)(*args++); - float k = *(float*)(*args++); - float l = *(float*)(*args++); - float m = *(float*)(*args++); - float n = *(float*)(*args++); - float o = *(float*)(*args++); - float p = *(float*)(*args++); - float q = *(float*)(*args++); - long s = *(long*)(*args++); - long t = *(long*)(*args++); - long u = *(long*)(*args++); - L z = *(L*)(*args++); - float r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"float f(17*float,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - *(float*)retp = r; -}} -void d_d17l3L_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_d17l3L) { fprintf(out,"wrong data for d_d17l3L\n"); exit(1); } - {double a = *(double*)(*args++); - double b = *(double*)(*args++); - double c = *(double*)(*args++); - double d = *(double*)(*args++); - double e = *(double*)(*args++); - double f = *(double*)(*args++); - double g = *(double*)(*args++); - double h = *(double*)(*args++); - double i = *(double*)(*args++); - double j = *(double*)(*args++); - double k = *(double*)(*args++); - double l = *(double*)(*args++); - double m = *(double*)(*args++); - double n = *(double*)(*args++); - double o = *(double*)(*args++); - double p = *(double*)(*args++); - double q = *(double*)(*args++); - long s = *(long*)(*args++); - long t = *(long*)(*args++); - long u = *(long*)(*args++); - L z = *(L*)(*args++); - double r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"double f(17*double,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - *(double*)retp = r; -}} -void ll_l2ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l2ll) { fprintf(out,"wrong data for ll_l2ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2) + b + c; - fprintf(out,"long long f(2*long,long long,long):(%ld,%ld,0x%lx%08lx,%ld)",a1,a2,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l3ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l3ll) { fprintf(out,"wrong data for ll_l3ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3) + b + c; - fprintf(out,"long long f(3*long,long long,long):(%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l4ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l4ll) { fprintf(out,"wrong data for ll_l4ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"long long f(4*long,long long,long):(%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l5ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l5ll) { fprintf(out,"wrong data for ll_l5ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"long long f(5*long,long long,long):(%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l6ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l6ll) { fprintf(out,"wrong data for ll_l6ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"long long f(6*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void ll_l7ll_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&ll_l7ll) { fprintf(out,"wrong data for ll_l7ll\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - long a7 = *(long*)(*args++); - long long b = *(long long *)(*args++); - long c = *(long*)(*args++); - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"long long f(7*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,a7,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - *(long long *)retp = r; -}} -void d_l2d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l2d) { fprintf(out,"wrong data for d_l2d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2) + b + c; - fprintf(out,"double f(2*long,double,long):(%ld,%ld,%g,%ld)",a1,a2,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l3d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l3d) { fprintf(out,"wrong data for d_l3d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3) + b + c; - fprintf(out,"double f(3*long,double,long):(%ld,%ld,%ld,%g,%ld)",a1,a2,a3,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l4d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l4d) { fprintf(out,"wrong data for d_l4d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"double f(4*long,double,long):(%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l5d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l5d) { fprintf(out,"wrong data for d_l5d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"double f(5*long,double,long):(%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l6d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l6d) { fprintf(out,"wrong data for d_l6d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"double f(6*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,b,c); - fflush(out); - *(double*)retp = r; -}} -void d_l7d_simulator (ffi_cif* cif, void* retp, /*const*/ void* /*const*/ *args, void* data) -{ - if (data != (void*)&d_l7d) { fprintf(out,"wrong data for d_l7d\n"); exit(1); } - {long a1 = *(long*)(*args++); - long a2 = *(long*)(*args++); - long a3 = *(long*)(*args++); - long a4 = *(long*)(*args++); - long a5 = *(long*)(*args++); - long a6 = *(long*)(*args++); - long a7 = *(long*)(*args++); - double b = *(double*)(*args++); - long c = *(long*)(*args++); - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"double f(7*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,a7,b,c); - fflush(out); - *(double*)retp = r; -}} - - -/* - * The way we run these tests - first call the function directly, then - * through vacall() - there is the danger that arguments or results seem - * to be passed correctly, but what we are seeing are in fact the vestiges - * (traces) or the previous call. This may seriously fake the test. - * Avoid this by clearing the registers between the first and the second call. - */ -long clear_traces_i (long a, long b, long c, long d, long e, long f, long g, long h, - long i, long j, long k, long l, long m, long n, long o, long p) -{ return 0; } -float clear_traces_f (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, float n, - float o, float p) -{ return 0.0; } -double clear_traces_d (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, - double o, double p) -{ return 0.0; } -J clear_traces_J (void) -{ J j; j.l1 = j.l2 = 0; return j; } -void clear_traces (void) -{ clear_traces_i(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); - clear_traces_f(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); - clear_traces_d(0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0,0.0); - clear_traces_J(); -} - -int main (void) -{ - void* callback_code; - void* callback_writable; -#define ALLOC_CALLBACK() \ - callback_writable = ffi_closure_alloc(sizeof(ffi_closure),&callback_code); \ - if (!callback_writable) abort() -#define PREP_CALLBACK(cif,simulator,data) \ - if (ffi_prep_closure_loc(callback_writable,&(cif),simulator,data,callback_code) != FFI_OK) abort() -#define FREE_CALLBACK() \ - ffi_closure_free(callback_writable) - - ffi_type_char = (char)(-1) < 0 ? ffi_type_schar : ffi_type_uchar; - out = stdout; - -#if (!defined(DGTEST)) || DGTEST == 1 - /* void tests */ - v_v(); - clear_traces(); - ALLOC_CALLBACK(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_void); - PREP_CALLBACK(cif,v_v_simulator,(void*)&v_v); - ((void (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); -#endif - - /* int tests */ - { int ir; - -#if (!defined(DGTEST)) || DGTEST == 2 - ir = i_v(); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_sint); - PREP_CALLBACK(cif,i_v_simulator,(void*)&i_v); - ir = ((int (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 3 - ir = i_i(i1); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i_simulator,(void*)&i_i); - ir = ((int (ABI_ATTR *) (int)) callback_code) (i1); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 4 - ir = i_i2(i1,i2); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i2_simulator,(void*)&i_i2); - ir = ((int (ABI_ATTR *) (int,int)) callback_code) (i1,i2); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 5 - ir = i_i4(i1,i2,i3,i4); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i4_simulator,(void*)&i_i4); - ir = ((int (ABI_ATTR *) (int,int,int,int)) callback_code) (i1,i2,i3,i4); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 6 - ir = i_i8(i1,i2,i3,i4,i5,i6,i7,i8); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i8_simulator,(void*)&i_i8); - ir = ((int (ABI_ATTR *) (int,int,int,int,int,int,int,int)) callback_code) (i1,i2,i3,i4,i5,i6,i7,i8); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 7 - ir = i_i16(i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); - fprintf(out,"->%d\n",ir); - fflush(out); - ir = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_sint); - PREP_CALLBACK(cif,i_i16_simulator,(void*)&i_i16); - ir = ((int (ABI_ATTR *) (int,int,int,int,int,int,int,int,int,int,int,int,int,int,int,int)) callback_code) (i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11,i12,i13,i14,i15,i16); - } - FREE_CALLBACK(); - fprintf(out,"->%d\n",ir); - fflush(out); -#endif - } - - /* float tests */ - { float fr; - -#if (!defined(DGTEST)) || DGTEST == 8 - fr = f_f(f1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f_simulator,(void*)&f_f); - fr = ((float (ABI_ATTR *) (float)) callback_code) (f1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 9 - fr = f_f2(f1,f2); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f2_simulator,(void*)&f_f2); - fr = ((float (ABI_ATTR *) (float,float)) callback_code) (f1,f2); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 10 - fr = f_f4(f1,f2,f3,f4); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f4_simulator,(void*)&f_f4); - fr = ((float (ABI_ATTR *) (float,float,float,float)) callback_code) (f1,f2,f3,f4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 11 - fr = f_f8(f1,f2,f3,f4,f5,f6,f7,f8); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f8_simulator,(void*)&f_f8); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 12 - fr = f_f16(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f16_simulator,(void*)&f_f16); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 13 - fr = f_f24(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f24_simulator,(void*)&f_f24); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,f18,f19,f20,f21,f22,f23,f24); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - - } - - /* double tests */ - { double dr; - -#if (!defined(DGTEST)) || DGTEST == 14 - dr = d_d(d1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d_simulator,(void*)&d_d); - dr = ((double (ABI_ATTR *) (double)) callback_code) (d1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 15 - dr = d_d2(d1,d2); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d2_simulator,(void*)&d_d2); - dr = ((double (ABI_ATTR *) (double,double)) callback_code) (d1,d2); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 16 - dr = d_d4(d1,d2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d4_simulator,(void*)&d_d4); - dr = ((double (ABI_ATTR *) (double,double,double,double)) callback_code) (d1,d2,d3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 17 - dr = d_d8(d1,d2,d3,d4,d5,d6,d7,d8); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d8_simulator,(void*)&d_d8); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 18 - dr = d_d16(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d16_simulator,(void*)&d_d16); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - } - - /* pointer tests */ - { void* vpr; - -#if (!defined(DGTEST)) || DGTEST == 19 - vpr = vp_vpdpcpsp(&uc1,&d2,str3,&I4); - fprintf(out,"->0x%p\n",vpr); - fflush(out); - vpr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer, &ffi_type_pointer }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_pointer); - PREP_CALLBACK(cif,vp_vpdpcpsp_simulator,(void*)&vp_vpdpcpsp); - vpr = ((void* (ABI_ATTR *) (void*,double*,char*,Int*)) callback_code) (&uc1,&d2,str3,&I4); - } - FREE_CALLBACK(); - fprintf(out,"->0x%p\n",vpr); - fflush(out); -#endif - } - - /* mixed number tests */ - { uchar ucr; - ushort usr; - float fr; - double dr; - long long llr; - -#if (!defined(DGTEST)) || DGTEST == 20 - ucr = uc_ucsil(uc1,us2,ui3,ul4); - fprintf(out,"->%u\n",ucr); - fflush(out); - ucr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_uchar, &ffi_type_ushort, &ffi_type_uint, &ffi_type_ulong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_uchar); - PREP_CALLBACK(cif,uc_ucsil_simulator,(void*)&uc_ucsil); - ucr = ((uchar (ABI_ATTR *) (uchar,ushort,uint,ulong)) callback_code) (uc1,us2,ui3,ul4); - } - FREE_CALLBACK(); - fprintf(out,"->%u\n",ucr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 21 - dr = d_iidd(i1,i2,d3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_iidd_simulator,(void*)&d_iidd); - dr = ((double (ABI_ATTR *) (int,int,double,double)) callback_code) (i1,i2,d3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 22 - dr = d_iiidi(i1,i2,i3,d4,i5); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_iiidi_simulator,(void*)&d_iiidi); - dr = ((double (ABI_ATTR *) (int,int,int,double,int)) callback_code) (i1,i2,i3,d4,i5); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 23 - dr = d_idid(i1,d2,i3,d4); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_double, &ffi_type_sint, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_idid_simulator,(void*)&d_idid); - dr = ((double (ABI_ATTR *) (int,double,int,double)) callback_code) (i1,d2,i3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 24 - dr = d_fdi(f1,d2,i3); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_fdi_simulator,(void*)&d_fdi); - dr = ((double (ABI_ATTR *) (float,double,int)) callback_code) (f1,d2,i3); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 25 - usr = us_cdcd(c1,d2,c3,d4); - fprintf(out,"->%u\n",usr); - fflush(out); - usr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_char, &ffi_type_double, &ffi_type_char, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_ushort); - PREP_CALLBACK(cif,us_cdcd_simulator,(void*)&us_cdcd); - usr = ((ushort (ABI_ATTR *) (char,double,char,double)) callback_code) (c1,d2,c3,d4); - } - FREE_CALLBACK(); - fprintf(out,"->%u\n",usr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 26 - llr = ll_iiilli(i1,i2,i3,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_sint, &ffi_type_sint, &ffi_type_sint, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_iiilli_simulator,(void*)&ll_iiilli); - llr = ((long long (ABI_ATTR *) (int,int,int,long long,int)) callback_code) (i1,i2,i3,ll1,i13); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 27 - llr = ll_flli(f13,ll1,i13); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_slonglong, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_flli_simulator,(void*)&ll_flli); - llr = ((long long (ABI_ATTR *) (float,long long,int)) callback_code) (f13,ll1,i13); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 28 - fr = f_fi(f1,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_fi_simulator,(void*)&f_fi); - fr = ((float (ABI_ATTR *) (float,int)) callback_code) (f1,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 29 - fr = f_f2i(f1,f2,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f2i_simulator,(void*)&f_f2i); - fr = ((float (ABI_ATTR *) (float,float,int)) callback_code) (f1,f2,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 30 - fr = f_f3i(f1,f2,f3,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f3i_simulator,(void*)&f_f3i); - fr = ((float (ABI_ATTR *) (float,float,float,int)) callback_code) (f1,f2,f3,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 31 - fr = f_f4i(f1,f2,f3,f4,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f4i_simulator,(void*)&f_f4i); - fr = ((float (ABI_ATTR *) (float,float,float,float,int)) callback_code) (f1,f2,f3,f4,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 32 - fr = f_f7i(f1,f2,f3,f4,f5,f6,f7,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f7i_simulator,(void*)&f_f7i); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 33 - fr = f_f8i(f1,f2,f3,f4,f5,f6,f7,f8,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f8i_simulator,(void*)&f_f8i); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 34 - fr = f_f13i(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f13i_simulator,(void*)&f_f13i); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,int)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 35 - dr = d_di(d1,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_di_simulator,(void*)&d_di); - dr = ((double (ABI_ATTR *) (double,int)) callback_code) (d1,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 36 - dr = d_d2i(d1,d2,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d2i_simulator,(void*)&d_d2i); - dr = ((double (ABI_ATTR *) (double,double,int)) callback_code) (d1,d2,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 37 - dr = d_d3i(d1,d2,d3,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d3i_simulator,(void*)&d_d3i); - dr = ((double (ABI_ATTR *) (double,double,double,int)) callback_code) (d1,d2,d3,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 38 - dr = d_d4i(d1,d2,d3,d4,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d4i_simulator,(void*)&d_d4i); - dr = ((double (ABI_ATTR *) (double,double,double,double,int)) callback_code) (d1,d2,d3,d4,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 39 - dr = d_d7i(d1,d2,d3,d4,d5,d6,d7,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d7i_simulator,(void*)&d_d7i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 40 - dr = d_d8i(d1,d2,d3,d4,d5,d6,d7,d8,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d8i_simulator,(void*)&d_d8i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 41 - dr = d_d12i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d12i_simulator,(void*)&d_d12i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 42 - dr = d_d13i(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_sint }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d13i_simulator,(void*)&d_d13i); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,int)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,i9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - } - - /* small structure return tests */ -#if (!defined(DGTEST)) || DGTEST == 43 - { - Size1 r = S1_v(); - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size1_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Size1; - ffi_type_Size1.type = FFI_TYPE_STRUCT; - ffi_type_Size1.size = sizeof(Size1); - ffi_type_Size1.alignment = alignof_slot(Size1); - ffi_type_Size1.elements = ffi_type_Size1_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size1); - PREP_CALLBACK(cif,S1_v_simulator,(void*)&S1_v); - r = ((Size1 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c}\n",r.x1); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 44 - { - Size2 r = S2_v(); - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size2_elements[] = { &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size2; - ffi_type_Size2.type = FFI_TYPE_STRUCT; - ffi_type_Size2.size = sizeof(Size2); - ffi_type_Size2.alignment = alignof_slot(Size2); - ffi_type_Size2.elements = ffi_type_Size2_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size2); - PREP_CALLBACK(cif,S2_v_simulator,(void*)&S2_v); - r = ((Size2 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c}\n",r.x1,r.x2); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 45 - { - Size3 r = S3_v(); - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size3_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size3; - ffi_type_Size3.type = FFI_TYPE_STRUCT; - ffi_type_Size3.size = sizeof(Size3); - ffi_type_Size3.alignment = alignof_slot(Size3); - ffi_type_Size3.elements = ffi_type_Size3_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size3); - PREP_CALLBACK(cif,S3_v_simulator,(void*)&S3_v); - r = ((Size3 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c}\n",r.x1,r.x2,r.x3); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 46 - { - Size4 r = S4_v(); - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size4_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size4; - ffi_type_Size4.type = FFI_TYPE_STRUCT; - ffi_type_Size4.size = sizeof(Size4); - ffi_type_Size4.alignment = alignof_slot(Size4); - ffi_type_Size4.elements = ffi_type_Size4_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size4); - PREP_CALLBACK(cif,S4_v_simulator,(void*)&S4_v); - r = ((Size4 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 47 - { - Size7 r = S7_v(); - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size7_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size7; - ffi_type_Size7.type = FFI_TYPE_STRUCT; - ffi_type_Size7.size = sizeof(Size7); - ffi_type_Size7.alignment = alignof_slot(Size7); - ffi_type_Size7.elements = ffi_type_Size7_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size7); - PREP_CALLBACK(cif,S7_v_simulator,(void*)&S7_v); - r = ((Size7 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 48 - { - Size8 r = S8_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size8_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size8; - ffi_type_Size8.type = FFI_TYPE_STRUCT; - ffi_type_Size8.size = sizeof(Size8); - ffi_type_Size8.alignment = alignof_slot(Size8); - ffi_type_Size8.elements = ffi_type_Size8_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size8); - PREP_CALLBACK(cif,S8_v_simulator,(void*)&S8_v); - r = ((Size8 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 49 - { - Size12 r = S12_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size12_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size12; - ffi_type_Size12.type = FFI_TYPE_STRUCT; - ffi_type_Size12.size = sizeof(Size12); - ffi_type_Size12.alignment = alignof_slot(Size12); - ffi_type_Size12.elements = ffi_type_Size12_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size12); - PREP_CALLBACK(cif,S12_v_simulator,(void*)&S12_v); - r = ((Size12 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 50 - { - Size15 r = S15_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size15_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size15; - ffi_type_Size15.type = FFI_TYPE_STRUCT; - ffi_type_Size15.size = sizeof(Size15); - ffi_type_Size15.alignment = alignof_slot(Size15); - ffi_type_Size15.elements = ffi_type_Size15_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size15); - PREP_CALLBACK(cif,S15_v_simulator,(void*)&S15_v); - r = ((Size15 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15); - fflush(out); - } -#endif - -#if (!defined(DGTEST)) || DGTEST == 51 - { - Size16 r = S16_v(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - memset(&r,0,sizeof(r)); clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Size16_elements[] = { &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, &ffi_type_char, NULL }; - ffi_type ffi_type_Size16; - ffi_type_Size16.type = FFI_TYPE_STRUCT; - ffi_type_Size16.size = sizeof(Size16); - ffi_type_Size16.alignment = alignof_slot(Size16); - ffi_type_Size16.elements = ffi_type_Size16_elements; - ffi_cif cif; - FFI_PREP_CIF_NOARGS(cif,ffi_type_Size16); - PREP_CALLBACK(cif,S16_v_simulator,(void*)&S16_v); - r = ((Size16 (ABI_ATTR *) (void)) callback_code) (); - } - FREE_CALLBACK(); - fprintf(out,"->{%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c%c}\n",r.x1,r.x2,r.x3,r.x4,r.x5,r.x6,r.x7,r.x8,r.x9,r.x10,r.x11,r.x12,r.x13,r.x14,r.x15,r.x16); - fflush(out); - } -#endif - - - /* structure tests */ - { Int Ir; - Char Cr; - Float Fr; - Double Dr; - J Jr; -#ifndef SKIP_EXTRA_STRUCTS - T Tr; - X Xr; -#endif - -#if (!defined(DGTEST)) || DGTEST == 52 - Ir = I_III(I1,I2,I3); - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); - Ir.x = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Int_elements[] = { &ffi_type_sint, NULL }; - ffi_type ffi_type_Int; - ffi_type_Int.type = FFI_TYPE_STRUCT; - ffi_type_Int.size = sizeof(Int); - ffi_type_Int.alignment = alignof_slot(Int); - ffi_type_Int.elements = ffi_type_Int_elements; - ffi_type* argtypes[] = { &ffi_type_Int, &ffi_type_Int, &ffi_type_Int }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Int); - PREP_CALLBACK(cif,I_III_simulator,(void*)&I_III); - Ir = ((Int (ABI_ATTR *) (Int,Int,Int)) callback_code) (I1,I2,I3); - } - FREE_CALLBACK(); - fprintf(out,"->{%d}\n",Ir.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 53 - Cr = C_CdC(C1,d2,C3); - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); - Cr.x = '\0'; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Char_elements[] = { &ffi_type_char, NULL }; - ffi_type ffi_type_Char; - ffi_type_Char.type = FFI_TYPE_STRUCT; - ffi_type_Char.size = sizeof(Char); - ffi_type_Char.alignment = alignof_slot(Char); - ffi_type_Char.elements = ffi_type_Char_elements; - ffi_type* argtypes[] = { &ffi_type_Char, &ffi_type_double, &ffi_type_Char }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Char); - PREP_CALLBACK(cif,C_CdC_simulator,(void*)&C_CdC); - Cr = ((Char (ABI_ATTR *) (Char,double,Char)) callback_code) (C1,d2,C3); - } - FREE_CALLBACK(); - fprintf(out,"->{'%c'}\n",Cr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 54 - Fr = F_Ffd(F1,f2,d3); - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); - Fr.x = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Float_elements[] = { &ffi_type_float, NULL }; - ffi_type ffi_type_Float; - ffi_type_Float.type = FFI_TYPE_STRUCT; - ffi_type_Float.size = sizeof(Float); - ffi_type_Float.alignment = alignof_slot(Float); - ffi_type_Float.elements = ffi_type_Float_elements; - ffi_type* argtypes[] = { &ffi_type_Float, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Float); - PREP_CALLBACK(cif,F_Ffd_simulator,(void*)&F_Ffd); - Fr = ((Float (ABI_ATTR *) (Float,float,double)) callback_code) (F1,f2,d3); - } - FREE_CALLBACK(); - fprintf(out,"->{%g}\n",Fr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 55 - Dr = D_fDd(f1,D2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_Double, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - PREP_CALLBACK(cif,D_fDd_simulator,(void*)&D_fDd); - Dr = ((Double (ABI_ATTR *) (float,Double,double)) callback_code) (f1,D2,d3); - } - FREE_CALLBACK(); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 56 - Dr = D_Dfd(D1,f2,d3); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); - Dr.x = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_Double_elements[] = { &ffi_type_double, NULL }; - ffi_type ffi_type_Double; - ffi_type_Double.type = FFI_TYPE_STRUCT; - ffi_type_Double.size = sizeof(Double); - ffi_type_Double.alignment = alignof_slot(Double); - ffi_type_Double.elements = ffi_type_Double_elements; - ffi_type* argtypes[] = { &ffi_type_Double, &ffi_type_float, &ffi_type_double }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_Double); - PREP_CALLBACK(cif,D_Dfd_simulator,(void*)&D_Dfd); - Dr = ((Double (ABI_ATTR *) (Double,float,double)) callback_code) (D1,f2,d3); - } - FREE_CALLBACK(); - fprintf(out,"->{%g}\n",Dr.x); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 57 - Jr = J_JiJ(J1,i2,J2); - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); - Jr.l1 = Jr.l2 = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_J_elements[] = { &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_J; - ffi_type_J.type = FFI_TYPE_STRUCT; - ffi_type_J.size = sizeof(J); - ffi_type_J.alignment = alignof_slot(J); - ffi_type_J.elements = ffi_type_J_elements; - ffi_type* argtypes[] = { &ffi_type_J, &ffi_type_sint, &ffi_type_J }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_J); - PREP_CALLBACK(cif,J_JiJ_simulator,(void*)&J_JiJ); - Jr = ((J (ABI_ATTR *) (J,int,J)) callback_code) (J1,i2,J2); - } - FREE_CALLBACK(); - fprintf(out,"->{%ld,%ld}\n",Jr.l1,Jr.l2); - fflush(out); -#endif - -#ifndef SKIP_EXTRA_STRUCTS -#if (!defined(DGTEST)) || DGTEST == 58 - Tr = T_TcT(T1,' ',T2); - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); - Tr.c[0] = Tr.c[1] = Tr.c[2] = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_T_elements[] = { ??, NULL }; - ffi_type ffi_type_T; - ffi_type_T.type = FFI_TYPE_STRUCT; - ffi_type_T.size = sizeof(T); - ffi_type_T.alignment = alignof_slot(T); - ffi_type_T.elements = ffi_type_T_elements; - ffi_type* argtypes[] = { &ffi_type_T, &ffi_type_char, &ffi_type_T }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_T); - PREP_CALLBACK(cif,T_TcT_simulator,(void*)&T_TcT); - Tr = ((T (ABI_ATTR *) (T,char,T)) callback_code) (T1,' ',T2); - } - FREE_CALLBACK(); - fprintf(out,"->{\"%c%c%c\"}\n",Tr.c[0],Tr.c[1],Tr.c[2]); - fflush(out); -#endif - -#ifndef SKIP_X -#if (!defined(DGTEST)) || DGTEST == 59 - Xr = X_BcdB(B1,c2,d3,B2); - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); - Xr.c[0]=Xr.c1='\0'; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* ffi_type_X_elements[] = { ??, NULL }; - ffi_type ffi_type_X; - ffi_type_X.type = FFI_TYPE_STRUCT; - ffi_type_X.size = sizeof(X); - ffi_type_X.alignment = alignof_slot(X); - ffi_type_X.elements = ffi_type_X_elements; - ffi_type* argtypes[] = { &ffi_type_X, &ffi_type_char, &ffi_type_double, &ffi_type_X }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_X); - PREP_CALLBACK(cif,X_BcdB_simulator,(void*)&X_BcdB); - Xr = ((X (ABI_ATTR *) (B,char,double,B)) callback_code) (B1,c2,d3,B2); - } - FREE_CALLBACK(); - fprintf(out,"->{\"%s\",'%c'}\n",Xr.c,Xr.c1); - fflush(out); -#endif -#endif -#endif - } - - - /* gpargs boundary tests */ - { - ffi_type* ffi_type_K_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_K; - ffi_type* ffi_type_L_elements[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, NULL }; - ffi_type ffi_type_L; - long lr; - long long llr; - float fr; - double dr; - - ffi_type_K.type = FFI_TYPE_STRUCT; - ffi_type_K.size = sizeof(K); - ffi_type_K.alignment = alignof_slot(K); - ffi_type_K.elements = ffi_type_K_elements; - - ffi_type_L.type = FFI_TYPE_STRUCT; - ffi_type_L.size = sizeof(L); - ffi_type_L.alignment = alignof_slot(L); - ffi_type_L.elements = ffi_type_L_elements; - -#if (!defined(DGTEST)) || DGTEST == 60 - lr = l_l0K(K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l0K_simulator,(void*)l_l0K); - lr = ((long (ABI_ATTR *) (K,long)) callback_code) (K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 61 - lr = l_l1K(l1,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l1K_simulator,(void*)l_l1K); - lr = ((long (ABI_ATTR *) (long,K,long)) callback_code) (l1,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 62 - lr = l_l2K(l1,l2,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l2K_simulator,(void*)l_l2K); - lr = ((long (ABI_ATTR *) (long,long,K,long)) callback_code) (l1,l2,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 63 - lr = l_l3K(l1,l2,l3,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l3K_simulator,(void*)l_l3K); - lr = ((long (ABI_ATTR *) (long,long,long,K,long)) callback_code) (l1,l2,l3,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 64 - lr = l_l4K(l1,l2,l3,l4,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l4K_simulator,(void*)l_l4K); - lr = ((long (ABI_ATTR *) (long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 65 - lr = l_l5K(l1,l2,l3,l4,l5,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l5K_simulator,(void*)l_l5K); - lr = ((long (ABI_ATTR *) (long,long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,l5,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 66 - lr = l_l6K(l1,l2,l3,l4,l5,l6,K1,l9); - fprintf(out,"->%ld\n",lr); - fflush(out); - lr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_K, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slong); - PREP_CALLBACK(cif,l_l6K_simulator,(void*)l_l6K); - lr = ((long (ABI_ATTR *) (long,long,long,long,long,long,K,long)) callback_code) (l1,l2,l3,l4,l5,l6,K1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%ld\n",lr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 67 - fr = f_f17l3L(f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); - fprintf(out,"->%g\n",fr); - fflush(out); - fr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_float, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_float); - PREP_CALLBACK(cif,f_f17l3L_simulator,(void*)&f_f17l3L); - fr = ((float (ABI_ATTR *) (float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,float,long,long,long,L)) callback_code) (f1,f2,f3,f4,f5,f6,f7,f8,f9,f10,f11,f12,f13,f14,f15,f16,f17,l6,l7,l8,L1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",fr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 68 - dr = d_d17l3L(d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_double, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_L }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_d17l3L_simulator,(void*)&d_d17l3L); - dr = ((double (ABI_ATTR *) (double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,double,long,long,long,L)) callback_code) (d1,d2,d3,d4,d5,d6,d7,d8,d9,d10,d11,d12,d13,d14,d15,d16,d17,l6,l7,l8,L1); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 69 - llr = ll_l2ll(l1,l2,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l2ll_simulator,(void*)ll_l2ll); - llr = ((long long (ABI_ATTR *) (long,long,long long,long)) callback_code) (l1,l2,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 70 - llr = ll_l3ll(l1,l2,l3,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l3ll_simulator,(void*)ll_l3ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long long,long)) callback_code) (l1,l2,l3,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 71 - llr = ll_l4ll(l1,l2,l3,l4,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l4ll_simulator,(void*)ll_l4ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 72 - llr = ll_l5ll(l1,l2,l3,l4,l5,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l5ll_simulator,(void*)ll_l5ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 73 - llr = ll_l6ll(l1,l2,l3,l4,l5,l6,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l6ll_simulator,(void*)ll_l6ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,l6,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 74 - llr = ll_l7ll(l1,l2,l3,l4,l5,l6,l7,ll1,l9); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); - llr = 0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slonglong, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_slonglong); - PREP_CALLBACK(cif,ll_l7ll_simulator,(void*)ll_l7ll); - llr = ((long long (ABI_ATTR *) (long,long,long,long,long,long,long,long long,long)) callback_code) (l1,l2,l3,l4,l5,l6,l7,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->0x%lx%08lx\n",(long)(llr>>32),(long)(llr&0xffffffff)); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 75 - dr = d_l2d(l1,l2,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l2d_simulator,(void*)d_l2d); - dr = ((double (ABI_ATTR *) (long,long,double,long)) callback_code) (l1,l2,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 76 - dr = d_l3d(l1,l2,l3,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l3d_simulator,(void*)d_l3d); - dr = ((double (ABI_ATTR *) (long,long,long,double,long)) callback_code) (l1,l2,l3,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 77 - dr = d_l4d(l1,l2,l3,l4,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l4d_simulator,(void*)d_l4d); - dr = ((double (ABI_ATTR *) (long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 78 - dr = d_l5d(l1,l2,l3,l4,l5,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l5d_simulator,(void*)d_l5d); - dr = ((double (ABI_ATTR *) (long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 79 - dr = d_l6d(l1,l2,l3,l4,l5,l6,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l6d_simulator,(void*)d_l6d); - dr = ((double (ABI_ATTR *) (long,long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,l6,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - -#if (!defined(DGTEST)) || DGTEST == 80 - dr = d_l7d(l1,l2,l3,l4,l5,l6,l7,ll1,l9); - fprintf(out,"->%g\n",dr); - fflush(out); - dr = 0.0; clear_traces(); - ALLOC_CALLBACK(); - { - ffi_type* argtypes[] = { &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_slong, &ffi_type_double, &ffi_type_slong }; - ffi_cif cif; - FFI_PREP_CIF(cif,argtypes,ffi_type_double); - PREP_CALLBACK(cif,d_l7d_simulator,(void*)d_l7d); - dr = ((double (ABI_ATTR *) (long,long,long,long,long,long,long,double,long)) callback_code) (l1,l2,l3,l4,l5,l6,l7,ll1,l9); - } - FREE_CALLBACK(); - fprintf(out,"->%g\n",dr); - fflush(out); -#endif - - } - - exit(0); -} - diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c deleted file mode 100644 index d25ebf4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +++ /dev/null @@ -1,743 +0,0 @@ -/* - * Copyright 1993 Bill Triggs - * Copyright 1995-2017 Bruno Haible - * - * 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 . - */ - -/* This file defines test functions of selected signatures, that exercise - dark corners of the various ABIs. */ - -#include - -FILE* out; - -#define uchar unsigned char -#define ushort unsigned short -#define uint unsigned int -#define ulong unsigned long - -typedef struct { char x; } Char; -typedef struct { short x; } Short; -typedef struct { int x; } Int; -typedef struct { long x; } Long; -typedef struct { float x; } Float; -typedef struct { double x; } Double; -typedef struct { char c; float f; } A; -typedef struct { double d; int i[3]; } B; -typedef struct { long l1; long l2; } J; -typedef struct { long l1; long l2; long l3; long l4; } K; -typedef struct { long l1; long l2; long l3; long l4; long l5; long l6; } L; -typedef struct { char x1; } Size1; -typedef struct { char x1; char x2; } Size2; -typedef struct { char x1; char x2; char x3; } Size3; -typedef struct { char x1; char x2; char x3; char x4; } Size4; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; -} Size7; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; -} Size8; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; - char x9; char x10; char x11; char x12; -} Size12; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; - char x9; char x10; char x11; char x12; char x13; char x14; char x15; -} Size15; -typedef struct { - char x1; char x2; char x3; char x4; char x5; char x6; char x7; char x8; - char x9; char x10; char x11; char x12; char x13; char x14; char x15; char x16; -} Size16; -typedef struct { char c[3]; } T; -typedef struct { char c[33],c1; } X; - -char c1='a', c2=127, c3=(char)128, c4=(char)255, c5=-1; -short s1=32767, s2=(short)32768, s3=3, s4=4, s5=5, s6=6, s7=7, s8=8, s9=9; -int i1=1, i2=2, i3=3, i4=4, i5=5, i6=6, i7=7, i8=8, i9=9, - i10=11, i11=12, i12=13, i13=14, i14=15, i15=16, i16=17; -long l1=1, l2=2, l3=3, l4=4, l5=5, l6=6, l7=7, l8=8, l9=9; -long long ll1 = 3875056143130689530LL; -float f1=0.1f, f2=0.2f, f3=0.3f, f4=0.4f, f5=0.5f, f6=0.6f, f7=0.7f, f8=0.8f, f9=0.9f, - f10=1.1f, f11=1.2f, f12=1.3f, f13=1.4f, f14=1.5f, f15=1.6f, f16=1.7f, f17=1.8f, - f18=1.9f, f19=2.1f, f20=2.2f, f21=2.3f, f22=2.4f, f23=2.5f, f24=2.6f; -double d1=0.1, d2=0.2, d3=0.3, d4=0.4, d5=0.5, d6=0.6, d7=0.7, d8=0.8, d9=0.9, - d10=1.1, d11=1.2, d12=1.3, d13=1.4, d14=1.5, d15=1.6, d16=1.7, d17=1.8; - -uchar uc1='a', uc2=127, uc3=128, uc4=255, uc5=(uchar)-1; -ushort us1=1, us2=2, us3=3, us4=4, us5=5, us6=6, us7=7, us8=8, us9=9; -uint ui1=1, ui2=2, ui3=3, ui4=4, ui5=5, ui6=6, ui7=7, ui8=8, ui9=9; -ulong ul1=1, ul2=2, ul3=3, ul4=4, ul5=5, ul6=6, ul7=7, ul8=8, ul9=9; - -char *str1="hello",str2[]="goodbye",*str3="still here?"; -Char C1={'A'}, C2={'B'}, C3={'C'}, C4={'\377'}, C5={(char)(-1)}; -Short S1={1}, S2={2}, S3={3}, S4={4}, S5={5}, S6={6}, S7={7}, S8={8}, S9={9}; -Int I1={1}, I2={2}, I3={3}, I4={4}, I5={5}, I6={6}, I7={7}, I8={8}, I9={9}; -Float F1={0.1f}, F2={0.2f}, F3={0.3f}, F4={0.4f}, F5={0.5f}, F6={0.6f}, F7={0.7f}, F8={0.8f}, F9={0.9f}; -Double D1={0.1}, D2={0.2}, D3={0.3}, D4={0.4}, D5={0.5}, D6={0.6}, D7={0.7}, D8={0.8}, D9={0.9}; - -A A1={'a',0.1f},A2={'b',0.2f},A3={'\377',0.3f}; -B B1={0.1,{1,2,3}},B2={0.2,{5,4,3}}; -J J1={47,11},J2={73,55}; -K K1={19,69,12,28}; -L L1={561,1105,1729,2465,2821,6601}; /* A002997 */ -Size1 Size1_1={'a'}; -Size2 Size2_1={'a','b'}; -Size3 Size3_1={'a','b','c'}; -Size4 Size4_1={'a','b','c','d'}; -Size7 Size7_1={'a','b','c','d','e','f','g'}; -Size8 Size8_1={'a','b','c','d','e','f','g','h'}; -Size12 Size12_1={'a','b','c','d','e','f','g','h','i','j','k','l'}; -Size15 Size15_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o'}; -Size16 Size16_1={'a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p'}; -T T1={{'t','h','e'}},T2={{'f','o','x'}}; -X X1={"abcdefghijklmnopqrstuvwxyzABCDEF",'G'}, X2={"123",'9'}, X3={"return-return-return",'R'}; - -#if defined(__GNUC__) -#define __STDCALL__ __attribute__((stdcall)) -#define __THISCALL__ __attribute__((thiscall)) -#define __FASTCALL__ __attribute__((fastcall)) -#define __MSABI__ __attribute__((ms_abi)) -#else -#define __STDCALL__ __stdcall -#define __THISCALL__ __thiscall -#define __FASTCALL__ __fastcall -#endif - -#ifndef ABI_ATTR -#define ABI_ATTR -#endif - -/* void tests */ -void ABI_ATTR v_v (void) -{ - fprintf(out,"void f(void):\n"); - fflush(out); -} - -/* int tests */ -int ABI_ATTR i_v (void) -{ - int r=99; - fprintf(out,"int f(void):"); - fflush(out); - return r; -} -int ABI_ATTR i_i (int a) -{ - int r=a+1; - fprintf(out,"int f(int):(%d)",a); - fflush(out); - return r; -} -int ABI_ATTR i_i2 (int a, int b) -{ - int r=a+b; - fprintf(out,"int f(2*int):(%d,%d)",a,b); - fflush(out); - return r; -} -int ABI_ATTR i_i4 (int a, int b, int c, int d) -{ - int r=a+b+c+d; - fprintf(out,"int f(4*int):(%d,%d,%d,%d)",a,b,c,d); - fflush(out); - return r; -} -int ABI_ATTR i_i8 (int a, int b, int c, int d, int e, int f, int g, int h) -{ - int r=a+b+c+d+e+f+g+h; - fprintf(out,"int f(8*int):(%d,%d,%d,%d,%d,%d,%d,%d)",a,b,c,d,e,f,g,h); - fflush(out); - return r; -} -int ABI_ATTR i_i16 (int a, int b, int c, int d, int e, int f, int g, int h, - int i, int j, int k, int l, int m, int n, int o, int p) -{ - int r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"int f(16*int):(%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d,%d)", - a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - return r; -} - -/* float tests */ -float ABI_ATTR f_f (float a) -{ - float r=a+1.0f; - fprintf(out,"float f(float):(%g)",a); - fflush(out); - return r; -} -float ABI_ATTR f_f2 (float a, float b) -{ - float r=a+b; - fprintf(out,"float f(2*float):(%g,%g)",a,b); - fflush(out); - return r; -} -float ABI_ATTR f_f4 (float a, float b, float c, float d) -{ - float r=a+b+c+d; - fprintf(out,"float f(4*float):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - return r; -} -float ABI_ATTR f_f8 (float a, float b, float c, float d, float e, float f, - float g, float h) -{ - float r=a+b+c+d+e+f+g+h; - fprintf(out,"float f(8*float):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - return r; -} -float ABI_ATTR f_f16 (float a, float b, float c, float d, float e, float f, float g, float h, - float i, float j, float k, float l, float m, float n, float o, float p) -{ - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"float f(16*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - return r; -} -float ABI_ATTR f_f24 (float a, float b, float c, float d, float e, float f, float g, float h, - float i, float j, float k, float l, float m, float n, float o, float p, - float q, float s, float t, float u, float v, float w, float x, float y) -{ - float r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+v+w+x+y; - fprintf(out,"float f(24*float):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,v,w,x,y); - fflush(out); - return r; -} - -/* double tests */ -double ABI_ATTR d_d (double a) -{ - double r=a+1.0; - fprintf(out,"double f(double):(%g)",a); - fflush(out); - return r; -} -double ABI_ATTR d_d2 (double a, double b) -{ - double r=a+b; - fprintf(out,"double f(2*double):(%g,%g)",a,b); - fflush(out); - return r; -} -double ABI_ATTR d_d4 (double a, double b, double c, double d) -{ - double r=a+b+c+d; - fprintf(out,"double f(4*double):(%g,%g,%g,%g)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_d8 (double a, double b, double c, double d, double e, double f, - double g, double h) -{ - double r=a+b+c+d+e+f+g+h; - fprintf(out,"double f(8*double):(%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h); - fflush(out); - return r; -} -double ABI_ATTR d_d16 (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, double o, double p) -{ - double r=a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p; - fprintf(out,"double f(16*double):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p); - fflush(out); - return r; -} - -/* pointer tests */ -void* ABI_ATTR vp_vpdpcpsp (void* a, double* b, char* c, Int* d) -{ - void* ret = (char*)b + 1; - fprintf(out,"void* f(void*,double*,char*,Int*):(0x%p,0x%p,0x%p,0x%p)",a,b,c,d); - fflush(out); - return ret; -} - -/* mixed number tests */ -uchar ABI_ATTR uc_ucsil (uchar a, ushort b, uint c, ulong d) -{ - uchar r = (uchar)-1; - fprintf(out,"uchar f(uchar,ushort,uint,ulong):(%u,%u,%u,%lu)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_iidd (int a, int b, double c, double d) -{ - double r = a+b+c+d; - fprintf(out,"double f(int,int,double,double):(%d,%d,%g,%g)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_iiidi (int a, int b, int c, double d, int e) -{ - double r = a+b+c+d+e; - fprintf(out,"double f(int,int,int,double,int):(%d,%d,%d,%g,%d)",a,b,c,d,e); - fflush(out); - return r; -} -double ABI_ATTR d_idid (int a, double b, int c, double d) -{ - double r = a+b+c+d; - fprintf(out,"double f(int,double,int,double):(%d,%g,%d,%g)",a,b,c,d); - fflush(out); - return r; -} -double ABI_ATTR d_fdi (float a, double b, int c) -{ - double r = a+b+c; - fprintf(out,"double f(float,double,int):(%g,%g,%d)",a,b,c); - fflush(out); - return r; -} -ushort ABI_ATTR us_cdcd (char a, double b, char c, double d) -{ - ushort r = (ushort)(a + b + c + d); - fprintf(out,"ushort f(char,double,char,double):('%c',%g,'%c',%g)",a,b,c,d); - fflush(out); - return r; -} - -long long ABI_ATTR ll_iiilli (int a, int b, int c, long long d, int e) -{ - long long r = (long long)(int)a+(long long)(int)b+(long long)(int)c+d+(long long)(int)e; - fprintf(out,"long long f(int,int,int,long long,int):(%d,%d,%d,0x%lx%08lx,%d)",a,b,c,(long)(d>>32),(long)(d&0xffffffff),e); - fflush(out); - return r; -} -long long ABI_ATTR ll_flli (float a, long long b, int c) -{ - long long r = (long long)(int)a + b + (long long)c; - fprintf(out,"long long f(float,long long,int):(%g,0x%lx%08lx,0x%lx)",a,(long)(b>>32),(long)(b&0xffffffff),(long)c); - fflush(out); - return r; -} - -float ABI_ATTR f_fi (float a, int z) -{ - float r = a+z; - fprintf(out,"float f(float,int):(%g,%d)",a,z); - fflush(out); - return r; -} -float ABI_ATTR f_f2i (float a, float b, int z) -{ - float r = a+b+z; - fprintf(out,"float f(2*float,int):(%g,%g,%d)",a,b,z); - fflush(out); - return r; -} -float ABI_ATTR f_f3i (float a, float b, float c, int z) -{ - float r = a+b+c+z; - fprintf(out,"float f(3*float,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - return r; -} -float ABI_ATTR f_f4i (float a, float b, float c, float d, int z) -{ - float r = a+b+c+d+z; - fprintf(out,"float f(4*float,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - return r; -} -float ABI_ATTR f_f7i (float a, float b, float c, float d, float e, float f, float g, - int z) -{ - float r = a+b+c+d+e+f+g+z; - fprintf(out,"float f(7*float,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - return r; -} -float ABI_ATTR f_f8i (float a, float b, float c, float d, float e, float f, float g, - float h, int z) -{ - float r = a+b+c+d+e+f+g+h+z; - fprintf(out,"float f(8*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - return r; -} -float ABI_ATTR f_f12i (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, int z) -{ - float r = a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"float f(12*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - return r; -} -float ABI_ATTR f_f13i (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, int z) -{ - float r = a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"float f(13*float,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - return r; -} - -double ABI_ATTR d_di (double a, int z) -{ - double r = a+z; - fprintf(out,"double f(double,int):(%g,%d)",a,z); - fflush(out); - return r; -} -double ABI_ATTR d_d2i (double a, double b, int z) -{ - double r = a+b+z; - fprintf(out,"double f(2*double,int):(%g,%g,%d)",a,b,z); - fflush(out); - return r; -} -double ABI_ATTR d_d3i (double a, double b, double c, int z) -{ - double r = a+b+c+z; - fprintf(out,"double f(3*double,int):(%g,%g,%g,%d)",a,b,c,z); - fflush(out); - return r; -} -double ABI_ATTR d_d4i (double a, double b, double c, double d, int z) -{ - double r = a+b+c+d+z; - fprintf(out,"double f(4*double,int):(%g,%g,%g,%g,%d)",a,b,c,d,z); - fflush(out); - return r; -} -double ABI_ATTR d_d7i (double a, double b, double c, double d, double e, double f, - double g, int z) -{ - double r = a+b+c+d+e+f+g+z; - fprintf(out,"double f(7*double,int):(%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,z); - fflush(out); - return r; -} -double ABI_ATTR d_d8i (double a, double b, double c, double d, double e, double f, - double g, double h, int z) -{ - double r = a+b+c+d+e+f+g+h+z; - fprintf(out,"double f(8*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,z); - fflush(out); - return r; -} -double ABI_ATTR d_d12i (double a, double b, double c, double d, double e, double f, - double g, double h, double i, double j, double k, double l, - int z) -{ - double r = a+b+c+d+e+f+g+h+i+j+k+l+z; - fprintf(out,"double f(12*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,z); - fflush(out); - return r; -} -double ABI_ATTR d_d13i (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 z) -{ - double r = a+b+c+d+e+f+g+h+i+j+k+l+m+z; - fprintf(out,"double f(13*double,int):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%d)",a,b,c,d,e,f,g,h,i,j,k,l,m,z); - fflush(out); - return r; -} - -/* small structure return tests */ -Size1 ABI_ATTR S1_v (void) -{ - fprintf(out,"Size1 f(void):"); - fflush(out); - return Size1_1; -} -Size2 ABI_ATTR S2_v (void) -{ - fprintf(out,"Size2 f(void):"); - fflush(out); - return Size2_1; -} -Size3 ABI_ATTR S3_v (void) -{ - fprintf(out,"Size3 f(void):"); - fflush(out); - return Size3_1; -} -Size4 ABI_ATTR S4_v (void) -{ - fprintf(out,"Size4 f(void):"); - fflush(out); - return Size4_1; -} -Size7 ABI_ATTR S7_v (void) -{ - fprintf(out,"Size7 f(void):"); - fflush(out); - return Size7_1; -} -Size8 ABI_ATTR S8_v (void) -{ - fprintf(out,"Size8 f(void):"); - fflush(out); - return Size8_1; -} -Size12 ABI_ATTR S12_v (void) -{ - fprintf(out,"Size12 f(void):"); - fflush(out); - return Size12_1; -} -Size15 ABI_ATTR S15_v (void) -{ - fprintf(out,"Size15 f(void):"); - fflush(out); - return Size15_1; -} -Size16 ABI_ATTR S16_v (void) -{ - fprintf(out,"Size16 f(void):"); - fflush(out); - return Size16_1; -} - -/* structure tests */ -Int ABI_ATTR I_III (Int a, Int b, Int c) -{ - Int r; - r.x = a.x + b.x + c.x; - fprintf(out,"Int f(Int,Int,Int):({%d},{%d},{%d})",a.x,b.x,c.x); - fflush(out); - return r; -} -Char ABI_ATTR C_CdC (Char a, double b, Char c) -{ - Char r; - r.x = (a.x + c.x)/2; - fprintf(out,"Char f(Char,double,Char):({'%c'},%g,{'%c'})",a.x,b,c.x); - fflush(out); - return r; -} -Float ABI_ATTR F_Ffd (Float a, float b, double c) -{ - Float r; - r.x = (float) (a.x + b + c); - fprintf(out,"Float f(Float,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - return r; -} -Double ABI_ATTR D_fDd (float a, Double b, double c) -{ - Double r; - r.x = a + b.x + c; - fprintf(out,"Double f(float,Double,double):(%g,{%g},%g)",a,b.x,c); - fflush(out); - return r; -} -Double ABI_ATTR D_Dfd (Double a, float b, double c) -{ - Double r; - r.x = a.x + b + c; - fprintf(out,"Double f(Double,float,double):({%g},%g,%g)",a.x,b,c); - fflush(out); - return r; -} -J ABI_ATTR J_JiJ (J a, int b, J c) -{ - J r; - r.l1 = a.l1+c.l1; r.l2 = a.l2+b+c.l2; - fprintf(out,"J f(J,int,J):({%ld,%ld},%d,{%ld,%ld})",a.l1,a.l2,b,c.l1,c.l2); - fflush(out); - return r; -} -T ABI_ATTR T_TcT (T a, char b, T c) -{ - T r; - r.c[0]='b'; r.c[1]=c.c[1]; r.c[2]=c.c[2]; - fprintf(out,"T f(T,char,T):({\"%c%c%c\"},'%c',{\"%c%c%c\"})",a.c[0],a.c[1],a.c[2],b,c.c[0],c.c[1],c.c[2]); - fflush(out); - return r; -} -X ABI_ATTR X_BcdB (B a, char b, double c, B d) -{ - static X xr={"return val",'R'}; - X r; - r = xr; - r.c1 = b; - fprintf(out,"X f(B,char,double,B):({%g,{%d,%d,%d}},'%c',%g,{%g,{%d,%d,%d}})", - a.d,a.i[0],a.i[1],a.i[2],b,c,d.d,d.i[0],d.i[1],d.i[2]); - fflush(out); - return r; -} - -/* Test for cases where some argument (especially structure, 'long long', or - 'double') may be passed partially in general-purpose argument registers - and partially on the stack. Different ABIs pass between 4 and 8 arguments - (or none) in general-purpose argument registers. */ - -long ABI_ATTR l_l0K (K b, long c) -{ - long r = b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(K,long):(%ld,%ld,%ld,%ld,%ld)",b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l1K (long a1, K b, long c) -{ - long r = a1 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld)",a1,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l2K (long a1, long a2, K b, long c) -{ - long r = a1 + a2 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(2*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l3K (long a1, long a2, long a3, K b, long c) -{ - long r = a1 + a2 + a3 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(3*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l4K (long a1, long a2, long a3, long a4, K b, long c) -{ - long r = a1 + a2 + a3 + a4 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(4*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l5K (long a1, long a2, long a3, long a4, long a5, K b, long c) -{ - long r = a1 + a2 + a3 + a4 + a5 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(5*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -long ABI_ATTR l_l6K (long a1, long a2, long a3, long a4, long a5, long a6, K b, long c) -{ - long r = a1 + a2 + a3 + a4 + a5 + a6 + b.l1 + b.l2 + b.l3 + b.l4 + c; - fprintf(out,"long f(6*long,K,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a1,a2,a3,a4,a5,a6,b.l1,b.l2,b.l3,b.l4,c); - fflush(out); - return r; -} -/* These tests is crafted on the knowledge that for all known ABIs: - * 17 > number of floating-point argument registers, - * 3 < number of general-purpose argument registers < 3 + 6. */ -float ABI_ATTR f_f17l3L (float a, float b, float c, float d, float e, float f, float g, - float h, float i, float j, float k, float l, float m, float n, - float o, float p, float q, - long s, long t, long u, L z) -{ - float r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"float f(17*float,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - return r; -} -double ABI_ATTR d_d17l3L (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, double o, double p, double q, - long s, long t, long u, L z) -{ - double r = a+b+c+d+e+f+g+h+i+j+k+l+m+n+o+p+q+s+t+u+z.l1+z.l2+z.l3+z.l4+z.l5+z.l6; - fprintf(out,"double f(17*double,3*int,L):(%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%g,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld,%ld)",a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,s,t,u,z.l1,z.l2,z.l3,z.l4,z.l5,z.l6); - fflush(out); - return r; -} - -long long ABI_ATTR ll_l2ll (long a1, long a2, long long b, long c) -{ - long long r = (long long) (a1 + a2) + b + c; - fprintf(out,"long long f(2*long,long long,long):(%ld,%ld,0x%lx%08lx,%ld)",a1,a2,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l3ll (long a1, long a2, long a3, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3) + b + c; - fprintf(out,"long long f(3*long,long long,long):(%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l4ll (long a1, long a2, long a3, long a4, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"long long f(4*long,long long,long):(%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l5ll (long a1, long a2, long a3, long a4, long a5, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"long long f(5*long,long long,long):(%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l6ll (long a1, long a2, long a3, long a4, long a5, long a6, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"long long f(6*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} -long long ABI_ATTR ll_l7ll (long a1, long a2, long a3, long a4, long a5, long a6, long a7, long long b, long c) -{ - long long r = (long long) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"long long f(7*long,long long,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,0x%lx%08lx,%ld)",a1,a2,a3,a4,a5,a6,a7,(long)(b>>32),(long)(b&0xffffffff),c); - fflush(out); - return r; -} - -double ABI_ATTR d_l2d (long a1, long a2, double b, long c) -{ - double r = (double) (a1 + a2) + b + c; - fprintf(out,"double f(2*long,double,long):(%ld,%ld,%g,%ld)",a1,a2,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l3d (long a1, long a2, long a3, double b, long c) -{ - double r = (double) (a1 + a2 + a3) + b + c; - fprintf(out,"double f(3*long,double,long):(%ld,%ld,%ld,%g,%ld)",a1,a2,a3,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l4d (long a1, long a2, long a3, long a4, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4) + b + c; - fprintf(out,"double f(4*long,double,long):(%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l5d (long a1, long a2, long a3, long a4, long a5, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4 + a5) + b + c; - fprintf(out,"double f(5*long,double,long):(%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l6d (long a1, long a2, long a3, long a4, long a5, long a6, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6) + b + c; - fprintf(out,"double f(6*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,b,c); - fflush(out); - return r; -} -double ABI_ATTR d_l7d (long a1, long a2, long a3, long a4, long a5, long a6, long a7, double b, long c) -{ - double r = (double) (a1 + a2 + a3 + a4 + a5 + a6 + a7) + b + c; - fprintf(out,"double f(7*long,double,long):(%ld,%ld,%ld,%ld,%ld,%ld,%ld,%g,%ld)",a1,a2,a3,a4,a5,a6,a7,b,c); - fflush(out); - return r; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c deleted file mode 100644 index 5d4959c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_mixed.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Area: ffi_call - Purpose: Check for proper argument alignment. - Limitations: none. - PR: none. - Originator: (from many_win32.c) */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static float ABI_ATTR align_arguments(int i1, - double f2, - int i3, - double f4) -{ - return i1+f2+i3+f4; -} - -int main(void) -{ - ffi_cif cif; - ffi_type *args[4] = { - &ffi_type_sint, - &ffi_type_double, - &ffi_type_sint, - &ffi_type_double - }; - double fa[2] = {1,2}; - int ia[2] = {1,2}; - void *values[4] = {&ia[0], &fa[0], &ia[1], &fa[1]}; - float f, ff; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, - &ffi_type_float, args) == FFI_OK); - - ff = align_arguments(ia[0], fa[0], ia[1], fa[1]); - - ffi_call(&cif, FFI_FN(align_arguments), &f, values); - - if (f == ff) - printf("align arguments tests ok!\n"); - else - CHECK(0); - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c deleted file mode 100644 index 5e5cb86..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Area: ffi_call - Purpose: Check for proper argument alignment. - Limitations: none. - PR: none. - Originator: (from many_win32.c) */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static float ABI_ATTR align_arguments(int i1, - double f2, - int i3, - double f4) -{ - return i1+f2+i3+f4; -} - -int main(void) -{ - ffi_cif cif; - ffi_type *args[4] = { - &ffi_type_sint, - &ffi_type_double, - &ffi_type_sint, - &ffi_type_double - }; - double fa[2] = {1,2}; - int ia[2] = {1,2}; - void *values[4] = {&ia[0], &fa[0], &ia[1], &fa[1]}; - float f, ff; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 4, - &ffi_type_float, args) == FFI_OK); - - ff = align_arguments(ia[0], fa[0], ia[1], fa[1]);; - - ffi_call(&cif, FFI_FN(align_arguments), &f, values); - - if (f == ff) - printf("align arguments tests ok!\n"); - else - CHECK(0); - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/call.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/call.exp deleted file mode 100644 index ab47415..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +++ /dev/null @@ -1,43 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014 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 - -if { [string match $compiler_vendor "microsoft"] } { - # -wd4005 macro redefinition - # -wd4244 implicit conversion to type of smaller size - # -wd4305 truncation to smaller type - # -wd4477 printf %lu of uintptr_t - # -wd4312 implicit conversion to type of greater size - # -wd4311 pointer truncation to unsigned long - # -EHsc C++ Exception Handling (no SEH exceptions) - set additional_options "-wd4005 -wd4244 -wd4305 -wd4477 -wd4312 -wd4311 -EHsc"; -} else { - set additional_options ""; -} - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] - -run-many-tests $tlist $additional_options - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c deleted file mode 100644 index a579ff6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn0.c +++ /dev/null @@ -1,89 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c deleted file mode 100644 index 9123173..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn1.c +++ /dev/null @@ -1,81 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c deleted file mode 100644 index 08ff9d9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn2.c +++ /dev/null @@ -1,81 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c deleted file mode 100644 index 9b54d80..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn3.c +++ /dev/null @@ -1,82 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c deleted file mode 100644 index d4a1530..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn4.c +++ /dev/null @@ -1,89 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c deleted file mode 100644 index 9907442..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn5.c +++ /dev/null @@ -1,92 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c deleted file mode 100644 index 73c54fd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_fn6.c +++ /dev/null @@ -1,90 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c deleted file mode 100644 index b3afa0b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_loc_fn0.c +++ /dev/null @@ -1,95 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c deleted file mode 100644 index 5a4e728..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/closure_simple.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: closure_call - Purpose: Check simple closure handling with all ABIs - Limitations: none. - PR: none. - Originator: */ - -/* { dg-do run } */ -#include "ffitest.h" - -static void -closure_test(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 (ABI_ATTR *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; - - 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, ABI_NUM, 4, - &ffi_type_sint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, closure_test, - (void *) 3 /* userdata */, code) == FFI_OK); - - res = (*(closure_test_type0)code)(0, 1, 2, 3); - /* { dg-output "0 1 2 3: 9" } */ - - printf("res: %d\n",res); - /* { dg-output "\nres: 9" } */ - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c deleted file mode 100644 index ea0825d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_12byte.c +++ /dev/null @@ -1,94 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c deleted file mode 100644 index 89a08a2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_16byte.c +++ /dev/null @@ -1,95 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c deleted file mode 100644 index 9f75da8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_18byte.c +++ /dev/null @@ -1,96 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c deleted file mode 100644 index 278794b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_19byte.c +++ /dev/null @@ -1,102 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c deleted file mode 100644 index 82492c0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_1_1byte.c +++ /dev/null @@ -1,89 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c deleted file mode 100644 index 3f8bb28..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c deleted file mode 100644 index 6562727..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_20byte1.c +++ /dev/null @@ -1,93 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c deleted file mode 100644 index 1d82f6e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_24byte.c +++ /dev/null @@ -1,113 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c deleted file mode 100644 index 81bb0a6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_2byte.c +++ /dev/null @@ -1,90 +0,0 @@ -/* 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]; - - struct cls_struct_2byte g_dbl = { 12, 127 }; - struct cls_struct_2byte f_dbl = { 1, 13 }; - struct cls_struct_2byte res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c deleted file mode 100644 index b782746..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3_1byte.c +++ /dev/null @@ -1,95 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c deleted file mode 100644 index a02c463..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* 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]; - - struct cls_struct_3byte g_dbl = { 12, 119 }; - struct cls_struct_3byte f_dbl = { 1, 15 }; - struct cls_struct_3byte res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c deleted file mode 100644 index c7251ce..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3byte2.c +++ /dev/null @@ -1,90 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c deleted file mode 100644 index 48888f8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_3float.c +++ /dev/null @@ -1,95 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure passing with different structure size. - Depending on the ABI. Check overlapping. - Limitations:>none. - PR: none. - Originator: 20171026 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef struct cls_struct_3float { - float f; - float g; - float h; -} cls_struct_3float; - -cls_struct_3float cls_struct_3float_fn(struct cls_struct_3float a1, - struct cls_struct_3float a2) -{ - struct cls_struct_3float result; - - result.f = a1.f + a2.f; - result.g = a1.g + a2.g; - result.h = a1.h + a2.h; - - printf("%g %g %g %g %g %g: %g %g %g\n", a1.f, a1.g, a1.h, - a2.f, a2.g, a2.h, result.f, result.g, result.h); - - return result; -} - -static void -cls_struct_3float_gn(ffi_cif *cif __UNUSED__, void* resp, void **args, - void* userdata __UNUSED__) -{ - struct cls_struct_3float a1, a2; - - a1 = *(struct cls_struct_3float*)(args[0]); - a2 = *(struct cls_struct_3float*)(args[1]); - - *(cls_struct_3float*)resp = cls_struct_3float_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]; - - struct cls_struct_3float g_dbl = { 1.0f, 2.0f, 3.0f }; - struct cls_struct_3float f_dbl = { 1.0f, 2.0f, 3.0f }; - struct cls_struct_3float res_dbl; - - cls_struct_fields[0] = &ffi_type_float; - cls_struct_fields[1] = &ffi_type_float; - cls_struct_fields[2] = &ffi_type_float; - cls_struct_fields[3] = NULL; - - cls_struct_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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_3float_fn), &res_dbl, args_dbl); - /* { dg-output "1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 2 4 6" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_3float_gn, NULL, code) == - FFI_OK); - - res_dbl = ((cls_struct_3float(*)(cls_struct_3float, - cls_struct_3float))(code))(g_dbl, f_dbl); - /* { dg-output "\n1 2 3 1 2 3: 2 4 6" } */ - printf("res: %g %g %g\n", res_dbl.f, res_dbl.g, res_dbl.h); - /* { dg-output "\nres: 2 4 6" } */ - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c deleted file mode 100644 index 2d6d8b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4_1byte.c +++ /dev/null @@ -1,98 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c deleted file mode 100644 index 4ac3787..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_4byte.c +++ /dev/null @@ -1,90 +0,0 @@ -/* 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]; - - struct cls_struct_4byte g_dbl = { 127, 120 }; - struct cls_struct_4byte f_dbl = { 12, 128 }; - struct cls_struct_4byte res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c deleted file mode 100644 index ad9d51c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5_1_byte.c +++ /dev/null @@ -1,109 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c deleted file mode 100644 index 4e0c000..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_5byte.c +++ /dev/null @@ -1,98 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c deleted file mode 100644 index a55edc2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_64byte.c +++ /dev/null @@ -1,124 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c deleted file mode 100644 index b4dcdba..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6_1_byte.c +++ /dev/null @@ -1,113 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c deleted file mode 100644 index 7406780..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_6byte.c +++ /dev/null @@ -1,99 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c deleted file mode 100644 index 14a7e96..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7_1_byte.c +++ /dev/null @@ -1,117 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c deleted file mode 100644 index 1645cc6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_7byte.c +++ /dev/null @@ -1,97 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c deleted file mode 100644 index f6c1ea5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_8byte.c +++ /dev/null @@ -1,88 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c deleted file mode 100644 index 0b85722..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c deleted file mode 100644 index edf991d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_9byte2.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c deleted file mode 100644 index aad5f3c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_double.c +++ /dev/null @@ -1,93 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c deleted file mode 100644 index 37e0855..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_float.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c deleted file mode 100644 index b3322d8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble.c +++ /dev/null @@ -1,92 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c deleted file mode 100644 index cc1c43b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split.c +++ /dev/null @@ -1,132 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: 20031203 */ - -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ - -#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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c deleted file mode 100644 index 5d3bec0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_longdouble_split2.c +++ /dev/null @@ -1,115 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of long double. - Limitations: none. - PR: none. - Originator: Blake Chaffin 6/18/2007 -*/ - -/* { dg-do run { xfail strongarm*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ - -#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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c deleted file mode 100644 index 8fbf36a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_pointer.c +++ /dev/null @@ -1,95 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c deleted file mode 100644 index 039b874..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint16.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c deleted file mode 100644 index c96c6d1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint32.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c deleted file mode 100644 index 9aa7bdd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_sint64.c +++ /dev/null @@ -1,92 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c deleted file mode 100644 index 97620b7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint16.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c deleted file mode 100644 index 5766fad..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint32.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c deleted file mode 100644 index a52cb89..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_align_uint64.c +++ /dev/null @@ -1,93 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c deleted file mode 100644 index e451dea..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_dbls_struct.c +++ /dev/null @@ -1,66 +0,0 @@ -/* 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]; - - Dbls arg = { 1.0, 2.0 }; - - 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; - - /* 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" } */ - - closure_test_fn(arg); - /* { dg-output "\n1.0 2.0" } */ - - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c deleted file mode 100644 index 84ad4cb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double.c +++ /dev/null @@ -1,43 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c deleted file mode 100644 index e077f92..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_double_va.c +++ /dev/null @@ -1,61 +0,0 @@ -/* 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 */ - -#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; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 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*, ...))(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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c deleted file mode 100644 index 0090fed..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_float.c +++ /dev/null @@ -1,42 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c deleted file mode 100644 index d24e72e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble.c +++ /dev/null @@ -1,105 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check long double arguments. - Limitations: none. - PR: none. - Originator: Blake Chaffin */ - -/* This test is known to PASS on armv7l-unknown-linux-gnueabihf, so I have - remove the xfail for arm*-*-* below, until we know more. */ -/* { dg-do run { xfail strongarm*-*-* xscale*-*-* } } */ -/* { dg-options -mlong-double-128 { target powerpc64*-*-linux* } } */ - -#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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c deleted file mode 100644 index 39b438b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_longdouble_va.c +++ /dev/null @@ -1,61 +0,0 @@ -/* 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 */ - -#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; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 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*, ...))(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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c deleted file mode 100644 index 7fd6c82..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_args.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Area: closure_call - Purpose: Check closures called with many args of mixed types - Limitations: none. - PR: none. - Originator: */ - -/* { dg-do run } */ -#include "ffitest.h" -#include -#include - -#define NARGS 16 - -static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) -{ - int i; - double r = 0; - double t; - for(i = 0; i < NARGS; i++) - { - if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15) - { - t = *(long int *)args[i]; - CHECK(t == i+1); - } - else - { - t = *(double *)args[i]; - CHECK(fabs(t - ((i+1) * 0.1)) < FLT_EPSILON); - } - r += t; - } - *(double *)resp = r; -} -typedef double (*cls_ret_double)(double, double, double, double, long int, -double, double, double, double, long int, double, long int, double, long int, -double, 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[NARGS]; - double res; - int i; - double expected = 64.9; - - for(i = 0; i < NARGS; i++) - { - if(i == 4 || i == 9 || i == 11 || i == 13 || i == 15) - cl_arg_types[i] = &ffi_type_slong; - else - cl_arg_types[i] = &ffi_type_double; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, NARGS, - &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))(0.1, 0.2, 0.3, 0.4, 5, 0.6, 0.7, 0.8, 0.9, 10, - 1.1, 12, 1.3, 14, 1.5, 16); - if (fabs(res - expected) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c deleted file mode 100644 index 62b0697..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_many_mixed_float_double.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: closure_call - Purpose: Check register allocation for closure calls with many float and double arguments - Limitations: none. - PR: none. - Originator: */ - -/* { dg-do run } */ -#include "ffitest.h" -#include -#include - -#define NARGS 16 - -static void cls_mixed_float_double_fn(ffi_cif* cif , void* ret, void** args, - void* userdata __UNUSED__) -{ - double r = 0; - unsigned int i; - double t; - for(i=0; i < cif->nargs; i++) - { - if(cif->arg_types[i] == &ffi_type_double) { - t = *(((double**)(args))[i]); - } else { - t = *(((float**)(args))[i]); - } - r += t; - } - *((double*)ret) = r; -} -typedef double (*cls_mixed)(double, float, double, double, double, double, double, float, float, double, float, float); - -int main (void) -{ - ffi_cif cif; - ffi_closure *closure; - void* code; - ffi_type *argtypes[12] = {&ffi_type_double, &ffi_type_float, &ffi_type_double, - &ffi_type_double, &ffi_type_double, &ffi_type_double, - &ffi_type_double, &ffi_type_float, &ffi_type_float, - &ffi_type_double, &ffi_type_float, &ffi_type_float}; - - - closure = ffi_closure_alloc(sizeof(ffi_closure), (void**)&code); - if(closure ==NULL) - abort(); - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 12, &ffi_type_double, argtypes) == FFI_OK); - CHECK(ffi_prep_closure_loc(closure, &cif, cls_mixed_float_double_fn, NULL, code) == FFI_OK); - double ret = ((cls_mixed)code)(0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0, 1.1, 1.2); - ffi_closure_free(closure); - if(fabs(ret - 7.8) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c deleted file mode 100644 index 71df7b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_schar.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c deleted file mode 100644 index 4c39153..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshort.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c deleted file mode 100644 index 1c3aeb5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_sshortchar.c +++ /dev/null @@ -1,86 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c deleted file mode 100644 index 009c02c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_uchar.c +++ /dev/null @@ -1,91 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c deleted file mode 100644 index dd10ca7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushort.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c deleted file mode 100644 index 2588e97..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_multi_ushortchar.c +++ /dev/null @@ -1,86 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c deleted file mode 100644 index d82a87a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c deleted file mode 100644 index 1f1d915..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_pointer_stack.c +++ /dev/null @@ -1,142 +0,0 @@ -/* 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; - void* result; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - 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; - void* result; - - dummyVar = dummy_func(trample1, trample2, trample3, trample4, - trample5, trample6, trample7, trample8); - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c deleted file mode 100644 index 82986b1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_schar.c +++ /dev/null @@ -1,44 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c deleted file mode 100644 index c7e13b7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sint.c +++ /dev/null @@ -1,42 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c deleted file mode 100644 index 846d57e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_sshort.c +++ /dev/null @@ -1,42 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c deleted file mode 100644 index 6d1fdae..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_struct_va1.c +++ /dev/null @@ -1,114 +0,0 @@ -/* 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 } */ -/* { dg-output "" { xfail avr32*-*-* } } */ -#include "ffitest.h" - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static void -test_fn (ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - int n = *(int*)args[0]; - struct small_tag s1 = * (struct small_tag *) args[1]; - struct large_tag l1 = * (struct large_tag *) args[2]; - struct small_tag s2 = * (struct small_tag *) args[3]; - - printf ("%d %d %d %d %d %d %d %d %d %d\n", n, s1.a, s1.b, - l1.a, l1.b, l1.c, l1.d, l1.e, - s2.a, s2.b); - * (ffi_arg*) resp = 42; -} - -int -main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc (sizeof (ffi_closure), &code); - ffi_type* arg_types[5]; - - ffi_arg res = 0; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int si; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, - arg_types) == FFI_OK); - - si = 4; - s1.a = 5; - s1.b = 6; - - s2.a = 20; - s2.b = 21; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - CHECK(ffi_prep_closure_loc(pcl, &cif, test_fn, NULL, code) == FFI_OK); - - res = ((int (*)(int, ...))(code))(si, s1, l1, s2); - /* { dg-output "4 5 6 10 11 12 13 14 20 21" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c deleted file mode 100644 index c1317e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar.c +++ /dev/null @@ -1,42 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c deleted file mode 100644 index 6491c5b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uchar_va.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned char argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef unsigned char T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_uchar; - cl_arg_types[1] = &ffi_type_uchar; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_uchar, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c deleted file mode 100644 index 885cff5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint.c +++ /dev/null @@ -1,43 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c deleted file mode 100644 index b04cfd1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_uint_va.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned int argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef unsigned int T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)*(ffi_arg *)resp, *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_uint; - cl_arg_types[1] = &ffi_type_uint; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_uint, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c deleted file mode 100644 index 0315082..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulong_va.c +++ /dev/null @@ -1,45 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned long argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ - -#include "ffitest.h" - -typedef unsigned long T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(T *)resp = *(T *)args[0]; - - printf("%ld: %ld %ld\n", *(T *)resp, *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - cl_arg_types[0] = &ffi_type_ulong; - cl_arg_types[1] = &ffi_type_ulong; - cl_arg_types[2] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_ulong, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %ld\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c deleted file mode 100644 index 62f2cae..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ulonglong.c +++ /dev/null @@ -1,47 +0,0 @@ -/* 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= 0xfffffffffffffffLL ^ *(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: 1152921504606846761" } */ - printf("res: %" PRIdLL "\n", res); - /* { dg-output "\nres: 1152921504606846761" } */ - - res = (*((cls_ret_ulonglong)code))(9223372035854775808LL); - /* { dg-output "\n9223372035854775808: 8070450533247928831" } */ - printf("res: %" PRIdLL "\n", res); - /* { dg-output "\nres: 8070450533247928831" } */ - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c deleted file mode 100644 index a00100e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort.c +++ /dev/null @@ -1,43 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c deleted file mode 100644 index 37aa106..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/cls_ushort_va.c +++ /dev/null @@ -1,44 +0,0 @@ -/* Area: closure_call - Purpose: Test anonymous unsigned short argument. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef unsigned short T; - -static void cls_ret_T_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - *(ffi_arg *)resp = *(T *)args[0]; - - printf("%d: %d %d\n", (int)(*(ffi_arg *)resp), *(T *)args[0], *(T *)args[1]); - } - -typedef T (*cls_ret_T)(T, ...); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[3]; - T res; - - 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_var(&cif, FFI_DEFAULT_ABI, 1, 2, - &ffi_type_ushort, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_T_fn, NULL, code) == FFI_OK); - res = ((((cls_ret_T)code)(67, 4))); - /* { dg-output "67: 67 4" } */ - printf("res: %d\n", res); - /* { dg-output "\nres: 67" } */ - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c deleted file mode 100644 index f5a7317..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_abi.c +++ /dev/null @@ -1,36 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c deleted file mode 100644 index bf60161..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/err_bad_typedef.c +++ /dev/null @@ -1,26 +0,0 @@ -/* 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]; - - ffi_type badType = ffi_type_void; - - arg_types[0] = NULL; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h deleted file mode 100644 index cfce1ad..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +++ /dev/null @@ -1,138 +0,0 @@ -#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) (void)(!(x) ? (abort(), 1) : 0) - -/* Define macros so that compilers other than gcc can run the tests. */ -#undef __UNUSED__ -#if defined(__GNUC__) -#define __UNUSED__ __attribute__((__unused__)) -#define __STDCALL__ __attribute__((stdcall)) -#define __THISCALL__ __attribute__((thiscall)) -#define __FASTCALL__ __attribute__((fastcall)) -#define __MSABI__ __attribute__((ms_abi)) -#else -#define __UNUSED__ -#define __STDCALL__ __stdcall -#define __THISCALL__ __thiscall -#define __FASTCALL__ __fastcall -#endif - -#ifndef ABI_NUM -#define ABI_NUM FFI_DEFAULT_ABI -#define ABI_ATTR -#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. */ -#if defined(_WIN64) | defined(_WIN32) -#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 - -/* MSVC kludge. */ -#if defined _MSC_VER -#if !defined(__cplusplus) || defined(__STDC_FORMAT_MACROS) -#define PRIuPTR "lu" -#define PRIu8 "u" -#define PRId8 "d" -#define PRIu64 "I64u" -#define PRId64 "I64d" -#endif -#endif - -#ifndef PRIuPTR -#define PRIuPTR "u" -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float.c deleted file mode 100644 index fbc272d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float.c +++ /dev/null @@ -1,59 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/float1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float1.c deleted file mode 100644 index c48493c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float1.c +++ /dev/null @@ -1,60 +0,0 @@ -/* 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" - -#include - -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(fabs(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.25/ext/ffi_c/libffi/testsuite/libffi.call/float2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float2.c deleted file mode 100644 index d583e22..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float2.c +++ /dev/null @@ -1,60 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long double. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ -/* { dg-do run } */ - -#include "ffitest.h" -#include "float.h" - -#include - -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; - long double original; - - 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 */ - original = ldblit(f); - if (((ld > original) ? (ld - original) : (original - ld)) < 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.25/ext/ffi_c/libffi/testsuite/libffi.call/float3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float3.c deleted file mode 100644 index bab3206..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float3.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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" - -#include - -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(fabs(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(fabs(rd - floating_2(ld, d, f)) < DBL_EPSILON); - - exit (0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float4.c deleted file mode 100644 index 0dd6d85..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float4.c +++ /dev/null @@ -1,62 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c deleted file mode 100644 index 5acff91..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/float_va.c +++ /dev/null @@ -1,107 +0,0 @@ -/* Area: fp and variadics - Purpose: check fp inputs and returns work on variadics, even the fixed params - Limitations: None - PR: none - Originator: 2011-01-25 - - Intended to stress the difference in ABI on ARM vfp -*/ - -/* { dg-do run } */ - -#include - -#include "ffitest.h" - -/* prints out all the parameters, and returns the sum of them all. - * 'x' is the number of variadic parameters all of which are double in this test - */ -double float_va_fn(unsigned int x, double y,...) -{ - double total=0.0; - va_list ap; - unsigned int i; - - total+=(double)x; - total+=y; - - printf("%u: %.1f :", x, y); - - va_start(ap, y); - for(i=0;i -#include -#include - -static float ABI_ATTR 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, ABI_NUM, 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 (fabs(f - ff) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many2.c deleted file mode 100644 index 1c85746..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many2.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Area: ffi_call - Purpose: Check uint8_t arguments. - Limitations: none. - PR: PR45677. - Originator: Dan Witte 20100916 */ - -/* { dg-do run } */ - -#include "ffitest.h" - -#define NARGS 7 - -typedef unsigned char u8; - -#ifdef __GNUC__ -__attribute__((noinline)) -#endif -uint8_t -foo (uint8_t a, uint8_t b, uint8_t c, uint8_t d, - uint8_t e, uint8_t f, uint8_t g) -{ - return a + b + c + d + e + f + g; -} - -uint8_t ABI_ATTR -bar (uint8_t a, uint8_t b, uint8_t c, uint8_t d, - uint8_t e, uint8_t f, uint8_t g) -{ - return foo (a, b, c, d, e, f, g); -} - -int -main (void) -{ - ffi_type *ffitypes[NARGS]; - int i; - ffi_cif cif; - ffi_arg result = 0; - uint8_t args[NARGS]; - void *argptrs[NARGS]; - - for (i = 0; i < NARGS; ++i) - ffitypes[i] = &ffi_type_uint8; - - CHECK (ffi_prep_cif (&cif, ABI_NUM, NARGS, - &ffi_type_uint8, ffitypes) == FFI_OK); - - for (i = 0; i < NARGS; ++i) - { - args[i] = i; - argptrs[i] = &args[i]; - } - ffi_call (&cif, FFI_FN (bar), &result, argptrs); - - CHECK (result == 21); - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c deleted file mode 100644 index 4ef8c8a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_double.c +++ /dev/null @@ -1,70 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double, with many arguments - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -#include -#include -#include - -static double many(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) -{ -#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]; - double fa[13]; - double f, ff; - int i; - - for (i = 0; i < 13; i++) - { - args[i] = &ffi_type_double; - values[i] = &fa[i]; - fa[i] = (double) i; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, - &ffi_type_double, 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 (fabs(f - ff) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c deleted file mode 100644 index 85ec36e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/many_mixed.c +++ /dev/null @@ -1,78 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value double, with many arguments - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ -#include "ffitest.h" - -#include -#include -#include - -static double many(double f1, - double f2, - long int i1, - double f3, - double f4, - long int i2, - double f5, - double f6, - long int i3, - double f7, - double f8, - long int i4, - double f9, - double f10, - long int i5, - double f11, - double f12, - long int i6, - double f13) -{ - return ((double) (i1 + i2 + i3 + i4 + i5 + i6) + (f1/f2+f3/f4+f5/f6+f7/f8+f9/f10+f11/f12) * f13); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[19]; - void *values[19]; - double fa[19]; - long int la[19]; - double f, ff; - int i; - - for (i = 0; i < 19; i++) - { - if( (i - 2) % 3 == 0) { - args[i] = &ffi_type_slong; - la[i] = (long int) i; - values[i] = &la[i]; - } - else { - args[i] = &ffi_type_double; - fa[i] = (double) i; - values[i] = &fa[i]; - } - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 19, - &ffi_type_double, args) == FFI_OK); - - ffi_call(&cif, FFI_FN(many), &f, values); - - ff = many(fa[0], fa[1], la[2], - fa[3], fa[4], la[5], - fa[6], fa[7], la[8], - fa[9], fa[10], la[11], - fa[12], fa[13], la[14], - fa[15], fa[16], la[17], - fa[18]); - if (fabs(f - ff) < FLT_EPSILON) - exit(0); - else - abort(); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/negint.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/negint.c deleted file mode 100644 index 6e2f26f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/negint.c +++ /dev/null @@ -1,52 +0,0 @@ -/* Area: ffi_call - Purpose: Check that negative integers are passed correctly. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c deleted file mode 100644 index c15e3a0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct.c +++ /dev/null @@ -1,152 +0,0 @@ -/* 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]; - - 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_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; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c deleted file mode 100644 index 477a6b9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct1.c +++ /dev/null @@ -1,161 +0,0 @@ -/* 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]; - - 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_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; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c deleted file mode 100644 index 3cf2b44..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +++ /dev/null @@ -1,134 +0,0 @@ -/* 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; - result.z = 0; - - 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]; - - 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_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; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c deleted file mode 100644 index 3510493..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct11.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check parameter passing with nested structs - of a single type. This tests the special cases - for homogeneous floating-point aggregates in the - AArch64 PCS. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct A { - float a_x; - float a_y; -} A; - -typedef struct B { - float b_x; - float b_y; -} B; - -typedef struct C { - A a; - B b; -} C; - -static C C_fn (int x, int y, int z, C source, int i, int j, int k) -{ - C result; - result.a.a_x = source.a.a_x; - result.a.a_y = source.a.a_y; - result.b.b_x = source.b.b_x; - result.b.b_y = source.b.b_y; - - printf ("%d, %d, %d, %d, %d, %d\n", x, y, z, i, j, k); - - printf ("%.1f, %.1f, %.1f, %.1f, " - "%.1f, %.1f, %.1f, %.1f\n", - source.a.a_x, source.a.a_y, - source.b.b_x, source.b.b_y, - result.a.a_x, result.a.a_y, - result.b.b_x, result.b.b_y); - - return result; -} - -int main (void) -{ - ffi_cif cif; - - ffi_type* struct_fields_source_a[3]; - ffi_type* struct_fields_source_b[3]; - ffi_type* struct_fields_source_c[3]; - ffi_type* arg_types[8]; - - ffi_type struct_type_a, struct_type_b, struct_type_c; - - struct A source_fld_a = {1.0, 2.0}; - struct B source_fld_b = {4.0, 8.0}; - int k = 1; - - struct C result; - struct C source = {source_fld_a, source_fld_b}; - - struct_type_a.size = 0; - struct_type_a.alignment = 0; - struct_type_a.type = FFI_TYPE_STRUCT; - struct_type_a.elements = struct_fields_source_a; - - struct_type_b.size = 0; - struct_type_b.alignment = 0; - struct_type_b.type = FFI_TYPE_STRUCT; - struct_type_b.elements = struct_fields_source_b; - - struct_type_c.size = 0; - struct_type_c.alignment = 0; - struct_type_c.type = FFI_TYPE_STRUCT; - struct_type_c.elements = struct_fields_source_c; - - struct_fields_source_a[0] = &ffi_type_float; - struct_fields_source_a[1] = &ffi_type_float; - struct_fields_source_a[2] = NULL; - - struct_fields_source_b[0] = &ffi_type_float; - struct_fields_source_b[1] = &ffi_type_float; - struct_fields_source_b[2] = NULL; - - struct_fields_source_c[0] = &struct_type_a; - struct_fields_source_c[1] = &struct_type_b; - struct_fields_source_c[2] = NULL; - - arg_types[0] = &ffi_type_sint32; - arg_types[1] = &ffi_type_sint32; - arg_types[2] = &ffi_type_sint32; - arg_types[3] = &struct_type_c; - arg_types[4] = &ffi_type_sint32; - arg_types[5] = &ffi_type_sint32; - arg_types[6] = &ffi_type_sint32; - arg_types[7] = NULL; - - void *args[7]; - args[0] = &k; - args[1] = &k; - args[2] = &k; - args[3] = &source; - args[4] = &k; - args[5] = &k; - args[6] = &k; - CHECK (ffi_prep_cif (&cif, FFI_DEFAULT_ABI, 7, &struct_type_c, - arg_types) == FFI_OK); - - ffi_call (&cif, FFI_FN (C_fn), &result, args); - /* { dg-output "1, 1, 1, 1, 1, 1\n" } */ - /* { dg-output "1.0, 2.0, 4.0, 8.0, 1.0, 2.0, 4.0, 8.0" } */ - CHECK (result.a.a_x == source.a.a_x); - CHECK (result.a.a_y == source.a.a_y); - CHECK (result.b.b_x == source.b.b_x); - CHECK (result.b.b_y == source.b.b_y); - exit (0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c deleted file mode 100644 index 69268cd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct2.c +++ /dev/null @@ -1,110 +0,0 @@ -/* 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]; - - struct A e_dbl = { 1, 7}; - struct B f_dbl = {{12 , 127}, 99}; - - struct B res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c deleted file mode 100644 index ab18cad..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct3.c +++ /dev/null @@ -1,111 +0,0 @@ -/* 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]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12LL , 127}, 99}; - - struct B res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c deleted file mode 100644 index 2ffb4d6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct4.c +++ /dev/null @@ -1,111 +0,0 @@ -/* 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]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c deleted file mode 100644 index 6c79845..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct5.c +++ /dev/null @@ -1,112 +0,0 @@ -/* 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]; - - struct A e_dbl = { 1.0, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c deleted file mode 100644 index 59d3579..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct6.c +++ /dev/null @@ -1,131 +0,0 @@ -/* 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]; - - 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_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; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c deleted file mode 100644 index 27595e6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct7.c +++ /dev/null @@ -1,111 +0,0 @@ -/* 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]; - - struct A e_dbl = { 1LL, 7}; - struct B f_dbl = {{12.0 , 127}, 99}; - - struct B res_dbl; - - 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_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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c deleted file mode 100644 index 0e6c682..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct8.c +++ /dev/null @@ -1,131 +0,0 @@ -/* 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]; - - 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_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; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c deleted file mode 100644 index 5f7ac67..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct9.c +++ /dev/null @@ -1,131 +0,0 @@ -/* 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]; - - 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_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; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c deleted file mode 100644 index 23d88b3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/offsets.c +++ /dev/null @@ -1,46 +0,0 @@ -/* Area: Struct layout - Purpose: Test ffi_get_struct_offsets - Limitations: none. - PR: none. - Originator: Tom Tromey. */ - -/* { dg-do run } */ -#include "ffitest.h" -#include - -struct test_1 -{ - char c; - float f; - char c2; - int i; -}; - -int -main (void) -{ - ffi_type test_1_type; - ffi_type *test_1_elements[5]; - size_t test_1_offsets[4]; - - test_1_elements[0] = &ffi_type_schar; - test_1_elements[1] = &ffi_type_float; - test_1_elements[2] = &ffi_type_schar; - test_1_elements[3] = &ffi_type_sint; - test_1_elements[4] = NULL; - - test_1_type.size = 0; - test_1_type.alignment = 0; - test_1_type.type = FFI_TYPE_STRUCT; - test_1_type.elements = test_1_elements; - - CHECK (ffi_get_struct_offsets (FFI_DEFAULT_ABI, &test_1_type, test_1_offsets) - == FFI_OK); - CHECK (test_1_type.size == sizeof (struct test_1)); - CHECK (offsetof (struct test_1, c) == test_1_offsets[0]); - CHECK (offsetof (struct test_1, f) == test_1_offsets[1]); - CHECK (offsetof (struct test_1, c2) == test_1_offsets[2]); - CHECK (offsetof (struct test_1, i) == test_1_offsets[3]); - - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c deleted file mode 100644 index 7da1621..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/pr1172638.c +++ /dev/null @@ -1,127 +0,0 @@ -/* Area: ffi_call - Purpose: Reproduce bug found in python ctypes - Limitations: none. - PR: Fedora 1174037 */ - -/* { dg-do run } */ -#include "ffitest.h" - -typedef struct { - long x; - long y; -} POINT; - -typedef struct { - long left; - long top; - long right; - long bottom; -} RECT; - -static RECT ABI_ATTR pr_test(int i __UNUSED__, RECT ar __UNUSED__, - RECT* br __UNUSED__, POINT cp __UNUSED__, - RECT dr __UNUSED__, RECT *er __UNUSED__, - POINT fp, RECT gr __UNUSED__) -{ - RECT result; - - result.left = fp.x; - result.right = fp.y; - result.top = fp.x; - result.bottom = fp.y; - - return result; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_type point_type, rect_type; - ffi_type *point_type_elements[3]; - ffi_type *rect_type_elements[5]; - - int i; - POINT cp, fp; - RECT ar, br, dr, er, gr; - RECT *p1, *p2; - - /* This is a hack to get a properly aligned result buffer */ - RECT *rect_result = - (RECT *) malloc (sizeof(RECT)); - - point_type.size = 0; - point_type.alignment = 0; - point_type.type = FFI_TYPE_STRUCT; - point_type.elements = point_type_elements; - point_type_elements[0] = &ffi_type_slong; - point_type_elements[1] = &ffi_type_slong; - point_type_elements[2] = NULL; - - rect_type.size = 0; - rect_type.alignment = 0; - rect_type.type = FFI_TYPE_STRUCT; - rect_type.elements = rect_type_elements; - rect_type_elements[0] = &ffi_type_slong; - rect_type_elements[1] = &ffi_type_slong; - rect_type_elements[2] = &ffi_type_slong; - rect_type_elements[3] = &ffi_type_slong; - rect_type_elements[4] = NULL; - - args[0] = &ffi_type_sint; - args[1] = &rect_type; - args[2] = &ffi_type_pointer; - args[3] = &point_type; - args[4] = &rect_type; - args[5] = &ffi_type_pointer; - args[6] = &point_type; - args[7] = &rect_type; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 8, &rect_type, args) == FFI_OK); - - i = 1; - ar.left = 2; - ar.right = 3; - ar.top = 4; - ar.bottom = 5; - br.left = 6; - br.right = 7; - br.top = 8; - br.bottom = 9; - cp.x = 10; - cp.y = 11; - dr.left = 12; - dr.right = 13; - dr.top = 14; - dr.bottom = 15; - er.left = 16; - er.right = 17; - er.top = 18; - er.bottom = 19; - fp.x = 20; - fp.y = 21; - gr.left = 22; - gr.right = 23; - gr.top = 24; - gr.bottom = 25; - - values[0] = &i; - values[1] = &ar; - p1 = &br; - values[2] = &p1; - values[3] = &cp; - values[4] = &dr; - p2 = &er; - values[5] = &p2; - values[6] = &fp; - values[7] = &gr; - - ffi_call (&cif, FFI_FN(pr_test), rect_result, values); - - CHECK(rect_result->top == 20); - - free (rect_result); - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c deleted file mode 100644 index 6a91555..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/problem1.c +++ /dev/null @@ -1,90 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c deleted file mode 100644 index 4456161..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/promotion.c +++ /dev/null @@ -1,59 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c deleted file mode 100644 index e29bd6c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/pyobjc-tc.c +++ /dev/null @@ -1,114 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c deleted file mode 100644 index fd07e50..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl.c +++ /dev/null @@ -1,36 +0,0 @@ -/* 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) -{ - printf ("%f\n", 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c deleted file mode 100644 index 0ea5d50..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl1.c +++ /dev/null @@ -1,43 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c deleted file mode 100644 index b3818f8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_dbl2.c +++ /dev/null @@ -1,42 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c deleted file mode 100644 index fb8a09e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl.c +++ /dev/null @@ -1,35 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c deleted file mode 100644 index c3d92c2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl1.c +++ /dev/null @@ -1,36 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c deleted file mode 100644 index ddb976c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl2.c +++ /dev/null @@ -1,49 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c deleted file mode 100644 index c37877b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_fl3.c +++ /dev/null @@ -1,42 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c deleted file mode 100644 index 52a92fe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ldl.c +++ /dev/null @@ -1,34 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value long double. - Limitations: none. - PR: none. - Originator: 20071113 */ -/* { dg-do run } */ - -#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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c deleted file mode 100644 index ea4a1e4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll.c +++ /dev/null @@ -1,41 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c deleted file mode 100644 index 593e8a3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ll1.c +++ /dev/null @@ -1,43 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c deleted file mode 100644 index a36cf3e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sc.c +++ /dev/null @@ -1,36 +0,0 @@ -/* 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((signed char)rint == sc); - } - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c deleted file mode 100644 index f0fd345..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_sl.c +++ /dev/null @@ -1,38 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c deleted file mode 100644 index 6fe5546..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_uc.c +++ /dev/null @@ -1,38 +0,0 @@ -/* 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((unsigned char)rint == uc); - } - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c deleted file mode 100644 index 12b266f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/return_ul.c +++ /dev/null @@ -1,38 +0,0 @@ -/* 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.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c deleted file mode 100644 index 71c2469..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large.c +++ /dev/null @@ -1,145 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c deleted file mode 100644 index d9c750e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_large2.c +++ /dev/null @@ -1,148 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c deleted file mode 100644 index 973ee02..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium.c +++ /dev/null @@ -1,124 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c deleted file mode 100644 index 84323d1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/stret_medium2.c +++ /dev/null @@ -1,125 +0,0 @@ -/* 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]; - - 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_type.size = 0; - cls_struct_type.alignment = 0; - cls_struct_type.type = FFI_TYPE_STRUCT; - cls_struct_type.elements = cls_struct_fields; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c deleted file mode 100644 index 35b70ea..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen.c +++ /dev/null @@ -1,44 +0,0 @@ -/* 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 ABI_ATTR 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, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c deleted file mode 100644 index 96282bc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen2.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(char *s, float a) -{ - return (size_t) ((int) strlen(s) + (int) a); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - float v2; - args[0] = &ffi_type_pointer; - args[1] = &ffi_type_float; - values[0] = (void*) &s; - values[1] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - v2 = -1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 6); - - s = "1234567890123456789012345"; - v2 = 1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 26); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c deleted file mode 100644 index beba86e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen3.c +++ /dev/null @@ -1,49 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(float a, char *s) -{ - return (size_t) ((int) strlen(s) + (int) a); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - float v2; - args[1] = &ffi_type_pointer; - args[0] = &ffi_type_float; - values[1] = (void*) &s; - values[0] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 2, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 1); - - s = "1234567"; - v2 = -1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 6); - - s = "1234567890123456789012345"; - v2 = 1.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 26); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c deleted file mode 100644 index d5d42b4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/strlen4.c +++ /dev/null @@ -1,55 +0,0 @@ -/* Area: ffi_call - Purpose: Check strlen function call with additional arguments. - Limitations: none. - PR: none. - Originator: From the original ffitest.c */ - -/* { dg-do run } */ - -#include "ffitest.h" - -static size_t ABI_ATTR my_f(float a, char *s, int i) -{ - return (size_t) ((int) strlen(s) + (int) a + i); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - ffi_arg rint; - char *s; - int v1; - float v2; - args[2] = &ffi_type_sint; - args[1] = &ffi_type_pointer; - args[0] = &ffi_type_float; - values[2] = (void*) &v1; - values[1] = (void*) &s; - values[0] = (void*) &v2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 3, - &ffi_type_sint, args) == FFI_OK); - - s = "a"; - v1 = 1; - v2 = 0.0; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 2); - - s = "1234567"; - v2 = -1.0; - v1 = -2; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 4); - - s = "1234567890123456789012345"; - v2 = 1.0; - v1 = 2; - ffi_call(&cif, FFI_FN(my_f), &rint, values); - CHECK(rint == 28); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c deleted file mode 100644 index c13e23f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct1.c +++ /dev/null @@ -1,67 +0,0 @@ -/* 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 ABI_ATTR 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]; - - 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)); - - 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; - - args[0] = &ts1_type; - values[0] = &ts1_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c deleted file mode 100644 index 17b1377..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +++ /dev/null @@ -1,57 +0,0 @@ -/* Area: ffi_call - Purpose: Check structures. - Limitations: none. - PR: none. - Originator: Sergei Trofimovich - - The test originally discovered in ruby's bindings - for ffi in https://bugs.gentoo.org/634190 */ - -/* { dg-do run } */ -#include "ffitest.h" - -struct s { - int s32; - float f32; - signed char s8; -}; - -struct s make_s(void) { - struct s r; - r.s32 = 0x1234; - r.f32 = 7.0; - r.s8 = 0x78; - return r; -} - -int main() { - ffi_cif cif; - struct s r; - ffi_type rtype; - ffi_type* s_fields[] = { - &ffi_type_sint, - &ffi_type_float, - &ffi_type_schar, - NULL, - }; - - rtype.size = 0; - rtype.alignment = 0, - rtype.type = FFI_TYPE_STRUCT, - rtype.elements = s_fields, - - r.s32 = 0xbad; - r.f32 = 999.999; - r.s8 = 0x51; - - // Here we emulate the following call: - //r = make_s(); - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 0, &rtype, NULL) == FFI_OK); - ffi_call(&cif, FFI_FN(make_s), &r, NULL); - - CHECK(r.s32 == 0x1234); - CHECK(r.f32 == 7.0); - CHECK(r.s8 == 0x78); - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c deleted file mode 100644 index 5077a5e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct2.c +++ /dev/null @@ -1,67 +0,0 @@ -/* 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 ABI_ATTR 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]; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_2 *ts2_result = - (test_structure_2 *) malloc (sizeof(test_structure_2)); - - 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; - - args[0] = &ts2_type; - values[0] = &ts2_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c deleted file mode 100644 index 7eba0ea..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct3.c +++ /dev/null @@ -1,60 +0,0 @@ -/* 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 ABI_ATTR 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]; - - test_structure_3 ts3_arg; - test_structure_3 *ts3_result = - (test_structure_3 *) malloc (sizeof(test_structure_3)); - - 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; - - args[0] = &ts3_type; - values[0] = &ts3_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c deleted file mode 100644 index 66a9551..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct4.c +++ /dev/null @@ -1,64 +0,0 @@ -/* 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 ABI_ATTR 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]; - - test_structure_4 ts4_arg; - - /* This is a hack to get a properly aligned result buffer */ - test_structure_4 *ts4_result = - (test_structure_4 *) malloc (sizeof(test_structure_4)); - - ts4_type.size = 0; - ts4_type.alignment = 0; - ts4_type.type = FFI_TYPE_STRUCT; - 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; - - args[0] = &ts4_type; - values[0] = &ts4_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c deleted file mode 100644 index 23e2a3f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct5.c +++ /dev/null @@ -1,66 +0,0 @@ -/* 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 ABI_ATTR 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]; - - 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)); - - 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; - - args[0] = &ts5_type; - args[1] = &ts5_type; - values[0] = &ts5_arg1; - values[1] = &ts5_arg2; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c deleted file mode 100644 index 173c66e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct6.c +++ /dev/null @@ -1,64 +0,0 @@ -/* 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 ABI_ATTR 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]; - - 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)); - - 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; - - args[0] = &ts6_type; - values[0] = &ts6_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c deleted file mode 100644 index badc7e0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct7.c +++ /dev/null @@ -1,74 +0,0 @@ -/* 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 ABI_ATTR 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]; - - 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)); - - 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; - - args[0] = &ts7_type; - values[0] = &ts7_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c deleted file mode 100644 index ef204ec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct8.c +++ /dev/null @@ -1,81 +0,0 @@ -/* 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 ABI_ATTR 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]; - - 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)); - - 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; - - args[0] = &ts8_type; - values[0] = &ts8_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c deleted file mode 100644 index 4a13b81..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/struct9.c +++ /dev/null @@ -1,68 +0,0 @@ -/* 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 ABI_ATTR 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]; - - 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)); - - 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; - - args[0] = &ts9_type; - values[0] = &ts9_arg; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, ABI_NUM, 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.25/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c deleted file mode 100644 index ca31056..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/testclosure.c +++ /dev/null @@ -1,70 +0,0 @@ -/* 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]; - - struct cls_struct_combined g_dbl = {4.0, 5.0, 1.0, 8.0}; - - cls_struct_type0.size = 0; - cls_struct_type0.alignment = 0; - cls_struct_type0.type = FFI_TYPE_STRUCT; - cls_struct_type0.elements = cls_struct_fields0; - - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c deleted file mode 100644 index f00d830..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/uninitialized.c +++ /dev/null @@ -1,61 +0,0 @@ -/* { 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]; - - memset(&cif, 1, sizeof(cif)); - 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.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc deleted file mode 100644 index e114565..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc +++ /dev/null @@ -1,117 +0,0 @@ -/* Area: ffi_closure, unwind info - Purpose: Check if the unwind information is passed correctly. - Limitations: none. - PR: none. - Originator: Jeff Sturm */ - -/* { dg-do run { xfail x86_64-apple-darwin* moxie*-*-* } } */ - -#include "ffitest.h" - -void ABI_ATTR -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.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc deleted file mode 100644 index 153d240..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +++ /dev/null @@ -1,54 +0,0 @@ -/* 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 { xfail moxie*-*-* } } */ - -#include "ffitest.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.25/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c deleted file mode 100644 index 7f96809..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_1.c +++ /dev/null @@ -1,196 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static int -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - unsigned char uc; - signed char sc; - unsigned short us; - signed short ss; - unsigned int ui; - signed int si; - unsigned long ul; - signed long sl; - float f; - double d; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - - uc = va_arg (ap, unsigned); - sc = va_arg (ap, signed); - - us = va_arg (ap, unsigned); - ss = va_arg (ap, signed); - - ui = va_arg (ap, unsigned int); - si = va_arg (ap, signed int); - - ul = va_arg (ap, unsigned long); - sl = va_arg (ap, signed long); - - f = va_arg (ap, double); /* C standard promotes float->double - when anonymous */ - d = va_arg (ap, double); - - printf ("%u %u %u %u %u %u %u %u %u uc=%u sc=%d %u %d %u %d %lu %ld %f %f\n", - s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b, - uc, sc, - us, ss, - ui, si, - ul, sl, - f, d); - va_end (ap); - return n + 1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[15]; - ffi_type* arg_types[15]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - ffi_arg res; - - unsigned char uc; - signed char sc; - unsigned short us; - signed short ss; - unsigned int ui; - signed int si; - unsigned long ul; - signed long sl; - double d1; - double f1; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = &ffi_type_uchar; - arg_types[5] = &ffi_type_schar; - arg_types[6] = &ffi_type_ushort; - arg_types[7] = &ffi_type_sshort; - arg_types[8] = &ffi_type_uint; - arg_types[9] = &ffi_type_sint; - arg_types[10] = &ffi_type_ulong; - arg_types[11] = &ffi_type_slong; - arg_types[12] = &ffi_type_double; - arg_types[13] = &ffi_type_double; - arg_types[14] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 14, &ffi_type_sint, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - uc = 9; - sc = 10; - us = 11; - ss = 12; - ui = 13; - si = 14; - ul = 15; - sl = 16; - f1 = 2.12; - d1 = 3.13; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = &uc; - args[5] = ≻ - args[6] = &us; - args[7] = &ss; - args[8] = &ui; - args[9] = &si; - args[10] = &ul; - args[11] = &sl; - args[12] = &f1; - args[13] = &d1; - args[14] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8 uc=9 sc=10 11 12 13 14 15 16 2.120000 3.130000" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c deleted file mode 100644 index e645206..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct1.c +++ /dev/null @@ -1,121 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static int -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - return n + 1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - ffi_arg res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &ffi_type_sint, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d\n", (int) res); - /* { dg-output "\nres: 42" } */ - - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c deleted file mode 100644 index 56f5b9c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct2.c +++ /dev/null @@ -1,123 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static struct small_tag -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - s1.a += s2.a; - s1.b += s2.b; - return s1; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - struct small_tag res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &s_type, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d %d\n", res.a, res.b); - /* { dg-output "\nres: 12 14" } */ - - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c deleted file mode 100644 index 9a27e7f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.call/va_struct3.c +++ /dev/null @@ -1,125 +0,0 @@ -/* Area: ffi_call - Purpose: Test passing struct in variable argument lists. - Limitations: none. - PR: none. - Originator: ARM Ltd. */ - -/* { dg-do run } */ -/* { dg-output "" { xfail avr32*-*-* } } */ - -#include "ffitest.h" -#include - -struct small_tag -{ - unsigned char a; - unsigned char b; -}; - -struct large_tag -{ - unsigned a; - unsigned b; - unsigned c; - unsigned d; - unsigned e; -}; - -static struct large_tag -test_fn (int n, ...) -{ - va_list ap; - struct small_tag s1; - struct small_tag s2; - struct large_tag l; - - va_start (ap, n); - s1 = va_arg (ap, struct small_tag); - l = va_arg (ap, struct large_tag); - s2 = va_arg (ap, struct small_tag); - printf ("%u %u %u %u %u %u %u %u %u\n", s1.a, s1.b, l.a, l.b, l.c, l.d, l.e, - s2.a, s2.b); - va_end (ap); - l.a += s1.a; - l.b += s1.b; - l.c += s2.a; - l.d += s2.b; - return l; -} - -int -main (void) -{ - ffi_cif cif; - void* args[5]; - ffi_type* arg_types[5]; - - ffi_type s_type; - ffi_type *s_type_elements[3]; - - ffi_type l_type; - ffi_type *l_type_elements[6]; - - struct small_tag s1; - struct small_tag s2; - struct large_tag l1; - - int n; - struct large_tag res; - - s_type.size = 0; - s_type.alignment = 0; - s_type.type = FFI_TYPE_STRUCT; - s_type.elements = s_type_elements; - - s_type_elements[0] = &ffi_type_uchar; - s_type_elements[1] = &ffi_type_uchar; - s_type_elements[2] = NULL; - - l_type.size = 0; - l_type.alignment = 0; - l_type.type = FFI_TYPE_STRUCT; - l_type.elements = l_type_elements; - - l_type_elements[0] = &ffi_type_uint; - l_type_elements[1] = &ffi_type_uint; - l_type_elements[2] = &ffi_type_uint; - l_type_elements[3] = &ffi_type_uint; - l_type_elements[4] = &ffi_type_uint; - l_type_elements[5] = NULL; - - arg_types[0] = &ffi_type_sint; - arg_types[1] = &s_type; - arg_types[2] = &l_type; - arg_types[3] = &s_type; - arg_types[4] = NULL; - - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 4, &l_type, arg_types) == FFI_OK); - - s1.a = 5; - s1.b = 6; - - l1.a = 10; - l1.b = 11; - l1.c = 12; - l1.d = 13; - l1.e = 14; - - s2.a = 7; - s2.b = 8; - - n = 41; - - args[0] = &n; - args[1] = &s1; - args[2] = &l1; - args[3] = &s2; - args[4] = NULL; - - ffi_call(&cif, FFI_FN(test_fn), &res, args); - /* { dg-output "5 6 10 11 12 13 14 7 8" } */ - printf("res: %d %d %d %d %d\n", res.a, res.b, res.c, res.d, res.e); - /* { dg-output "\nres: 15 17 19 21 14" } */ - - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc deleted file mode 100644 index 4a812ed..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex.inc +++ /dev/null @@ -1,91 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -typedef struct cls_struct_align { - unsigned char a; - _Complex T_C_TYPE 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 %f,%fi %d %d %f,%fi %d: %d %f,%fi %d\n", - a1.a, T_CONV creal (a1.b), T_CONV cimag (a1.b), a1.c, - a2.a, T_CONV creal (a2.b), T_CONV cimag (a2.b), a2.c, - result.a, T_CONV creal (result.b), T_CONV cimag (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_c[5]; - ffi_type* cls_struct_fields[4]; - ffi_type cls_struct_type; - ffi_type* c_arg_types[5]; - - struct cls_struct_align g_c = { 12, 4951 + 7 * I, 127 }; - struct cls_struct_align f_c = { 1, 9320 + 1 * I, 13 }; - struct cls_struct_align res_c; - - 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_fields[0] = &ffi_type_uchar; - cls_struct_fields[1] = &T_FFI_TYPE; - cls_struct_fields[2] = &ffi_type_uchar; - cls_struct_fields[3] = NULL; - - c_arg_types[0] = &cls_struct_type; - c_arg_types[1] = &cls_struct_type; - c_arg_types[2] = NULL; - - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 2, &cls_struct_type, - c_arg_types) == FFI_OK); - - args_c[0] = &g_c; - args_c[1] = &f_c; - args_c[2] = NULL; - - ffi_call(&cif, FFI_FN(cls_struct_align_fn), &res_c, args_c); - /* { dg-output "12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */ - printf("res: %d %f,%fi %d\n", - res_c.a, T_CONV creal (res_c.b), T_CONV cimag (res_c.b), res_c.c); - /* { dg-output "\nres: 13 14271,8i 140" } */ - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_struct_align_gn, NULL, code) == FFI_OK); - - res_c = ((cls_struct_align(*)(cls_struct_align, cls_struct_align))(code))(g_c, f_c); - /* { dg-output "\n12 4951,7i 127 1 9320,1i 13: 13 14271,8i 140" } */ - printf("res: %d %f,%fi %d\n", - res_c.a, T_CONV creal (res_c.b), T_CONV cimag (res_c.b), res_c.c); - /* { dg-output "\nres: 13 14271,8i 140" } */ - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c deleted file mode 100644 index 0dff23a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_align_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c deleted file mode 100644 index 0affbd0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "cls_align_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c deleted file mode 100644 index 7889ba8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_align_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check structure alignment of complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_align_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc deleted file mode 100644 index f937404..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex.inc +++ /dev/null @@ -1,42 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -static void cls_ret_complex_fn(ffi_cif* cif __UNUSED__, void* resp, void** args, - void* userdata __UNUSED__) - { - _Complex T_C_TYPE *pa; - _Complex T_C_TYPE *pr; - pa = (_Complex T_C_TYPE *)args[0]; - pr = (_Complex T_C_TYPE *)resp; - *pr = *pa; - - printf("%.6f,%.6fi: %.6f,%.6fi\n", - T_CONV creal (*pa), T_CONV cimag (*pa), - T_CONV creal (*pr), T_CONV cimag (*pr)); - } -typedef _Complex T_C_TYPE (*cls_ret_complex)(_Complex T_C_TYPE); - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - ffi_type * cl_arg_types[2]; - _Complex T_C_TYPE res; - - cl_arg_types[0] = &T_FFI_TYPE; - cl_arg_types[1] = NULL; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &T_FFI_TYPE, cl_arg_types) == FFI_OK); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_ret_complex_fn, NULL, code) == FFI_OK); - - res = (*((cls_ret_complex)code))(0.125 + 128.0 * I); - printf("res: %.6f,%.6fi\n", T_CONV creal (res), T_CONV cimag (res)); - CHECK (res == (0.125 + 128.0 * I)); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c deleted file mode 100644 index 05e3534..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: closure_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c deleted file mode 100644 index 5df7849..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: closure_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "cls_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c deleted file mode 100644 index 2b1c320..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: closure_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc deleted file mode 100644 index df8708d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct.inc +++ /dev/null @@ -1,71 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -typedef struct Cs { - _Complex T_C_TYPE x; - _Complex T_C_TYPE y; -} Cs; - -Cs gc; - -void -closure_test_fn(Cs p) -{ - printf("%.1f,%.1fi %.1f,%.1fi\n", - T_CONV creal (p.x), T_CONV cimag (p.x), - T_CONV creal (p.y), T_CONV cimag (p.y)); - gc = p; -} - -void -closure_test_gn(ffi_cif* cif __UNUSED__, void* resp __UNUSED__, - void** args, void* userdata __UNUSED__) -{ - closure_test_fn(*(Cs*)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]; - - Cs arg = { 1.0 + 11.0 * I, 2.0 + 22.0 * I}; - - ts1_type.size = 0; - ts1_type.alignment = 0; - ts1_type.type = FFI_TYPE_STRUCT; - ts1_type.elements = ts1_type_elements; - - ts1_type_elements[0] = &T_FFI_TYPE; - ts1_type_elements[1] = &T_FFI_TYPE; - ts1_type_elements[2] = NULL; - - cl_arg_types[0] = &ts1_type; - - /* 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); - - gc.x = 0.0 + 0.0 * I; - gc.y = 0.0 + 0.0 * I; - ((void*(*)(Cs))(code))(arg); - /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ - CHECK (gc.x == arg.x && gc.y == arg.y); - - gc.x = 0.0 + 0.0 * I; - gc.y = 0.0 + 0.0 * I; - closure_test_fn(arg); - /* { dg-output "1.0,11.0i 2.0,22.0i\n" } */ - CHECK (gc.x == arg.x && gc.y == arg.y); - - return 0; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c deleted file mode 100644 index ec71346..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check complex arguments in structs. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_complex_struct.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c deleted file mode 100644 index 96fdf75..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check complex arguments in structs. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "cls_complex_struct.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c deleted file mode 100644 index 005b467..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_struct_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Check complex arguments in structs. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_complex_struct.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc deleted file mode 100644 index 8a3e15f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va.inc +++ /dev/null @@ -1,80 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include -#include -#include -#include - -static _Complex T_C_TYPE gComplexValue1 = 1 + 2 * I; -static _Complex T_C_TYPE gComplexValue2 = 3 + 4 * I; - -static int cls_variadic(const char *format, ...) -{ - va_list ap; - _Complex T_C_TYPE p1, p2; - - va_start (ap, format); - p1 = va_arg (ap, _Complex T_C_TYPE); - p2 = va_arg (ap, _Complex T_C_TYPE); - va_end (ap); - - return printf(format, T_CONV creal (p1), T_CONV cimag (p1), - T_CONV creal (p2), T_CONV cimag (p2)); -} - -static void -cls_complex_va_fn(ffi_cif* cif __UNUSED__, void* resp, - void** args, void* userdata __UNUSED__) -{ - char* format = *(char**)args[0]; - gComplexValue1 = *(_Complex T_C_TYPE*)args[1]; - gComplexValue2 = *(_Complex T_C_TYPE*)args[2]; - - *(ffi_arg*)resp = - printf(format, - T_CONV creal (gComplexValue1), T_CONV cimag (gComplexValue1), - T_CONV creal (gComplexValue2), T_CONV cimag (gComplexValue2)); -} - -int main (void) -{ - ffi_cif cif; - void *code; - ffi_closure *pcl = ffi_closure_alloc(sizeof(ffi_closure), &code); - void* args[4]; - ffi_type* arg_types[4]; - char *format = "%.1f,%.1fi %.1f,%.1fi\n"; - - _Complex T_C_TYPE complexArg1 = 1.0 + 22.0 *I; - _Complex T_C_TYPE complexArg2 = 333.0 + 4444.0 *I; - ffi_arg res = 0; - - arg_types[0] = &ffi_type_pointer; - arg_types[1] = &T_FFI_TYPE; - arg_types[2] = &T_FFI_TYPE; - arg_types[3] = NULL; - - /* This printf call is variadic */ - CHECK(ffi_prep_cif_var(&cif, FFI_DEFAULT_ABI, 1, 3, &ffi_type_sint, - arg_types) == FFI_OK); - - args[0] = &format; - args[1] = &complexArg1; - args[2] = &complexArg2; - args[3] = NULL; - - ffi_call(&cif, FFI_FN(cls_variadic), &res, args); - printf("res: %d\n", (int) res); - CHECK (res == 24); - - CHECK(ffi_prep_closure_loc(pcl, &cif, cls_complex_va_fn, NULL, code) - == FFI_OK); - - res = ((int(*)(char *, ...))(code))(format, complexArg1, complexArg2); - CHECK (gComplexValue1 == complexArg1); - CHECK (gComplexValue2 == complexArg2); - printf("res: %d\n", (int) res); - CHECK (res == 24); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c deleted file mode 100644 index 879ccf3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test complex' passed in variable argument lists. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "cls_complex_va.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c deleted file mode 100644 index 2b17826..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_float.c +++ /dev/null @@ -1,16 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test complex' passed in variable argument lists. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -/* Alpha splits _Complex into two arguments. It's illegal to pass - float through varargs, so _Complex float goes badly. In sort of - gets passed as _Complex double, but the compiler doesn't agree - with itself on this issue. */ -/* { dg-do run { xfail alpha*-*-* } } */ - -#include "complex_defs_float.inc" -#include "cls_complex_va.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c deleted file mode 100644 index 6eca965..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/cls_complex_va_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call, closure_call - Purpose: Test complex' passed in variable argument lists. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "cls_complex_va.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp deleted file mode 100644 index 4631db2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.exp +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014 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 - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] - -if { [libffi_feature_test "#ifdef FFI_TARGET_HAS_COMPLEX_TYPE"] } { - run-many-tests $tlist "" -} else { - foreach test $tlist { - unsupported "$test" - } -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc deleted file mode 100644 index 515ae3e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex.inc +++ /dev/null @@ -1,51 +0,0 @@ -/* -*-c-*-*/ -#include "ffitest.h" -#include - -static _Complex T_C_TYPE f_complex(_Complex T_C_TYPE c, int x, int *py) -{ - c = -(2 * creal (c)) + (cimag (c) + 1)* I; - *py += x; - - return c; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - - _Complex T_C_TYPE tc_arg; - _Complex T_C_TYPE tc_result; - int tc_int_arg_x; - int tc_y; - int *tc_ptr_arg_y = &tc_y; - - args[0] = &T_FFI_TYPE; - args[1] = &ffi_type_sint; - args[2] = &ffi_type_pointer; - values[0] = &tc_arg; - values[1] = &tc_int_arg_x; - values[2] = &tc_ptr_arg_y; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, - &T_FFI_TYPE, args) == FFI_OK); - - tc_arg = 1 + 7 * I; - tc_int_arg_x = 1234; - tc_y = 9876; - ffi_call(&cif, FFI_FN(f_complex), &tc_result, values); - - printf ("%f,%fi %f,%fi, x %d 1234, y %d 11110\n", - T_CONV creal (tc_result), T_CONV cimag (tc_result), - T_CONV creal (2.0), T_CONV creal (8.0), tc_int_arg_x, tc_y); - - CHECK (creal (tc_result) == -2); - CHECK (cimag (tc_result) == 8); - CHECK (tc_int_arg_x == 1234); - CHECK (*tc_ptr_arg_y == 11110); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc deleted file mode 100644 index 3583e16..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_double.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* -*-c-*- */ -/* Complex base type. */ -#define T_FFI_TYPE ffi_type_complex_double -/* C type corresponding to the base type. */ -#define T_C_TYPE double -/* C cast for a value of type T_C_TYPE that is passed to printf. */ -#define T_CONV diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc deleted file mode 100644 index bbd9375..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_float.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* -*-c-*- */ -/* Complex base type. */ -#define T_FFI_TYPE ffi_type_complex_float -/* C type corresponding to the base type. */ -#define T_C_TYPE float -/* C cast for a value of type T_C_TYPE that is passed to printf. */ -#define T_CONV (double) diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc deleted file mode 100644 index 14b9f24..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_defs_longdouble.inc +++ /dev/null @@ -1,7 +0,0 @@ -/* -*-c-*- */ -/* Complex base type. */ -#define T_FFI_TYPE ffi_type_complex_longdouble -/* C type corresponding to the base type. */ -#define T_C_TYPE long double -/* C cast for a value of type T_C_TYPE that is passed to printf. */ -#define T_CONV diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c deleted file mode 100644 index 8a3297b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c deleted file mode 100644 index 5044ebb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c deleted file mode 100644 index bac3190..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_int.c +++ /dev/null @@ -1,86 +0,0 @@ -/* Area: ffi_call - Purpose: Check non-standard complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "ffitest.h" -#include "ffi.h" -#include - -_Complex int f_complex(_Complex int c, int x, int *py) -{ - __real__ c = -2 * __real__ c; - __imag__ c = __imag__ c + 1; - *py += x; - return c; -} - -/* - * This macro can be used to define new complex type descriptors - * in a platform independent way. - * - * name: Name of the new descriptor is ffi_type_complex_. - * type: The C base type of the complex type. - */ -#define FFI_COMPLEX_TYPEDEF(name, type, ffitype) \ - static ffi_type *ffi_elements_complex_##name [2] = { \ - (ffi_type *)(&ffitype), NULL \ - }; \ - struct struct_align_complex_##name { \ - char c; \ - _Complex type x; \ - }; \ - ffi_type ffi_type_complex_##name = { \ - sizeof(_Complex type), \ - offsetof(struct struct_align_complex_##name, x), \ - FFI_TYPE_COMPLEX, \ - (ffi_type **)ffi_elements_complex_##name \ - } - -/* Define new complex type descriptors using the macro: */ -/* ffi_type_complex_sint */ -FFI_COMPLEX_TYPEDEF(sint, int, ffi_type_sint); -/* ffi_type_complex_uchar */ -FFI_COMPLEX_TYPEDEF(uchar, unsigned char, ffi_type_uint8); - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - - _Complex int tc_arg; - _Complex int tc_result; - int tc_int_arg_x; - int tc_y; - int *tc_ptr_arg_y = &tc_y; - - args[0] = &ffi_type_complex_sint; - args[1] = &ffi_type_sint; - args[2] = &ffi_type_pointer; - values[0] = &tc_arg; - values[1] = &tc_int_arg_x; - values[2] = &tc_ptr_arg_y; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 3, &ffi_type_complex_sint, args) - == FFI_OK); - - tc_arg = 1 + 7 * I; - tc_int_arg_x = 1234; - tc_y = 9876; - ffi_call(&cif, FFI_FN(f_complex), &tc_result, values); - - printf ("%d,%di %d,%di, x %d 1234, y %d 11110\n", - (int)tc_result, (int)(tc_result * -I), 2, 8, tc_int_arg_x, tc_y); - /* dg-output "-2,8i 2,8i, x 1234 1234, y 11110 11110" */ - CHECK (creal (tc_result) == -2); - CHECK (cimag (tc_result) == 8); - CHECK (tc_int_arg_x == 1234); - CHECK (*tc_ptr_arg_y == 11110); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c deleted file mode 100644 index 7e78366..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check complex types. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h deleted file mode 100644 index d27d362..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/ffitest.h +++ /dev/null @@ -1 +0,0 @@ -#include "../libffi.call/ffitest.h" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc deleted file mode 100644 index e37a774..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex.inc +++ /dev/null @@ -1,78 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" - -#include -#include - -static _Complex T_C_TYPE many(_Complex T_C_TYPE c1, - _Complex T_C_TYPE c2, - _Complex T_C_TYPE c3, - _Complex T_C_TYPE c4, - _Complex T_C_TYPE c5, - _Complex T_C_TYPE c6, - _Complex T_C_TYPE c7, - _Complex T_C_TYPE c8, - _Complex T_C_TYPE c9, - _Complex T_C_TYPE c10, - _Complex T_C_TYPE c11, - _Complex T_C_TYPE c12, - _Complex T_C_TYPE c13) -{ - printf("0 :%f,%fi\n" - "1 :%f,%fi\n" - "2 :%f,%fi\n" - "3 :%f,%fi\n" - "4 :%f,%fi\n" - "5 :%f,%fi\n" - "6 :%f,%fi\n" - "7 :%f,%fi\n" - "8 :%f,%fi\n" - "9 :%f,%fi\n" - "10:%f,%fi\n" - "11:%f,%fi\n" - "12:%f,%fi\n", - T_CONV creal (c1), T_CONV cimag (c1), - T_CONV creal (c2), T_CONV cimag (c2), - T_CONV creal (c3), T_CONV cimag (c3), - T_CONV creal (c4), T_CONV cimag (c4), - T_CONV creal (c5), T_CONV cimag (c5), - T_CONV creal (c6), T_CONV cimag (c6), - T_CONV creal (c7), T_CONV cimag (c7), - T_CONV creal (c8), T_CONV cimag (c8), - T_CONV creal (c9), T_CONV cimag (c9), - T_CONV creal (c10), T_CONV cimag (c10), - T_CONV creal (c11), T_CONV cimag (c11), - T_CONV creal (c12), T_CONV cimag (c12), - T_CONV creal (c13), T_CONV cimag (c13)); - - return (c1+c2-c3-c4+c5+c6+c7-c8-c9-c10-c11+c12+c13); -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[13]; - void *values[13]; - _Complex T_C_TYPE ca[13]; - _Complex T_C_TYPE c, cc; - int i; - - for (i = 0; i < 13; i++) - { - args[i] = &T_FFI_TYPE; - values[i] = &ca[i]; - ca[i] = i + (-20 - i) * I; - } - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 13, &T_FFI_TYPE, args) == FFI_OK); - - ffi_call(&cif, FFI_FN(many), &c, values); - - cc = many(ca[0], ca[1], ca[2], ca[3], ca[4], ca[5], ca[6], ca[7], ca[8], - ca[9], ca[10], ca[11], ca[12]); - CHECK(creal (cc) == creal (c)); - CHECK(cimag (cc) == cimag (c)); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c deleted file mode 100644 index 3fd53c3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex, with many arguments - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "many_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c deleted file mode 100644 index c43d21c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex, with many arguments - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "many_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c deleted file mode 100644 index dbab723..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/many_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex, with many arguments - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "many_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc deleted file mode 100644 index 8bf0c1f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex.inc +++ /dev/null @@ -1,37 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c) -{ - printf ("%f,%fi\n", T_CONV creal (c), T_CONV cimag (c)); - return 2 * c; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - _Complex T_C_TYPE c, rc, rc2; - T_C_TYPE cr, ci; - - args[0] = &T_FFI_TYPE; - values[0] = &c; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 1, - &T_FFI_TYPE, args) == FFI_OK); - - for (cr = -127.0; cr < 127; cr++) - { - ci = 1000.0 - cr; - c = cr + ci * I; - ffi_call(&cif, FFI_FN(return_c), &rc, values); - rc2 = return_c(c); - printf ("%f,%fi vs %f,%fi\n", - T_CONV creal (rc), T_CONV cimag (rc), - T_CONV creal (rc2), T_CONV cimag (rc2)); - CHECK(rc == 2 * c); - } - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc deleted file mode 100644 index 7cecc0f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1.inc +++ /dev/null @@ -1,41 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -static _Complex T_C_TYPE return_c(_Complex T_C_TYPE c1, float fl2, unsigned int in3, _Complex T_C_TYPE c4) -{ - return c1 + fl2 + in3 + c4; -} -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - _Complex T_C_TYPE c1, c4, rc, rc2; - float fl2; - unsigned int in3; - args[0] = &T_FFI_TYPE; - args[1] = &ffi_type_float; - args[2] = &ffi_type_uint; - args[3] = &T_FFI_TYPE; - values[0] = &c1; - values[1] = &fl2; - values[2] = &in3; - values[3] = &c4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &T_FFI_TYPE, args) == FFI_OK); - c1 = 127.0 + 255.0 * I; - fl2 = 128.0; - in3 = 255; - c4 = 512.7 + 1024.1 * I; - - ffi_call(&cif, FFI_FN(return_c), &rc, values); - rc2 = return_c(c1, fl2, in3, c4); - printf ("%f,%fi vs %f,%fi\n", - T_CONV creal (rc), T_CONV cimag (rc), - T_CONV creal (rc2), T_CONV cimag (rc2)); - CHECK(rc == rc2); - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c deleted file mode 100644 index 727410d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "return_complex1.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c deleted file mode 100644 index a2aeada..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "return_complex1.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c deleted file mode 100644 index 103504b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex1_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "return_complex1.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc deleted file mode 100644 index 265170b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2.inc +++ /dev/null @@ -1,44 +0,0 @@ -/* -*-c-*- */ -#include "ffitest.h" -#include - -_Complex T_C_TYPE -return_c(_Complex T_C_TYPE c1, _Complex T_C_TYPE c2, - unsigned int in3, _Complex T_C_TYPE c4) -{ - volatile _Complex T_C_TYPE r = c1 + c2 + in3 + c4; - return r; -} - -int main (void) -{ - ffi_cif cif; - ffi_type *args[MAX_ARGS]; - void *values[MAX_ARGS]; - _Complex T_C_TYPE c1, c2, c4, rc, rc2; - unsigned int in3; - args[0] = &T_FFI_TYPE; - args[1] = &T_FFI_TYPE; - args[2] = &ffi_type_uint; - args[3] = &T_FFI_TYPE; - values[0] = &c1; - values[1] = &c2; - values[2] = &in3; - values[3] = &c4; - - /* Initialize the cif */ - CHECK(ffi_prep_cif(&cif, FFI_DEFAULT_ABI, 4, - &T_FFI_TYPE, args) == FFI_OK); - c1 = 127.0 + 255.0 * I; - c2 = 128.0 + 256.0; - in3 = 255; - c4 = 512.7 + 1024.1 * I; - - ffi_call(&cif, FFI_FN(return_c), &rc, values); - rc2 = return_c(c1, c2, in3, c4); - printf ("%f,%fi vs %f,%fi\n", - T_CONV creal (rc), T_CONV cimag (rc), - T_CONV creal (rc2), T_CONV cimag (rc2)); - CHECK(rc == rc2); - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c deleted file mode 100644 index ab9efac..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "return_complex2.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c deleted file mode 100644 index d7f22c2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "return_complex2.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c deleted file mode 100644 index 3edea62..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex2_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "return_complex2.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c deleted file mode 100644 index e2497cc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_double.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_double.inc" -#include "return_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c deleted file mode 100644 index a35528f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_float.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_float.inc" -#include "return_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c deleted file mode 100644 index 142d7be..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.complex/return_complex_longdouble.c +++ /dev/null @@ -1,10 +0,0 @@ -/* Area: ffi_call - Purpose: Check return value complex. - Limitations: none. - PR: none. - Originator: . */ - -/* { dg-do run } */ - -#include "complex_defs_longdouble.inc" -#include "return_complex.inc" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c deleted file mode 100644 index b00c404..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/aa-direct.c +++ /dev/null @@ -1,34 +0,0 @@ -/* { dg-do run } */ - -#include "static-chain.h" - -#if defined(__GNUC__) && !defined(__clang__) && defined(STATIC_CHAIN_REG) - -#include "ffitest.h" - -/* Blatent assumption here that the prologue doesn't clobber the - static chain for trivial functions. If this is not true, don't - define STATIC_CHAIN_REG, and we'll test what we can via other tests. */ -void *doit(void) -{ - register void *chain __asm__(STATIC_CHAIN_REG); - return chain; -} - -int main() -{ - ffi_cif cif; - void *result; - - CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK); - - ffi_call_go(&cif, FFI_FN(doit), &result, NULL, &result); - - CHECK(result == &result); - - return 0; -} - -#else /* UNSUPPORTED */ -int main() { return 0; } -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c deleted file mode 100644 index 7b34afc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/closure1.c +++ /dev/null @@ -1,28 +0,0 @@ -/* { dg-do run } */ - -#include "ffitest.h" - -void doit(ffi_cif *cif, void *rvalue, void **avalue, void *closure) -{ - (void)cif; - (void)avalue; - *(void **)rvalue = closure; -} - -typedef void * (*FN)(void); - -int main() -{ - ffi_cif cif; - ffi_go_closure cl; - void *result; - - CHECK(ffi_prep_cif(&cif, ABI_NUM, 0, &ffi_type_pointer, NULL) == FFI_OK); - CHECK(ffi_prep_go_closure(&cl, &cif, doit) == FFI_OK); - - ffi_call_go(&cif, FFI_FN(*(FN *)&cl), &result, NULL, &cl); - - CHECK(result == &cl); - - exit(0); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h deleted file mode 100644 index d27d362..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/ffitest.h +++ /dev/null @@ -1 +0,0 @@ -#include "../libffi.call/ffitest.h" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/go.exp b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/go.exp deleted file mode 100644 index 100c5e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/go.exp +++ /dev/null @@ -1,36 +0,0 @@ -# Copyright (C) 2003, 2006, 2009, 2010, 2014 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 - -set tlist [lsort [glob -nocomplain -- $srcdir/$subdir/*.{c,cc}]] - -if { [libffi_feature_test "#ifdef FFI_GO_CLOSURES"] } { - run-many-tests $tlist "" -} else { - foreach test $tlist { - unsupported "$test" - } -} - -dg-finish - -# Local Variables: -# tcl-indent-level:4 -# End: diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h deleted file mode 100644 index 3675b40..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/libffi/testsuite/libffi.go/static-chain.h +++ /dev/null @@ -1,19 +0,0 @@ -#ifdef __aarch64__ -# define STATIC_CHAIN_REG "x18" -#elif defined(__alpha__) -# define STATIC_CHAIN_REG "$1" -#elif defined(__arm__) -# define STATIC_CHAIN_REG "ip" -#elif defined(__sparc__) -# if defined(__arch64__) || defined(__sparcv9) -# define STATIC_CHAIN_REG "g5" -# else -# define STATIC_CHAIN_REG "g2" -# endif -#elif defined(__x86_64__) -# define STATIC_CHAIN_REG "r10" -#elif defined(__i386__) -# ifndef ABI_NUM -# define STATIC_CHAIN_REG "ecx" /* FFI_DEFAULT_ABI only */ -# endif -#endif diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi.h deleted file mode 100644 index b6fe477..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi.h +++ /dev/null @@ -1,57 +0,0 @@ -/* - * 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.25/ext/ffi_c/rbffi_endian.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi_endian.h deleted file mode 100644 index ebb8420..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/rbffi_endian.h +++ /dev/null @@ -1,59 +0,0 @@ -#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.25/ext/ffi_c/win32/stdbool.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/win32/stdbool.h deleted file mode 100644 index 9130a8b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/win32/stdbool.h +++ /dev/null @@ -1,8 +0,0 @@ -#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.25/ext/ffi_c/win32/stdint.h b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/win32/stdint.h deleted file mode 100644 index 6ce7457..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ext/ffi_c/win32/stdint.h +++ /dev/null @@ -1,201 +0,0 @@ -/* 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.25/ffi.gemspec b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ffi.gemspec deleted file mode 100644 index cefb297..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/ffi.gemspec +++ /dev/null @@ -1,36 +0,0 @@ -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 = `git ls-files -z`.split("\x0").reject do |f| - f =~ /^(bench|gen|libtest|nbproject|spec)/ - end - - # Add libffi git files - lfs = `git --git-dir ext/ffi_c/libffi/.git ls-files -z`.split("\x0") - # Add autoconf generated files of libffi - lfs += %w[ configure config.guess config.sub install-sh ltmain.sh missing fficonfig.h.in ] - # Add automake generated files of libffi - lfs += `git --git-dir ext/ffi_c/libffi/.git ls-files -z *.am */*.am`.gsub(".am\0", ".in\0").split("\x0") - s.files += lfs.map do |f| - File.join("ext/ffi_c/libffi", f) - end - - 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.9' - s.add_development_dependency 'rake', '~> 10.1' - s.add_development_dependency 'rake-compiler', '~> 1.0' - s.add_development_dependency 'rake-compiler-dock', '~> 0.6.2' - 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.25/lib/ffi.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi.rb deleted file mode 100644 index 361e53d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi.rb +++ /dev/null @@ -1,20 +0,0 @@ -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.25/lib/ffi/autopointer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/autopointer.rb deleted file mode 100644 index 889a3e3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/autopointer.rb +++ /dev/null @@ -1,203 +0,0 @@ -# -# 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.25/lib/ffi/buffer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/buffer.rb deleted file mode 100644 index 449e45b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/buffer.rb +++ /dev/null @@ -1,4 +0,0 @@ -# -# 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.25/lib/ffi/callback.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/callback.rb deleted file mode 100644 index 32d52f7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/callback.rb +++ /dev/null @@ -1,4 +0,0 @@ -# -# 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.25/lib/ffi/enum.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/enum.rb deleted file mode 100644 index 8fcb498..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/enum.rb +++ /dev/null @@ -1,296 +0,0 @@ -# -# 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 - - # Represents a C enum whose values are power of 2 - # - # @example - # enum { - # red = (1<<0), - # green = (1<<1), - # blue = (1<<2) - # } - # - # Contrary to classical enums, bitmask values are usually combined - # when used. - class Bitmask < Enum - - # @overload initialize(info, tag=nil) - # @param [nil, Enumerable] info symbols and bit rank for new Bitmask - # @param [nil, Symbol] tag name of new Bitmask - # @overload initialize(native_type, info, tag=nil) - # @param [FFI::Type] native_type Native type for new Bitmask - # @param [nil, Enumerable] info symbols and bit rank for new Bitmask - # @param [nil, Symbol] tag name of new Bitmask - 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 bitmask key" if @kv_map.has_key?(i) - @kv_map[i] = 1 << value - last_cst = i - value += 1 - when Integer - raise ArgumentError, "bitmask index should be positive" if i<0 - @kv_map[last_cst] = 1 << i - value = i+1 - end - end - end - @vk_map = @kv_map.invert - end - - # Get a symbol list or a value from the bitmask - # @overload [](*query) - # Get bitmask value from symbol list - # @param [Symbol] query - # @return [Integer] - # @overload [](query) - # Get bitmaks value from symbol array - # @param [Array] query - # @return [Integer] - # @overload [](*query) - # Get a list of bitmask symbols corresponding to - # the or reduction of a list of integer - # @param [Integer] query - # @return [Array] - # @overload [](query) - # Get a list of bitmask symbols corresponding to - # the or reduction of a list of integer - # @param [Array] query - # @return [Array] - def [](*query) - flat_query = query.flatten - raise ArgumentError, "query should be homogeneous, #{query.inspect}" unless flat_query.all? { |o| o.is_a?(Symbol) } || flat_query.all? { |o| o.is_a?(Integer) || o.respond_to?(:to_int) } - case flat_query[0] - when Symbol - flat_query.inject(0) do |val, o| - v = @kv_map[o] - if v then val |= v else val end - end - when Integer, ->(o) { o.respond_to?(:to_int) } - val = flat_query.inject(0) { |mask, o| mask |= o.to_int } - @kv_map.select { |_, v| v & val != 0 }.keys - end - end - - # Get the native value of a bitmask - # @overload to_native(query, ctx) - # @param [Symbol, Integer, #to_int] query - # @param ctx unused - # @return [Integer] value of a bitmask - # @overload to_native(query, ctx) - # @param [Array] query - # @param ctx unused - # @return [Integer] value of a bitmask - def to_native(query, ctx) - return 0 if query.nil? - flat_query = [query].flatten - flat_query.inject(0) do |val, o| - case o - when Symbol - v = @kv_map[o] - raise ArgumentError, "invalid bitmask value, #{o.inspect}" unless v - val |= v - when Integer - val |= o - when ->(obj) { obj.respond_to?(:to_int) } - val |= o.to_int - else - raise ArgumentError, "invalid bitmask value, #{o.inspect}" - end - end - end - - # @param [Integer] val - # @param ctx unused - # @return [Array] list of symbol names corresponding to val, plus an optional remainder if some bits don't match any constant - def from_native(val, ctx) - list = @kv_map.select { |_, v| v & val != 0 }.keys - # If there are unmatch flags, - # return them in an integer, - # else information can be lost. - # Similar to Enum behavior. - remainder = val ^ list.inject(0) do |tmp, o| - v = @kv_map[o] - if v then tmp |= v else tmp end - end - list.push remainder unless remainder == 0 - return list - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/errno.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/errno.rb deleted file mode 100644 index de82d89..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/errno.rb +++ /dev/null @@ -1,43 +0,0 @@ -# -# 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.25/lib/ffi/ffi.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/ffi.rb deleted file mode 100644 index 11d451f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/ffi.rb +++ /dev/null @@ -1,44 +0,0 @@ -# -# 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.25/lib/ffi/io.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/io.rb deleted file mode 100644 index 7fa1cf7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/io.rb +++ /dev/null @@ -1,62 +0,0 @@ -# -# 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.25/lib/ffi/library.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/library.rb deleted file mode 100644 index f14bcad..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/library.rb +++ /dev/null @@ -1,588 +0,0 @@ -# -# 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 = 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(&:to_s).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 - unless libname.start_with?("/") || FFI::Platform.windows? - 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 = s = type.new(address) # Assigning twice to suppress unused variable warning - 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 - - private - # Generic enum builder - # @param [Class] klass can be one of FFI::Enum or FFI::Bitmask - # @param args (see #enum or #bitmask) - def generic_enum(klass, *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 ? klass.new(native_type, values, name) : klass.new(values, name)) - - # If called with a name, add a typedef alias - typedef(e, name) if name - e - end - - public - # @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) - generic_enum(FFI::Enum, *args) - end - - # @overload bitmask(name, values) - # Create a named bitmask - # @example - # bitmask :foo, [:red, :green, :blue] # bits 0,1,2 are used - # bitmask :foo, [:red, :green, 5, :blue] # bits 0,5,6 are used - # @param [Symbol] name for new bitmask - # @param [Array] values for new bitmask - # @overload bitmask(*args) - # Create an unamed bitmask - # @example - # bm = bitmask :red, :green, :blue # bits 0,1,2 are used - # bm = bitmask :red, :green, 5, blue # bits 0,5,6 are used - # @param [Symbol, Integer] args values for new bitmask - # @overload bitmask(values) - # Create an unamed bitmask - # @example - # bm = bitmask [:red, :green, :blue] # bits 0,1,2 are used - # bm = bitmask [:red, :green, 5, blue] # bits 0,5,6 are used - # @param [Array] values for new bitmask - # @overload bitmask(native_type, name, values) - # Create a named enum and specify the native type. - # @example - # bitmask FFI::Type::UINT64, :foo, [:red, :green, :blue] - # @param [FFI::Type] native_type native type for new bitmask - # @param [Symbol] name for new bitmask - # @param [Array] values for new bitmask - # @overload bitmask(native_type, *args) - # @example - # bitmask FFI::Type::UINT64, :red, :green, :blue - # @param [FFI::Type] native_type native type for new bitmask - # @param [Symbol, Integer] args values for new bitmask - # @overload bitmask(native_type, values) - # Create a named enum and specify the native type. - # @example - # bitmask FFI::Type::UINT64, [:red, :green, :blue] - # @param [FFI::Type] native_type native type for new bitmask - # @param [Array] values for new bitmask - # @return [FFI::Bitmask] - # Create a new FFI::Bitmask - def bitmask(*args) - generic_enum(FFI::Bitmask, *args) - 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.25/lib/ffi/managedstruct.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/managedstruct.rb deleted file mode 100644 index 0536280..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/managedstruct.rb +++ /dev/null @@ -1,84 +0,0 @@ -# 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.25/lib/ffi/memorypointer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/memorypointer.rb deleted file mode 100644 index 9f07bc6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/memorypointer.rb +++ /dev/null @@ -1 +0,0 @@ -# This class is now implemented in C diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform.rb deleted file mode 100644 index a1bd443..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform.rb +++ /dev/null @@ -1,164 +0,0 @@ -# -# 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" - when /sparcv9|sparc64/ - "sparcv9" - 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|msys/ - '' - when /cygwin/ - 'cyg' - else - 'lib' - end - - LIBSUFFIX = case OS - when /darwin/ - 'dylib' - when /linux|bsd|solaris/ - 'so' - when /windows|cygwin|msys/ - '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" - elsif OS == 'msys' - # Not sure how msys 1.0 behaves, tested on MSYS2. - "msys-2.0.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.25/lib/ffi/platform/aarch64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/aarch64-linux/types.conf deleted file mode 100644 index 072c419..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/aarch64-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/arm-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/arm-linux/types.conf deleted file mode 100644 index e9a923b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/arm-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/i386-cygwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-cygwin/types.conf deleted file mode 100644 index cd3cc38..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-cygwin/types.conf +++ /dev/null @@ -1,3 +0,0 @@ -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.25/lib/ffi/platform/i386-darwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-darwin/types.conf deleted file mode 100644 index 6b9313e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-darwin/types.conf +++ /dev/null @@ -1,100 +0,0 @@ -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.25/lib/ffi/platform/i386-freebsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-freebsd/types.conf deleted file mode 100644 index 3e7b20d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-freebsd/types.conf +++ /dev/null @@ -1,152 +0,0 @@ -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.25/lib/ffi/platform/i386-gnu/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-gnu/types.conf deleted file mode 100644 index f9169c2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-gnu/types.conf +++ /dev/null @@ -1,107 +0,0 @@ -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.25/lib/ffi/platform/i386-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-linux/types.conf deleted file mode 100644 index c46a134..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-linux/types.conf +++ /dev/null @@ -1,103 +0,0 @@ -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.25/lib/ffi/platform/i386-netbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-netbsd/types.conf deleted file mode 100644 index 33bd12b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-netbsd/types.conf +++ /dev/null @@ -1,126 +0,0 @@ -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.25/lib/ffi/platform/i386-openbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-openbsd/types.conf deleted file mode 100644 index c4df68a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-openbsd/types.conf +++ /dev/null @@ -1,128 +0,0 @@ -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.25/lib/ffi/platform/i386-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-solaris/types.conf deleted file mode 100644 index a585100..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-solaris/types.conf +++ /dev/null @@ -1,122 +0,0 @@ -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.25/lib/ffi/platform/i386-windows/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-windows/types.conf deleted file mode 100644 index 38168be..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/i386-windows/types.conf +++ /dev/null @@ -1,105 +0,0 @@ -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.25/lib/ffi/platform/ia64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/ia64-linux/types.conf deleted file mode 100644 index 70e44e8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/ia64-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/mips-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips-linux/types.conf deleted file mode 100644 index ad4ced0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/mips64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips64-linux/types.conf deleted file mode 100644 index 3feb704..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips64-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/mips64el-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips64el-linux/types.conf deleted file mode 100644 index 3feb704..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mips64el-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/mipsel-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsel-linux/types.conf deleted file mode 100644 index ad4ced0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsel-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/mipsisa32r6-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa32r6-linux/types.conf deleted file mode 100644 index ad4ced0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa32r6-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/mipsisa32r6el-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa32r6el-linux/types.conf deleted file mode 100644 index ad4ced0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa32r6el-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/mipsisa64r6-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa64r6-linux/types.conf deleted file mode 100644 index 3feb704..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa64r6-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/mipsisa64r6el-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa64r6el-linux/types.conf deleted file mode 100644 index 3feb704..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/mipsisa64r6el-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/powerpc-aix/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-aix/types.conf deleted file mode 100644 index 30ee66b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-aix/types.conf +++ /dev/null @@ -1,180 +0,0 @@ -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.25/lib/ffi/platform/powerpc-darwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-darwin/types.conf deleted file mode 100644 index 6b9313e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-darwin/types.conf +++ /dev/null @@ -1,100 +0,0 @@ -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.25/lib/ffi/platform/powerpc-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-linux/types.conf deleted file mode 100644 index 76014cd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc-linux/types.conf +++ /dev/null @@ -1,100 +0,0 @@ -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.25/lib/ffi/platform/powerpc64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc64-linux/types.conf deleted file mode 100644 index 3feb704..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/powerpc64-linux/types.conf +++ /dev/null @@ -1,104 +0,0 @@ -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.25/lib/ffi/platform/s390-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/s390-linux/types.conf deleted file mode 100644 index 1cc79ee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/s390-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/s390x-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/s390x-linux/types.conf deleted file mode 100644 index f4c8cec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/s390x-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/sparc-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc-linux/types.conf deleted file mode 100644 index 1882298..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/sparc-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc-solaris/types.conf deleted file mode 100644 index c03c144..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc-solaris/types.conf +++ /dev/null @@ -1,128 +0,0 @@ -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.25/lib/ffi/platform/sparc64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc64-linux/types.conf deleted file mode 100644 index d86ba2f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparc64-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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 = 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 -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 = 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 = 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 -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.25/lib/ffi/platform/sparcv9-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparcv9-solaris/types.conf deleted file mode 100644 index c03c144..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/sparcv9-solaris/types.conf +++ /dev/null @@ -1,128 +0,0 @@ -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.25/lib/ffi/platform/x86_64-cygwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-cygwin/types.conf deleted file mode 100644 index 5dadc7f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-cygwin/types.conf +++ /dev/null @@ -1,3 +0,0 @@ -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.25/lib/ffi/platform/x86_64-darwin/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-darwin/types.conf deleted file mode 100644 index 51637ee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-darwin/types.conf +++ /dev/null @@ -1,126 +0,0 @@ -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.25/lib/ffi/platform/x86_64-freebsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-freebsd/types.conf deleted file mode 100644 index c4df68a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-freebsd/types.conf +++ /dev/null @@ -1,128 +0,0 @@ -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.25/lib/ffi/platform/x86_64-linux/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-linux/types.conf deleted file mode 100644 index f319c0b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-linux/types.conf +++ /dev/null @@ -1,102 +0,0 @@ -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.25/lib/ffi/platform/x86_64-netbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-netbsd/types.conf deleted file mode 100644 index c4df68a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-netbsd/types.conf +++ /dev/null @@ -1,128 +0,0 @@ -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.25/lib/ffi/platform/x86_64-openbsd/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-openbsd/types.conf deleted file mode 100644 index f8419bd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-openbsd/types.conf +++ /dev/null @@ -1,134 +0,0 @@ -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.25/lib/ffi/platform/x86_64-solaris/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-solaris/types.conf deleted file mode 100644 index f461b7e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-solaris/types.conf +++ /dev/null @@ -1,122 +0,0 @@ -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.25/lib/ffi/platform/x86_64-windows/types.conf b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-windows/types.conf deleted file mode 100644 index 24e391d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/platform/x86_64-windows/types.conf +++ /dev/null @@ -1,120 +0,0 @@ -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.__dev_t = short -rbx.platform.typedef.__uid_t = ushort -rbx.platform.typedef.__gid_t = ushort -rbx.platform.typedef._off64_t = long_long -rbx.platform.typedef.fpos_t = long_long -rbx.platform.typedef._fpos_t = long_long -rbx.platform.typedef._fpos64_t = long_long -rbx.platform.typedef._ssize_t = long_long -rbx.platform.typedef.wchar_t = ushort -rbx.platform.typedef.wint_t = uint -rbx.platform.typedef.wctype_t = ushort -rbx.platform.typedef.ptrdiff_t = long_long -rbx.platform.typedef.size_t = ulong_long -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.ulong = ulong -rbx.platform.typedef.clock_t = ulong -rbx.platform.typedef.time_t = long_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 = 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.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 = 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.intptr_t = long_long -rbx.platform.typedef.uintptr_t = ulong_long -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 = uint -rbx.platform.typedef.dev_t = uint -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 = ushort -rbx.platform.typedef._ino_t = ushort -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.sigset_t = ulong -rbx.platform.typedef.sig_atomic_t = int -rbx.platform.typedef.rlim_t = ulong -rbx.platform.typedef._sigset_t = ulong_long -rbx.platform.typedef.__time32_t = long -rbx.platform.typedef.__time64_t = long_long -rbx.platform.typedef.errno_t = int -rbx.platform.typedef._mode_t = ushort -rbx.platform.typedef.mode_t = ushort diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/pointer.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/pointer.rb deleted file mode 100644 index c4eb81c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/pointer.rb +++ /dev/null @@ -1,161 +0,0 @@ -# -# 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 - return '' if len == 0 - 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.25/lib/ffi/struct.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/struct.rb deleted file mode 100644 index bd11a01..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/struct.rb +++ /dev/null @@ -1,371 +0,0 @@ -# -# 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] - # Add hash +spec+ to +builder+. - def hash_layout(builder, spec) - 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.25/lib/ffi/struct_layout_builder.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/struct_layout_builder.rb deleted file mode 100644 index 4d6a464..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/struct_layout_builder.rb +++ /dev/null @@ -1,227 +0,0 @@ -# -# 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.25/lib/ffi/tools/const_generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/const_generator.rb deleted file mode 100644 index dfc622e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/const_generator.rb +++ /dev/null @@ -1,229 +0,0 @@ -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.25/lib/ffi/tools/generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/generator.rb deleted file mode 100644 index 29b59e1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/generator.rb +++ /dev/null @@ -1,60 +0,0 @@ -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.25/lib/ffi/tools/generator_task.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/generator_task.rb deleted file mode 100644 index 9e39519..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/generator_task.rb +++ /dev/null @@ -1,36 +0,0 @@ -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.25/lib/ffi/tools/struct_generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/struct_generator.rb deleted file mode 100644 index e892e65..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/struct_generator.rb +++ /dev/null @@ -1,194 +0,0 @@ -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.25/lib/ffi/tools/types_generator.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/types_generator.rb deleted file mode 100644 index ff24ec5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/tools/types_generator.rb +++ /dev/null @@ -1,134 +0,0 @@ -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.25/lib/ffi/types.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/types.rb deleted file mode 100644 index ddad36e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/types.rb +++ /dev/null @@ -1,194 +0,0 @@ -# -# 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.25/lib/ffi/union.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/union.rb deleted file mode 100644 index 38414ab..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/union.rb +++ /dev/null @@ -1,43 +0,0 @@ -# -# 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.25/lib/ffi/variadic.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/variadic.rb deleted file mode 100644 index 2414055..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/variadic.rb +++ /dev/null @@ -1,78 +0,0 @@ -# -# 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.25/lib/ffi/version.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/version.rb deleted file mode 100644 index cf1dec4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/lib/ffi/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -module FFI - VERSION = '1.9.25' -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getlogin.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getlogin.rb deleted file mode 100644 index de47cac..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getlogin.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'rubygems' -require 'ffi' -module Foo - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function :getlogin, [ ], :string -end -puts "getlogin=#{Foo.getlogin}" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getpid.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getpid.rb deleted file mode 100644 index e44534c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/getpid.rb +++ /dev/null @@ -1,8 +0,0 @@ -require 'rubygems' -require 'ffi' -module Foo - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function :getpid, [ ], :int -end -puts "My pid=#{Foo.getpid}" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/gettimeofday.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/gettimeofday.rb deleted file mode 100644 index 34b2668..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/gettimeofday.rb +++ /dev/null @@ -1,18 +0,0 @@ -require 'rubygems' -require 'ffi' -class Timeval < FFI::Struct - rb_maj, rb_min, rb_micro = RUBY_VERSION.split('.') - if rb_maj.to_i >= 1 && rb_min.to_i >= 9 || RUBY_PLATFORM =~ /java/ - layout :tv_sec => :ulong, :tv_usec => :ulong - else - layout :tv_sec, :ulong, 0, :tv_usec, :ulong, 4 - end -end -module LibC - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function :gettimeofday, [ :pointer, :pointer ], :int -end -t = Timeval.new -LibC.gettimeofday(t.pointer, nil) -puts "t.tv_sec=#{t[:tv_sec]} t.tv_usec=#{t[:tv_usec]}" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/hello.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/hello.rb deleted file mode 100644 index 11d5285..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/hello.rb +++ /dev/null @@ -1,7 +0,0 @@ -require File.expand_path(File.join(File.dirname(__FILE__), "sample_helper")) -module Foo - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function("cputs", "puts", [ :string ], :int) -end -Foo.cputs("Hello, World via libc puts using FFI on MRI ruby") diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/inotify.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/inotify.rb deleted file mode 100644 index e615f7b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/inotify.rb +++ /dev/null @@ -1,60 +0,0 @@ -require 'rubygems' -require 'ffi' -module Inotify - extend FFI::Library - ffi_lib FFI::Library::LIBC - class Event < FFI::Struct - layout \ - :wd, :int, - :mask, :uint, - :cookie, :uint, - :len, :uint - end - attach_function :init, :inotify_init, [ ], :int - attach_function :add_watch, :inotify_add_watch, [ :int, :string, :uint ], :int - attach_function :rm_watch, :inotify_rm_watch, [ :int, :uint ], :int - attach_function :read, [ :int, :buffer_out, :uint ], :int - IN_ACCESS=0x00000001 - IN_MODIFY=0x00000002 - IN_ATTRIB=0x00000004 - IN_CLOSE_WRITE=0x00000008 - IN_CLOSE_NOWRITE=0x00000010 - IN_CLOSE=(IN_CLOSE_WRITE | IN_CLOSE_NOWRITE) - IN_OPEN=0x00000020 - IN_MOVED_FROM=0x00000040 - IN_MOVED_TO=0x00000080 - IN_MOVE= (IN_MOVED_FROM | IN_MOVED_TO) - IN_CREATE=0x00000100 - IN_DELETE=0x00000200 - IN_DELETE_SELF=0x00000400 - IN_MOVE_SELF=0x00000800 - # Events sent by the kernel. - IN_UNMOUNT=0x00002000 - IN_Q_OVERFLOW=0x00004000 - IN_IGNORED=0x00008000 - IN_ONLYDIR=0x01000000 - IN_DONT_FOLLOW=0x02000000 - IN_MASK_ADD=0x20000000 - IN_ISDIR=0x40000000 - IN_ONESHOT=0x80000000 - 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) - -end -if $0 == __FILE__ - fd = Inotify.init - puts "fd=#{fd}" - wd = Inotify.add_watch(fd, "/tmp/", Inotify::IN_ALL_EVENTS) - fp = FFI::IO.for_fd(fd) - puts "wfp=#{fp}" - while true - buf = FFI::Buffer.alloc_out(Inotify::Event.size + 4096, 1, false) - ev = Inotify::Event.new buf - ready = IO.select([ fp ], nil, nil, nil) - n = Inotify.read(fd, buf, buf.total) - puts "Read #{n} bytes from inotify fd" - puts "event.wd=#{ev[:wd]} mask=#{ev[:mask]} len=#{ev[:len]} name=#{ev[:len] > 0 ? buf.get_string(16) : 'unknown'}" - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/pty.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/pty.rb deleted file mode 100644 index 45c5a19..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/pty.rb +++ /dev/null @@ -1,76 +0,0 @@ -require 'ffi' - - -module PTY - private - module LibC - extend FFI::Library - ffi_lib FFI::Library::LIBC - attach_function :forkpty, [ :buffer_out, :buffer_out, :buffer_in, :buffer_in ], :int - attach_function :openpty, [ :buffer_out, :buffer_out, :buffer_out, :buffer_in, :buffer_in ], :int - attach_function :login_tty, [ :int ], :int - attach_function :close, [ :int ], :int - attach_function :strerror, [ :int ], :string - attach_function :fork, [], :int - attach_function :execv, [ :string, :buffer_in ], :int - attach_function :execvp, [ :string, :buffer_in ], :int - attach_function :dup2, [ :int, :int ], :int - attach_function :dup, [ :int ], :int - end - Buffer = FFI::Buffer - def self.build_args(args) - cmd = args.shift - cmd_args = args.map do |arg| - MemoryPointer.from_string(arg) - end - exec_args = MemoryPointer.new(:pointer, 1 + cmd_args.length + 1) - exec_cmd = MemoryPointer.from_string(cmd) - exec_args[0].put_pointer(0, exec_cmd) - cmd_args.each_with_index do |arg, i| - exec_args[i + 1].put_pointer(0, arg) - end - [ cmd, exec_args ] - end - public - def self.getpty(*args) - mfdp = Buffer.new :int - name = Buffer.new 1024 - # - # All the execv setup is done in the parent, since doing anything other than - # execv in the child after fork is really flakey - # - exec_cmd, exec_args = build_args(args) - pid = LibC.forkpty(mfdp, name, nil, nil) - raise "forkpty failed: #{LibC.strerror(FFI.errno)}" if pid < 0 - if pid == 0 - LibC.execvp(exec_cmd, exec_args) - exit 1 - end - masterfd = mfdp.get_int(0) - rfp = FFI::IO.for_fd(masterfd, "r") - wfp = FFI::IO.for_fd(LibC.dup(masterfd), "w") - if block_given? - yield rfp, wfp, pid - rfp.close unless rfp.closed? - wfp.close unless wfp.closed? - else - [ rfp, wfp, pid ] - end - end - def self.spawn(*args, &block) - self.getpty("/bin/sh", "-c", args[0], &block) - end -end -module LibC - extend FFI::Library - attach_function :close, [ :int ], :int - attach_function :write, [ :int, :buffer_in, :ulong ], :long - attach_function :read, [ :int, :buffer_out, :ulong ], :long -end -PTY.getpty("/bin/ls", "-alR", "/") { |rfd, wfd, pid| -#PTY.spawn("ls -laR /") { |rfd, wfd, pid| - puts "child pid=#{pid}" - while !rfd.eof? && (buf = rfd.gets) - puts "child: '#{buf.strip}'" - end -} diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/qsort.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/qsort.rb deleted file mode 100644 index 5d4ab6c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/qsort.rb +++ /dev/null @@ -1,21 +0,0 @@ -require 'rubygems' -require 'ffi' - -module LibC - extend FFI::Library - ffi_lib FFI::Library::LIBC - callback :qsort_cmp, [ :pointer, :pointer ], :int - attach_function :qsort, [ :pointer, :ulong, :ulong, :qsort_cmp ], :int -end - -p = FFI::MemoryPointer.new(:int, 2) -p.put_array_of_int32(0, [ 2, 1 ]) -puts "ptr=#{p.inspect}" -puts "Before qsort #{p.get_array_of_int32(0, 2).join(', ')}" -LibC.qsort(p, 2, 4) do |p1, p2| - i1 = p1.get_int32(0) - i2 = p2.get_int32(0) - puts "In block: comparing #{i1} and #{i2}" - i1 < i2 ? -1 : i1 > i2 ? 1 : 0 -end -puts "After qsort #{p.get_array_of_int32(0, 2).join(', ')}" diff --git a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/sample_helper.rb b/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/sample_helper.rb deleted file mode 100644 index 2bac44f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/ffi-1.9.25/samples/sample_helper.rb +++ /dev/null @@ -1,6 +0,0 @@ -require 'rubygems' -require 'spec' - -$:.unshift File.join(File.dirname(__FILE__), "..", "lib"), File.join(File.dirname(__FILE__), "..", "build", RUBY_VERSION) unless RUBY_PLATFORM =~ /java/ -require "ffi" - 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 deleted file mode 100644 index ea587c7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Gemfile +++ /dev/null @@ -1,24 +0,0 @@ -# ---------------------------------------------------------------------------- -# 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 deleted file mode 100644 index e603a78..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index 1c929e5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/Rakefile +++ /dev/null @@ -1,13 +0,0 @@ -# ---------------------------------------------------------------------------- -# 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 deleted file mode 100644 index fc694cf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended.rb +++ /dev/null @@ -1,202 +0,0 @@ -# ---------------------------------------------------------------------------- -# 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 deleted file mode 100644 index 0639375..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/forwardable-extended-2.6.0/lib/forwardable/extended/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -# 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/jekyll-3.6.3/.rubocop.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/.rubocop.yml deleted file mode 100644 index f483e1d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/.rubocop.yml +++ /dev/null @@ -1,163 +0,0 @@ ---- -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/SpaceAroundOperators: - Enabled: true -Layout/SpaceInsideBrackets: - Enabled: false -Lint/EndAlignment: - Severity: error -Lint/RescueWithoutErrorClass: - Enabled: false -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/Attr: - Enabled: false -Style/BracesAroundHashParameters: - Enabled: false -Style/ClassAndModuleChildren: - Enabled: false -Style/FrozenStringLiteralComment: - Enabled: true - 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 -Style/UnneededCapitalW: - Enabled: false diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/LICENSE b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/LICENSE deleted file mode 100644 index e177b1b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -The MIT License (MIT) - -Copyright (c) 2008-2017 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.6.3/README.markdown b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/README.markdown deleted file mode 100644 index 1350d01..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/README.markdown +++ /dev/null @@ -1,61 +0,0 @@ -# [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 a [team captain](https://github.com/orgs/jekyll/teams/affinity-team-captains/members) 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.6.3/exe/jekyll b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/exe/jekyll deleted file mode 100755 index 07e1371..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/exe/jekyll +++ /dev/null @@ -1,57 +0,0 @@ -#!/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.6.3/lib/jekyll.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll.rb deleted file mode 100644 index cdcab8b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll.rb +++ /dev/null @@ -1,195 +0,0 @@ -# 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" - -SafeYAML::OPTIONS[:suppress_warnings] = true - -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 :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.6.3/lib/jekyll/cleaner.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/cleaner.rb deleted file mode 100644 index fee6418..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/cleaner.rb +++ /dev/null @@ -1,110 +0,0 @@ -# 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 - (existing_files - new_files - new_dirs + replaced_files).to_a - 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.6.3/lib/jekyll/collection.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/collection.rb deleted file mode 100644 index ebafea3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/collection.rb +++ /dev/null @@ -1,230 +0,0 @@ -# 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 ||= "_#{label}" - 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(relative_directory) - 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 From 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.6.3/lib/jekyll/command.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/command.rb deleted file mode 100644 index 7de98e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/command.rb +++ /dev/null @@ -1,78 +0,0 @@ -# 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.6.3/lib/jekyll/commands/build.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/build.rb deleted file mode 100644 index 96a48cd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/build.rb +++ /dev/null @@ -1,102 +0,0 @@ -# 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.6.3/lib/jekyll/commands/clean.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/clean.rb deleted file mode 100644 index 1c3e40b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/clean.rb +++ /dev/null @@ -1,43 +0,0 @@ -# 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 = File.join(options["source"], ".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.6.3/lib/jekyll/commands/doctor.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/doctor.rb deleted file mode 100644 index c10ee59..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/doctor.rb +++ /dev/null @@ -1,153 +0,0 @@ -# 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 - rescue - 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.6.3/lib/jekyll/commands/help.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/help.rb deleted file mode 100644 index 42a8017..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/help.rb +++ /dev/null @@ -1,34 +0,0 @@ -# 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.6.3/lib/jekyll/commands/new.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/new.rb deleted file mode 100644 index e784f24..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/new.rb +++ /dev/null @@ -1,156 +0,0 @@ -# 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 - process, output = Jekyll::Utils::Exec.run("bundle", "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.6.3/lib/jekyll/commands/new_theme.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/new_theme.rb deleted file mode 100644 index c55e681..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/new_theme.rb +++ /dev/null @@ -1,40 +0,0 @@ -# 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.6.3/lib/jekyll/commands/serve.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/serve.rb deleted file mode 100644 index 53973b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/serve.rb +++ /dev/null @@ -1,245 +0,0 @@ -# frozen_string_literal: true - -module Jekyll - module Commands - class Serve < Command - 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.",], - }.freeze - - # - - 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["serving"] = true - opts["watch" ] = true unless opts.key?("watch") - - config = configuration_from_options(opts) - if Jekyll.env == "development" - config["url"] = default_url(config) - end - [Build, Serve].each { |klass| klass.process(config) } - end - end - end - - # - - def process(opts) - opts = configuration_from_options(opts) - destination = opts["destination"] - setup(destination) - - start_up_webrick(opts, destination) - 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"]), - :BindAddress => opts["host"], - :Port => opts["port"], - :DirectoryIndex => %W( - index.htm - index.html - index.rhtml - index.cgi - index.xml - ), - } - - opts[:DirectoryIndex] = [] if opts[:JekyllOptions]["show_dir_listing"] - - enable_ssl(opts) - enable_logging(opts) - opts - end - - # - - private - def start_up_webrick(opts, destination) - 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 - # rubocop:disable Metrics/AbcSize - def enable_ssl(opts) - return if !opts[:JekyllOptions]["ssl_cert"] && !opts[:JekyllOptions]["ssl_key"] - if !opts[:JekyllOptions]["ssl_cert"] || !opts[:JekyllOptions]["ssl_key"] - # rubocop:disable Style/RedundantException - raise RuntimeError, "--ssl-cert or --ssl-key missing." - end - require "openssl" - require "webrick/https" - source_key = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], \ - opts[:JekyllOptions]["ssl_key" ]) - source_certificate = Jekyll.sanitized_path(opts[:JekyllOptions]["source"], \ - opts[:JekyllOptions]["ssl_cert"]) - opts[:SSLCertificate] = - OpenSSL::X509::Certificate.new(File.read(source_certificate)) - opts[:SSLPrivateKey ] = OpenSSL::PKey::RSA.new(File.read(source_key)) - opts[:SSLEnable] = true - end - - private - - def start_callback(detached) - unless detached - proc do - Jekyll.logger.info("Server running...", "press ctrl-c to stop.") - end - end - end - - private - def mime_types - file = File.expand_path("../mime.types", __dir__) - WEBrick::HTTPUtils.load_mime_types(file) - end - end - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/serve/servlet.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/serve/servlet.rb deleted file mode 100644 index 2e41b69..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/commands/serve/servlet.rb +++ /dev/null @@ -1,62 +0,0 @@ -# frozen_string_literal: true - -require "webrick" - -module Jekyll - module Commands - class Serve - 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 - - # 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, ".html") || super(req, res, "#{basename}.html") - end - - # rubocop:disable Naming/MethodName - def do_GET(req, res) - rtn = super - 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.6.3/lib/jekyll/configuration.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/configuration.rb deleted file mode 100644 index a595dd8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/configuration.rb +++ /dev/null @@ -1,410 +0,0 @@ -# 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"), - "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, - }, - }.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) - .fix_common_issues.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("toml") unless defined?(TOML) - TOML.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 - config_files = [config_files] unless config_files.is_a? 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.fix_common_issues.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 - - def fix_common_issues - config = clone - - if config.key?("paginate") && (!config["paginate"].is_a?(Integer) || - config["paginate"] < 1) - - Jekyll.logger.warn "Config Warning:", "The `paginate` key must be a positive" \ - " integer or nil. It's currently set to '#{config["paginate"].inspect}'." - config["paginate"] = nil - end - - config - 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.6.3/lib/jekyll/converter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converter.rb deleted file mode 100644 index 3cb74de..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converter.rb +++ /dev/null @@ -1,54 +0,0 @@ -# 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.6.3/lib/jekyll/converters/identity.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/identity.rb deleted file mode 100644 index 2296aff..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/identity.rb +++ /dev/null @@ -1,23 +0,0 @@ -# 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.6.3/lib/jekyll/converters/markdown.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown.rb deleted file mode 100644 index 857b6ec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown.rb +++ /dev/null @@ -1,104 +0,0 @@ -# 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.6.3/lib/jekyll/converters/markdown/kramdown_parser.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/kramdown_parser.rb deleted file mode 100644 index a9650cc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/kramdown_parser.rb +++ /dev/null @@ -1,123 +0,0 @@ -# Frozen-string-literal: true -# Encoding: utf-8 - -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) - Kramdown::Document.new(content, @config).to_html - 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.6.3/lib/jekyll/converters/markdown/rdiscount_parser.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/rdiscount_parser.rb deleted file mode 100644 index 654a3a6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/rdiscount_parser.rb +++ /dev/null @@ -1,35 +0,0 @@ -# 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.6.3/lib/jekyll/converters/markdown/redcarpet_parser.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/redcarpet_parser.rb deleted file mode 100644 index 7a8c6ec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/markdown/redcarpet_parser.rb +++ /dev/null @@ -1,108 +0,0 @@ -# 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.6.3/lib/jekyll/converters/smartypants.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/smartypants.rb deleted file mode 100644 index 37fecb1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/converters/smartypants.rb +++ /dev/null @@ -1,36 +0,0 @@ -# frozen_string_literal: true - -class Kramdown::Parser::SmartyPants < Kramdown::Parser::Kramdown - def initialize(source, options) - super - @block_parsers = [:block_html] - @span_parsers = [:smart_quotes, :html_entity, :typographic_syms, :span_html] - end -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) - Kramdown::Document.new(content, @config).to_html.chomp - end - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/convertible.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/convertible.rb deleted file mode 100644 index 6b20548..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/convertible.rb +++ /dev/null @@ -1,251 +0,0 @@ -# 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 SyntaxError => e - Jekyll.logger.warn "YAML Exception reading #{filename}: #{e.message}" - raise e if self.site.config["strict_front_matter"] - rescue => 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. - def place_in_layout? - !asset_file? - 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 - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/deprecator.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/deprecator.rb deleted file mode 100644 index 327358c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/deprecator.rb +++ /dev/null @@ -1,52 +0,0 @@ -# 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.6.3/lib/jekyll/document.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/document.rb deleted file mode 100644 index 0877ca1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/document.rb +++ /dev/null @@ -1,507 +0,0 @@ -# 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 => 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? 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.6.3/lib/jekyll/drops/collection_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/collection_drop.rb deleted file mode 100644 index e1d7da9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/collection_drop.rb +++ /dev/null @@ -1,22 +0,0 @@ -# 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.6.3/lib/jekyll/drops/document_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/document_drop.rb deleted file mode 100644 index 7279978..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/document_drop.rb +++ /dev/null @@ -1,69 +0,0 @@ -# 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.6.3/lib/jekyll/drops/drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/drop.rb deleted file mode 100644 index 92978af..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/drop.rb +++ /dev/null @@ -1,214 +0,0 @@ -# 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.6.3/lib/jekyll/drops/excerpt_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/excerpt_drop.rb deleted file mode 100644 index 0362d93..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/excerpt_drop.rb +++ /dev/null @@ -1,15 +0,0 @@ -# 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.6.3/lib/jekyll/drops/jekyll_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/jekyll_drop.rb deleted file mode 100644 index 8a56b9e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/jekyll_drop.rb +++ /dev/null @@ -1,33 +0,0 @@ -# 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.6.3/lib/jekyll/drops/site_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/site_drop.rb deleted file mode 100644 index 632f81c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/site_drop.rb +++ /dev/null @@ -1,47 +0,0 @@ -# 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.6.3/lib/jekyll/drops/static_file_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/static_file_drop.rb deleted file mode 100644 index f855cf3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/static_file_drop.rb +++ /dev/null @@ -1,13 +0,0 @@ -# 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.6.3/lib/jekyll/drops/unified_payload_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/unified_payload_drop.rb deleted file mode 100644 index 52647f9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/unified_payload_drop.rb +++ /dev/null @@ -1,25 +0,0 @@ -# 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.6.3/lib/jekyll/drops/url_drop.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/url_drop.rb deleted file mode 100644 index 0571558..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/drops/url_drop.rb +++ /dev/null @@ -1,88 +0,0 @@ -# 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.6.3/lib/jekyll/entry_filter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/entry_filter.rb deleted file mode 100644 index 000e4cf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/entry_filter.rb +++ /dev/null @@ -1,126 +0,0 @@ -# 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| - # Reject this entry if it is a symlink. - next true if symlink?(e) - # Do not reject this entry if it is included. - next false if included?(e) - # Reject this entry if it is special, a backup file, or excluded. - special?(e) || backup?(e) || excluded?(e) - 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.6.3/lib/jekyll/errors.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/errors.rb deleted file mode 100644 index 8d659e8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/errors.rb +++ /dev/null @@ -1,20 +0,0 @@ -# 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.6.3/lib/jekyll/excerpt.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/excerpt.rb deleted file mode 100644 index 7adfec9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/excerpt.rb +++ /dev/null @@ -1,126 +0,0 @@ -# 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.6.3/lib/jekyll/external.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/external.rb deleted file mode 100644 index 0a65dfa..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/external.rb +++ /dev/null @@ -1,74 +0,0 @@ -# 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.6.3/lib/jekyll/filters.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters.rb deleted file mode 100644 index 686995e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters.rb +++ /dev/null @@ -1,430 +0,0 @@ -# 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.6.3/lib/jekyll/filters/grouping_filters.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters/grouping_filters.rb deleted file mode 100644 index 4086bbe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters/grouping_filters.rb +++ /dev/null @@ -1,65 +0,0 @@ -# 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.6.3/lib/jekyll/filters/url_filters.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters/url_filters.rb deleted file mode 100644 index 151c4e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/filters/url_filters.rb +++ /dev/null @@ -1,60 +0,0 @@ -# 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? - 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. - # - # 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? - 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.6.3/lib/jekyll/frontmatter_defaults.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/frontmatter_defaults.rb deleted file mode 100644 index fc1bcc2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/frontmatter_defaults.rb +++ /dev/null @@ -1,197 +0,0 @@ -# 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? - - scope_path = Pathname.new(scope["path"]) - Pathname.new(sanitize_path(path)).ascend do |ascended_path| - if ascended_path.to_s == scope_path.to_s - return true - end - end - 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.6.3/lib/jekyll/generator.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/generator.rb deleted file mode 100644 index 649715f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/generator.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -module Jekyll - Generator = Class.new(Plugin) -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/hooks.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/hooks.rb deleted file mode 100644 index 8007edf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/hooks.rb +++ /dev/null @@ -1,104 +0,0 @@ -# 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 => [], - }, - } - - # 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.6.3/lib/jekyll/layout.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/layout.rb deleted file mode 100644 index f62fec0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/layout.rb +++ /dev/null @@ -1,62 +0,0 @@ -# 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.6.3/lib/jekyll/liquid_extensions.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_extensions.rb deleted file mode 100644 index 4551ac1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_extensions.rb +++ /dev/null @@ -1,24 +0,0 @@ -# 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.6.3/lib/jekyll/liquid_renderer.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer.rb deleted file mode 100644 index a79f06b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer.rb +++ /dev/null @@ -1,49 +0,0 @@ -# frozen_string_literal: true - -require "jekyll/liquid_renderer/file" -require "jekyll/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] ||= {} - @stats[filename][:count] ||= 0 - @stats[filename][:count] += 1 - end - end - - def increment_bytes(filename, bytes) - @stats[filename][:bytes] ||= 0 - @stats[filename][:bytes] += bytes - end - - def increment_time(filename, time) - @stats[filename][:time] ||= 0.0 - @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 - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer/file.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer/file.rb deleted file mode 100644 index 574bbd3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer/file.rb +++ /dev/null @@ -1,56 +0,0 @@ -# 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.6.3/lib/jekyll/liquid_renderer/table.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer/table.rb deleted file mode 100644 index 7aa2e49..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/liquid_renderer/table.rb +++ /dev/null @@ -1,96 +0,0 @@ -# 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.6.3/lib/jekyll/log_adapter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/log_adapter.rb deleted file mode 100644 index 65b8f9d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/log_adapter.rb +++ /dev/null @@ -1,147 +0,0 @@ -# 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.6.3/lib/jekyll/mime.types b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/mime.types deleted file mode 100644 index af68d35..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/mime.types +++ /dev/null @@ -1,825 +0,0 @@ -# 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.6.3/lib/jekyll/page.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/page.rb deleted file mode 100644 index 3b3d935..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/page.rb +++ /dev/null @@ -1,187 +0,0 @@ -# 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.6.3/lib/jekyll/plugin.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/plugin.rb deleted file mode 100644 index 2a9dbee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/plugin.rb +++ /dev/null @@ -1,98 +0,0 @@ -# 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.6.3/lib/jekyll/plugin_manager.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/plugin_manager.rb deleted file mode 100644 index f53d187..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/plugin_manager.rb +++ /dev/null @@ -1,113 +0,0 @@ -# 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.6.3/lib/jekyll/publisher.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/publisher.rb deleted file mode 100644 index 26fe4a3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/publisher.rb +++ /dev/null @@ -1,23 +0,0 @@ -# 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.6.3/lib/jekyll/reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/reader.rb deleted file mode 100644 index 7b5c3b1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/reader.rb +++ /dev/null @@ -1,134 +0,0 @@ -# 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.6.3/lib/jekyll/readers/collection_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/collection_reader.rb deleted file mode 100644 index 77c7009..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/collection_reader.rb +++ /dev/null @@ -1,22 +0,0 @@ -# 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.6.3/lib/jekyll/readers/data_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/data_reader.rb deleted file mode 100644 index 445d548..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/data_reader.rb +++ /dev/null @@ -1,77 +0,0 @@ -# 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.6.3/lib/jekyll/readers/layout_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/layout_reader.rb deleted file mode 100644 index 706dfed..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/layout_reader.rb +++ /dev/null @@ -1,71 +0,0 @@ -# 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.6.3/lib/jekyll/readers/page_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/page_reader.rb deleted file mode 100644 index 62d7419..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/page_reader.rb +++ /dev/null @@ -1,25 +0,0 @@ -# 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.6.3/lib/jekyll/readers/post_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/post_reader.rb deleted file mode 100644 index b0dc303..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/post_reader.rb +++ /dev/null @@ -1,72 +0,0 @@ -# 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.6.3/lib/jekyll/readers/static_file_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/static_file_reader.rb deleted file mode 100644 index 6bf07f5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/static_file_reader.rb +++ /dev/null @@ -1,25 +0,0 @@ -# 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.6.3/lib/jekyll/readers/theme_assets_reader.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/theme_assets_reader.rb deleted file mode 100644 index 2706690..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/readers/theme_assets_reader.rb +++ /dev/null @@ -1,49 +0,0 @@ -# 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.6.3/lib/jekyll/regenerator.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/regenerator.rb deleted file mode 100644 index 91ce300..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/regenerator.rb +++ /dev/null @@ -1,201 +0,0 @@ -# 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 - 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.6.3/lib/jekyll/related_posts.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/related_posts.rb deleted file mode 100644 index fcccdd8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/related_posts.rb +++ /dev/null @@ -1,52 +0,0 @@ -# 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.6.3/lib/jekyll/renderer.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/renderer.rb deleted file mode 100644 index 136a42a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/renderer.rb +++ /dev/null @@ -1,269 +0,0 @@ -# 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 => 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), - site.in_source_dir(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.6.3/lib/jekyll/site.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/site.rb deleted file mode 100644 index ebf78b1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/site.rb +++ /dev/null @@ -1,472 +0,0 @@ -# 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.6.3/lib/jekyll/static_file.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/static_file.rb deleted file mode 100644 index fd53710..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/static_file.rb +++ /dev/null @@ -1,162 +0,0 @@ -# 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.6.3/lib/jekyll/stevenson.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/stevenson.rb deleted file mode 100644 index bbec661..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/stevenson.rb +++ /dev/null @@ -1,61 +0,0 @@ -# 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.6.3/lib/jekyll/tags/highlight.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/highlight.rb deleted file mode 100644 index 683e3b2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/highlight.rb +++ /dev/null @@ -1,141 +0,0 @@ -# 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") - - 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.6.3/lib/jekyll/tags/include.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/include.rb deleted file mode 100644 index 0032b7d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/include.rb +++ /dev/null @@ -1,215 +0,0 @@ -# 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 - 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.6.3/lib/jekyll/tags/link.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/link.rb deleted file mode 100644 index b3f5a2a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/link.rb +++ /dev/null @@ -1,37 +0,0 @@ -# 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.6.3/lib/jekyll/tags/post_url.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/post_url.rb deleted file mode 100644 index 4fba981..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/tags/post_url.rb +++ /dev/null @@ -1,103 +0,0 @@ -# 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 => 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.6.3/lib/jekyll/theme.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/theme.rb deleted file mode 100644 index 031c61b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/theme.rb +++ /dev/null @@ -1,68 +0,0 @@ -# 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 - nil - 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 - require "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.6.3/lib/jekyll/theme_builder.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/theme_builder.rb deleted file mode 100644 index aca89dd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/theme_builder.rb +++ /dev/null @@ -1,119 +0,0 @@ -# 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 - - 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 - - def user_name - @user_name ||= `git config user.name`.chomp - end - - def user_email - @user_email ||= `git config user.email`.chomp - 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.6.3/lib/jekyll/url.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/url.rb deleted file mode 100644 index f915785..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/url.rb +++ /dev/null @@ -1,161 +0,0 @@ -# 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.6.3/lib/jekyll/utils.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils.rb deleted file mode 100644 index 2f5f55d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils.rb +++ /dev/null @@ -1,340 +0,0 @@ - -# frozen_string_literal: true - -module Jekyll - module Utils - extend self - autoload :Ansi, "jekyll/utils/ansi" - autoload :Exec, "jekyll/utils/exec" - autoload :Platforms, "jekyll/utils/platforms" - autoload :Rouge, "jekyll/utils/rouge" - autoload :WinTZ, "jekyll/utils/win_tz" - - # Constants for use in #slugify - SLUGIFY_MODES = %w(raw default pretty ascii).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. - # - # 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" - # - # 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 - - # Replace each character sequence with a hyphen - re = - case mode - when "raw" - SLUGIFY_RAW_REGEXP - when "default" - SLUGIFY_DEFAULT_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 - end - - # Strip according to the mode - slug = string.gsub(re, "-") - - # 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 - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/ansi.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/ansi.rb deleted file mode 100644 index 8bdd232..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/ansi.rb +++ /dev/null @@ -1,59 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Jekyll - MIT License -# Encoding: utf-8 - -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.6.3/lib/jekyll/utils/exec.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/exec.rb deleted file mode 100644 index fee8b2d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/exec.rb +++ /dev/null @@ -1,27 +0,0 @@ -# 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.6.3/lib/jekyll/utils/platforms.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/platforms.rb deleted file mode 100644 index f4f3382..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/platforms.rb +++ /dev/null @@ -1,82 +0,0 @@ -# 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.6.3/lib/jekyll/utils/rouge.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/rouge.rb deleted file mode 100644 index d1befa1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/rouge.rb +++ /dev/null @@ -1,21 +0,0 @@ -# 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.6.3/lib/jekyll/utils/win_tz.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/win_tz.rb deleted file mode 100644 index 322f5ac..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/utils/win_tz.rb +++ /dev/null @@ -1,75 +0,0 @@ -# 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.6.3/lib/jekyll/version.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/version.rb deleted file mode 100644 index 87b5521..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/jekyll/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -module Jekyll - VERSION = "3.6.3".freeze -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/.gitignore b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/.gitignore deleted file mode 100644 index 45c1505..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -_site -.sass-cache -.jekyll-metadata diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/404.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/404.html deleted file mode 100644 index c472b4e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/404.html +++ /dev/null @@ -1,24 +0,0 @@ ---- -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.6.3/lib/site_template/_config.yml b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/_config.yml deleted file mode 100644 index f91333e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/_config.yml +++ /dev/null @@ -1,43 +0,0 @@ -# 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.6.3/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb deleted file mode 100644 index 8d8f7c1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/_posts/0000-00-00-welcome-to-jekyll.markdown.erb +++ /dev/null @@ -1,25 +0,0 @@ ---- -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.6.3/lib/site_template/about.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/about.md deleted file mode 100644 index 8b4e0b2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/about.md +++ /dev/null @@ -1,18 +0,0 @@ ---- -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.6.3/lib/site_template/index.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/index.md deleted file mode 100644 index 1eb5d67..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/site_template/index.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -# 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.6.3/lib/theme_template/CODE_OF_CONDUCT.md.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/CODE_OF_CONDUCT.md.erb deleted file mode 100644 index 2b2c773..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/CODE_OF_CONDUCT.md.erb +++ /dev/null @@ -1,74 +0,0 @@ -# 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.6.3/lib/theme_template/Gemfile b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/Gemfile deleted file mode 100644 index bb94df8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -# frozen_string_literal: true - -source "https://rubygems.org" -gemspec diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/LICENSE.txt.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/LICENSE.txt.erb deleted file mode 100644 index 38a0eb4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/LICENSE.txt.erb +++ /dev/null @@ -1,21 +0,0 @@ -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.6.3/lib/theme_template/README.md.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/README.md.erb deleted file mode 100644 index ff8ad05..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/README.md.erb +++ /dev/null @@ -1,52 +0,0 @@ -# <%= 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.6.3/lib/theme_template/_layouts/default.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/default.html deleted file mode 100644 index cddd070..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/default.html +++ /dev/null @@ -1 +0,0 @@ -{{ content }} diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/page.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/page.html deleted file mode 100644 index 5e71126..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/page.html +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: default ---- - -{{ content }} diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/post.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/post.html deleted file mode 100644 index 5e71126..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/_layouts/post.html +++ /dev/null @@ -1,5 +0,0 @@ ---- -layout: default ---- - -{{ content }} diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_config.yml.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_config.yml.erb deleted file mode 100644 index 82e8d42..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_config.yml.erb +++ /dev/null @@ -1 +0,0 @@ -theme: <%= theme_name %> diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_post.md b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_post.md deleted file mode 100644 index 145b21d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/_post.md +++ /dev/null @@ -1,12 +0,0 @@ ---- -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.6.3/lib/theme_template/example/index.html b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/index.html deleted file mode 100644 index b688538..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/index.html +++ /dev/null @@ -1,14 +0,0 @@ ---- -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.6.3/lib/theme_template/example/style.scss b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/style.scss deleted file mode 100644 index 7388f52..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/example/style.scss +++ /dev/null @@ -1,7 +0,0 @@ ---- ---- - -// 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.6.3/lib/theme_template/gitignore.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/gitignore.erb deleted file mode 100644 index 867d379..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/gitignore.erb +++ /dev/null @@ -1,5 +0,0 @@ -*.gem -.bundle -.sass-cache -_site -Gemfile.lock diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/theme.gemspec.erb b/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/theme.gemspec.erb deleted file mode 100644 index 44c8feb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-3.6.3/lib/theme_template/theme.gemspec.erb +++ /dev/null @@ -1,19 +0,0 @@ -# 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 deleted file mode 100644 index 73a290d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.gitignore +++ /dev/null @@ -1,20 +0,0 @@ -/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 deleted file mode 100644 index 5f16476..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---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 deleted file mode 100644 index 22a5680..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.rubocop.yml +++ /dev/null @@ -1,29 +0,0 @@ -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 deleted file mode 100644 index 1540c00..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/.travis.yml +++ /dev/null @@ -1,20 +0,0 @@ -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 deleted file mode 100644 index 9df5048..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index e3622ca..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/History.markdown +++ /dev/null @@ -1,98 +0,0 @@ -## 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 deleted file mode 100644 index 2c17689..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index ed75c2b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/README.md +++ /dev/null @@ -1,139 +0,0 @@ -# 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 deleted file mode 100644 index 8754e40..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/Rakefile +++ /dev/null @@ -1,6 +0,0 @@ -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 deleted file mode 100644 index b74dfd8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/jekyll-feed.gemspec +++ /dev/null @@ -1,25 +0,0 @@ -# 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 deleted file mode 100644 index 4413767..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed.rb +++ /dev/null @@ -1,10 +0,0 @@ -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 deleted file mode 100644 index 6f4770e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/feed.xml +++ /dev/null @@ -1,81 +0,0 @@ - -{% 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 deleted file mode 100644 index 0ff34ed..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/generator.rb +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index 9769b7d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/meta-tag.rb +++ /dev/null @@ -1,39 +0,0 @@ -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 deleted file mode 100644 index 27556b9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/lib/jekyll-feed/page-without-a-file.rb +++ /dev/null @@ -1,7 +0,0 @@ -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 deleted file mode 100755 index 8a09d8a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/bootstrap +++ /dev/null @@ -1,3 +0,0 @@ -#! /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 deleted file mode 100755 index 5b4c0f3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/cibuild +++ /dev/null @@ -1,7 +0,0 @@ -#! /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 deleted file mode 100755 index a9c226f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/script/release +++ /dev/null @@ -1,7 +0,0 @@ -#!/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 deleted file mode 100644 index 32bccc5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_config.yml +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 78a6ff9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_data/authors.yml +++ /dev/null @@ -1,5 +0,0 @@ -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 deleted file mode 100644 index bf78910..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_drafts/2015-01-12-a-draft.md +++ /dev/null @@ -1,4 +0,0 @@ ---- ---- - -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 deleted file mode 100644 index 6041172..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_layouts/some_default.html +++ /dev/null @@ -1,11 +0,0 @@ ---- ---- - - - {% 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 deleted file mode 100644 index 22604a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2013-12-12-dec-the-second.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -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 deleted file mode 100644 index 76a8fc9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-02-march-the-second.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -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 deleted file mode 100644 index 216c372..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2014-03-04-march-the-fourth.md +++ /dev/null @@ -1,8 +0,0 @@ ---- -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 deleted file mode 100644 index f032a1b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-01-18-jekyll-last-modified-at.md +++ /dev/null @@ -1,5 +0,0 @@ ---- -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 deleted file mode 100644 index 7d7a373..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-02-12-strip-newlines.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -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 deleted file mode 100644 index 81aaeae..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-liquid.md +++ /dev/null @@ -1,7 +0,0 @@ ---- ---- - -{% 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 deleted file mode 100644 index 42b54b5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-12-pre.html +++ /dev/null @@ -1,8 +0,0 @@ ---- -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 deleted file mode 100644 index c4c42bd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-05-18-author-detail.md +++ /dev/null @@ -1,9 +0,0 @@ ---- -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 deleted file mode 100644 index a845151..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2015-08-08-stuck-in-the-middle.html +++ /dev/null @@ -1,2 +0,0 @@ ---- ---- 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 deleted file mode 100644 index f9a0f0c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/fixtures/_posts/2016-04-25-author-reference.md +++ /dev/null @@ -1,6 +0,0 @@ ---- -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 deleted file mode 100644 index e69de29..0000000 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 deleted file mode 100644 index 98ae904..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/jekyll-feed_spec.rb +++ /dev/null @@ -1,285 +0,0 @@ -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 deleted file mode 100644 index b926bd7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-feed-0.9.2/spec/spec_helper.rb +++ /dev/null @@ -1,28 +0,0 @@ -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-menus-0.6.0/Gemfile b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/Gemfile deleted file mode 100644 index 05ba4ba..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/Gemfile +++ /dev/null @@ -1,6 +0,0 @@ -source "https://rubygems.org" -gemspec - -group :development do - gem "pry" -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll-menus.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll-menus.rb deleted file mode 100644 index 539b3b8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll-menus.rb +++ /dev/null @@ -1,5 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -require "jekyll/menus" diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus.rb deleted file mode 100644 index 1dd15f0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus.rb +++ /dev/null @@ -1,237 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - class Menus - autoload :Utils, "jekyll/menus/utils" - autoload :Drops, "jekyll/menus/drops" - - def initialize(site) - @site = site - end - - # - - def menus - Utils.deep_merge(_data_menus, Utils.deep_merge( - _page_menus, _collection_menus - )) - end - - # - - def to_liquid_drop - Drops::All.new( - menus - ) - end - - # - - def _data_menus - out = {} - - if @site.data["menus"] && @site.data["menus"].is_a?(Hash) - then @site.data["menus"].each do |key, menu| - if menu.is_a?(Hash) || menu.is_a?(Array) - (menu = [menu].flatten).each do |item| - _validate_config_menu_item( - item - ) - - item["_frontmatter"] = false - end - - else - _throw_invalid_menu_entry( - menu - ) - end - - merge = { key => menu } - out = Utils.deep_merge( - out, merge - ) - end - end - - out - end - - # - - def _page_menus - out = {} - - @site.pages.select { |p| p.data.keys.grep(/menus?/).size > 0 }.each_with_object({}) do |page| - [page.data["menus"], page.data["menu"]].flatten.compact.map do |menu| - out = _front_matter_menu(menu, page, out) - end - end - - out - end - - # - - def _collection_menus - out = {} - - @site.collections.each do |collection, pages| - pages.docs.select { |p| p.data.keys.grep(/menus?/).size > 0 }.each_with_object({}) do |page| - [page.data["menus"], page.data["menu"]].flatten.compact.map do |menu| - out = _front_matter_menu(menu, page, out) - end - end - end - - out - end - - # - - def _front_matter_menu(menu, page, out={}) - # -- - # menu: key - # menu: - # - key1 - # - key2 - # -- - - if menu.is_a?(Array) || menu.is_a?(String) - _simple_front_matter_menu(menu, { - :mergeable => out, :page => page - }) - - # - - elsif menu.is_a?(Hash) - menu.each do |key, item| - out[key] ||= [] - - # -- - # menu: - # key: identifier - # -- - - if item.is_a?(String) - out[key] << _fill_front_matter_menu({ "identifier" => item }, { - :page => page - }) - - # -- - # menu: - # key: - # url: /url - # -- - - elsif item.is_a?(Hash) - out[key] << _fill_front_matter_menu(item, { - :page => page - }) - - # -- - # menu: - # key: - # - url: /url - # -- - - else - _throw_invalid_menu_entry( - item - ) - end - end - - # -- - # menu: - # key: 3 - # -- - - else - _throw_invalid_menu_entry( - menu - ) - end - - out - end - - # - - private - def _simple_front_matter_menu(menu, mergeable: nil, page: nil) - if menu.is_a?(Array) - then menu.each do |item| - if !item.is_a?(String) - _throw_invalid_menu_entry( - item - ) - - else - _simple_front_matter_menu(item, { - :mergeable => mergeable, :page => page - }) - end - end - - else - mergeable[menu] ||= [] - mergeable[menu] << _fill_front_matter_menu(nil, { - :page => page - }) - end - end - - # - - private - def _fill_front_matter_menu(val, page: nil) - raise ArgumentError, "Kwd 'page' is required." unless page - val ||= {} - - val["url"] ||= page.url - val["identifier"] ||= slug(page) - val["_frontmatter"] = page.relative_path # `page.url` can be changed with permalink frontmatter - val["title"] ||= page.data["title"] - val["weight"] ||= -1 - val - end - - # - - private - def slug(page) - ext = page.data["ext"] || page.ext - out = File.join(File.dirname(page.path), File.basename(page.path, ext)) - out.tr("^a-z0-9-_\\/", "").gsub(/\/|\-+/, "_").gsub( - /^_+/, "" - ) - end - - # - - private - def _validate_config_menu_item(item) - if !item.is_a?(Hash) || !item.values_at("url", "title", "identifier").compact.size == 3 - _throw_invalid_menu_entry( - item - ) - else - item["weight"] ||= -1 - end - end - - # - - private - def _throw_invalid_menu_entry(data) - raise RuntimeError, "Invalid menu item given: #{ - data.inspect - }" - end - end -end - -require "jekyll/menus/hook" diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops.rb deleted file mode 100644 index d6d2841..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops.rb +++ /dev/null @@ -1,13 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - class Menus - module Drops - autoload :Menu, "jekyll/menus/drops/menu" - autoload :All, "jekyll/menus/drops/all" - autoload :Item, "jekyll/menus/drops/item" - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/all.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/all.rb deleted file mode 100644 index 60a9afa..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/all.rb +++ /dev/null @@ -1,51 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - class Menus - module Drops - class All < Liquid::Drop - def initialize(menus) - @menus = menus - end - - # - - def find - to_a.find do |menu| - yield menu - end - end - - # - - def to_a - @menus.keys.map do |identifier| - self[ - identifier - ] - end - end - - # - - def each - to_a.each do |drop| - yield drop - end - end - - # - - def [](key) - if @menus.key?(key) - then Menu.new(@menus[key], - key, self - ) - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/item.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/item.rb deleted file mode 100644 index f407dde..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/item.rb +++ /dev/null @@ -1,71 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - class Menus - module Drops - class Item < Liquid::Drop - def initialize(item, parent) - @parent = parent - @item = - item - end - - # - - def children - out = @parent.find { |menu| menu.identifier == @item["identifier"] } - - if out - return out.to_a - end - end - - # - - def url - @item[ - "url" - ] - end - - # - - def title - @item[ - "title" - ] - end - - # - - def identifier - @item[ - "identifier" - ] - end - - # - - def weight - @item[ - "weight" - ] - end - - # - - def before_method(method) - if @item.has_key?(method.to_s) - return @item[ - method.to_s - ] - end - end - - alias_method :liquid_method_missing, :before_method - end - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/menu.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/menu.rb deleted file mode 100644 index 1936526..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/drops/menu.rb +++ /dev/null @@ -1,50 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - class Menus - module Drops - class Menu < Liquid::Drop - attr_reader :parent, :identifier, :menu - def initialize(menu, identifier, parent) - @parent = parent - @identifier = identifier - @menu = menu - end - - # - - def find - to_a.find do |item| - yield item - end - end - - # - - def select - to_a.select do |item| - yield item - end - end - - # - - def to_a - @menu.map { |item| Item.new(item, parent) }.sort_by( - &:weight - ) - end - - # - - def each - to_a.each do |drop| - yield drop - end - end - end - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/hook.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/hook.rb deleted file mode 100644 index 9e63242..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/hook.rb +++ /dev/null @@ -1,15 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - module Drops - class SiteDrop - attr_accessor :menus - end - end -end - -Jekyll::Hooks.register :site, :pre_render do |site, payload| - payload.site.menus = Jekyll::Menus.new(site).to_liquid_drop -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/utils.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/utils.rb deleted file mode 100644 index 5996e21..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/utils.rb +++ /dev/null @@ -1,24 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - class Menus - module Utils module_function - def deep_merge(old, _new) - return old | _new if old.is_a?(Array) - - old.merge(_new) do |_, o, n| - (o.is_a?(Hash) && n.is_a?(Hash)) || (o.is_a?(Array) && - n.is_a?(Array)) ? deep_merge(o, n) : n - end - end - - def deep_merge!(old, _new) - old.replace(deep_merge( - old, _new - )) - end - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/version.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/version.rb deleted file mode 100644 index 47b697d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-menus-0.6.0/lib/jekyll/menus/version.rb +++ /dev/null @@ -1,9 +0,0 @@ -# Frozen-string-literal: true -# Copyright: 2015 Forestry.io - MIT License -# Encoding: utf-8 - -module Jekyll - class Menus - VERSION = "0.6.0" - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter.rb deleted file mode 100644 index ed73199..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter.rb +++ /dev/null @@ -1,8 +0,0 @@ -# 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.2/lib/jekyll-sass-converter/version.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter/version.rb deleted file mode 100644 index 47e34f8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll-sass-converter/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -# frozen_string_literal: true - -module JekyllSassConverter - VERSION = "1.5.2".freeze -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/sass.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/sass.rb deleted file mode 100644 index 1124988..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/sass.rb +++ /dev/null @@ -1,22 +0,0 @@ -# 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.2/lib/jekyll/converters/scss.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/scss.rb deleted file mode 100644 index fe41cfe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-sass-converter-1.5.2/lib/jekyll/converters/scss.rb +++ /dev/null @@ -1,132 +0,0 @@ -# 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-1.5.1/lib/jekyll-watch.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll-watch.rb deleted file mode 100644 index 0f8b68b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll-watch.rb +++ /dev/null @@ -1,5 +0,0 @@ -# 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-1.5.1/lib/jekyll-watch/version.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll-watch/version.rb deleted file mode 100644 index 2976a32..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll-watch/version.rb +++ /dev/null @@ -1,7 +0,0 @@ -# frozen_string_literal: true - -module Jekyll - module Watch - VERSION = "1.5.1".freeze - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/commands/watch.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/commands/watch.rb deleted file mode 100644 index b92085c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/commands/watch.rb +++ /dev/null @@ -1,29 +0,0 @@ -# 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"] - watch(site, options) if options["watch"] - end - - # 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) - Jekyll::Watcher.watch(options) - end - - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/watcher.rb b/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/watcher.rb deleted file mode 100644 index 093f249..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/jekyll-watch-1.5.1/lib/jekyll/watcher.rb +++ /dev/null @@ -1,118 +0,0 @@ -# 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 - - # TODO: shouldn't be public API - def build_listener(site, options) - Listen.to( - options["source"], - :ignore => listen_ignore_paths(options), - :force_polling => options["force_polling"], - &listen_handler(site) - ) - end - - def listen_handler(site) - proc do |modified, added, removed| - t = Time.now - c = modified + added + removed - n = c.length - print Jekyll.logger.message("Regenerating:", - "#{n} file(s) changed at #{t.strftime("%Y-%m-%d %H:%M:%S")} ") - begin - site.process - puts "...done in #{Time.now - t} seconds." - rescue => e - puts "...error:" - Jekyll.logger.warn "Error:", e.message - Jekyll.logger.warn "Error:", "Run jekyll build --trace for more information." - end - end - end - - def custom_excludes(options) - Array(options["exclude"]).map { |e| Jekyll.sanitized_path(options["source"], e) } - end - - def config_files(options) - %w(yml yaml toml).map do |ext| - Jekyll.sanitized_path(options["source"], "_config.#{ext}") - end - end - - 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 - 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 - - def sleep_forever - loop { sleep 1000 } - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/AUTHORS b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/AUTHORS deleted file mode 100644 index 0583596..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/AUTHORS +++ /dev/null @@ -1 +0,0 @@ -The author of kramdown is Thomas Leitner . diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/CONTRIBUTERS b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/CONTRIBUTERS deleted file mode 100644 index 7ba1bad..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/CONTRIBUTERS +++ /dev/null @@ -1,65 +0,0 @@ - Count Name -======= ==== - 887 Thomas Leitner - 7 Christian Cornelssen - 6 Gioele Barabucci - 4 Ted Pak - 4 Shuanglei Tao - 4 Gleb Mazovetskiy - 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 Dan Allen - 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 milo.simpson - 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 Ashwin Maroli - 1 Ashe Connor - 1 Andrew - 1 Alpha Chen - 1 Alex Tomlins - 1 Alexey Vasiliev diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/COPYING b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/COPYING deleted file mode 100644 index 1c29282..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/COPYING +++ /dev/null @@ -1,30 +0,0 @@ -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.17.0/README.md b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/README.md deleted file mode 100644 index 139bf06..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# 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.17.0/Rakefile b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/Rakefile deleted file mode 100644 index 6113bfc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/Rakefile +++ /dev/null @@ -1,341 +0,0 @@ -# -*- 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.37' - s.add_development_dependency 'katex', '~> 0.4.3' - - #### 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 MathjaxNode availability" - task :test_mathjaxnode_deps do - html = %x{echo '$$a$$' | \ - #{RbConfig.ruby} -Ilib bin/kramdown --no-config-file --math-engine mathjaxnode} - raise (<\Z}m === html -The MathjaxNode engine is not available. Try "npm install mathjax-node-cli". -MJN - puts "MathjaxNode is available, and its default configuration works." - end - - desc "Update kramdown MathjaxNode test reference outputs" - task update_mathjaxnode_tests: [:test_mathjaxnode_deps] do - # Not framed in terms of rake file tasks to prevent accidental overwrites. - Dir['test/testcases/**/mathjaxnode*.text'].each do |f| - stem = f[0..-6] # Remove .text - ruby "-Ilib bin/kramdown --config-file #{stem}.options #{f} >#{stem}.html.19" - end - end - - desc "Check for SsKaTeX availability" - task :test_sskatex_deps do - katexjs = 'katex/katex.min.js' - raise (<#{stem}.html.19" - end - end - - desc "Update kramdown KaTeX test reference outputs" - task :update_katex_tests do - # Not framed in terms of rake file tasks to prevent accidental overwrites. - Dir['test/testcases/**/katex*.text'].each do |f| - stem = f[0..-6] # Remove .text - ruby "-Ilib bin/kramdown --config-file #{stem}.options #{f} >#{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.17.0/VERSION b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/VERSION deleted file mode 100644 index 092afa1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/VERSION +++ /dev/null @@ -1 +0,0 @@ -1.17.0 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/benchmark.rb b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/benchmark.rb deleted file mode 100644 index bad86af..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/benchmark.rb +++ /dev/null @@ -1,43 +0,0 @@ -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.17.0/benchmark/benchmark.sh b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/benchmark.sh deleted file mode 100755 index 3fe600c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/benchmark.sh +++ /dev/null @@ -1,74 +0,0 @@ -#!/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.17.0/benchmark/generate_data.rb b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/generate_data.rb deleted file mode 100644 index 762ebc3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/generate_data.rb +++ /dev/null @@ -1,119 +0,0 @@ -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 < -
  • Main
  • -
  • Basics
  • -
  • Syntax
  • -
  • License
  • -
  • Dingus
  • - - - -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.17.0/benchmark/mdsyntax.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/mdsyntax.text deleted file mode 100644 index 57360a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/mdsyntax.text +++ /dev/null @@ -1,888 +0,0 @@ -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.17.0/benchmark/testing.sh b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/testing.sh deleted file mode 100755 index 683afc8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/testing.sh +++ /dev/null @@ -1,12 +0,0 @@ -#!/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.17.0/benchmark/timing.sh b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/timing.sh deleted file mode 100755 index fc009a3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/benchmark/timing.sh +++ /dev/null @@ -1,10 +0,0 @@ -#!/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.17.0/bin/kramdown b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/bin/kramdown deleted file mode 100755 index 19798f2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/bin/kramdown +++ /dev/null @@ -1,104 +0,0 @@ -#!/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 = {} -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.separator "" - opts.on("--no-config-file", "Do not read any configuration file. Default behavior is to check " \ - "for a", "configuration file and read it if it exists.") {config_file = nil} - opts.on("--config-file FILE", "Specify the name of a configuration file with kramdown options " \ - "in YAML", "format, e.g. \"auto_id_prefix: ARG\" instead of \"--auto-id-prefix ARG\"", - "and \"auto_ids: false\" instead of \"--no-auto-ids\".", - "Default: #{config_file}") {|v| config_file = v} - opts.separator "" - 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 - if config_file && File.exist?(config_file) - config_file_options = YAML.safe_load(File.read(config_file), [Symbol]) - case config_file_options - when nil # empty configuration file except perhaps YAML header and comments - # Nothing to do - when Hash - options = config_file_options.merge(options) - else - raise Kramdown::Error, "No YAML map in configuration file \"#{config_file}\"" - end - end - 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.17.0/data/kramdown/document.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/data/kramdown/document.html deleted file mode 100644 index 731d0ea..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/data/kramdown/document.html +++ /dev/null @@ -1,22 +0,0 @@ - - - - <% 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.17.0/data/kramdown/document.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/data/kramdown/document.latex deleted file mode 100644 index acdf346..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/data/kramdown/document.latex +++ /dev/null @@ -1,50 +0,0 @@ -<% -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.17.0/doc/_design.scss b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/_design.scss deleted file mode 100644 index f665700..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/_design.scss +++ /dev/null @@ -1,441 +0,0 @@ -/* 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: scale-color($link-color, $lightness: -50%); - } -} - -/* 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.17.0/doc/bg.png b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/bg.png deleted file mode 100644 index b4df134dee0896f31dda02cc8773a68a263e771d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 56156 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 LNkvXXu0mjfZuDE* diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/default.scss b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/default.scss deleted file mode 100644 index f76dca4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/default.scss +++ /dev/null @@ -1,217 +0,0 @@ -@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.17.0/doc/default.template b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/default.template deleted file mode 100644 index 4cc5541..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/default.template +++ /dev/null @@ -1,62 +0,0 @@ - - - - - - - - - - - {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.17.0/doc/documentation.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/documentation.page deleted file mode 100644 index ebafaaf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/documentation.page +++ /dev/null @@ -1,84 +0,0 @@ ---- -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.17.0/doc/documentation.template b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/documentation.template deleted file mode 100644 index b83c2d7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/documentation.template +++ /dev/null @@ -1,36 +0,0 @@ ---- name:sidebar pipeline:erb,tags,kramdown - - -

    Documentation

    - -* Parsers - * [kramdown](parser/kramdown.html) - * [GFM](parser/gfm.html) - * [Markdown](parser/markdown.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 - * [Rouge](syntax_highlighter/rouge.html) - * [Coderay](syntax_highlighter/coderay.html) -* Math Engines - * [MathJax](math_engine/mathjax.html) - * [KaTeX](math_engine/katex.html) - * [SsKaTeX](math_engine/sskatex.html) - * [Mathjax-Node](math_engine/mathjaxnode.html) - * [Ritex](math_engine/ritex.html) - * [itex2MML](math_engine/itex2mml.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.17.0/doc/index.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/index.page deleted file mode 100644 index a5d16ee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/index.page +++ /dev/null @@ -1,113 +0,0 @@ ---- -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.17.0**{:itemprop="softwareVersion"} released on -**2018-05-31**{: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.17.0/doc/installation.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/installation.page deleted file mode 100644 index 179a1e9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/installation.page +++ /dev/null @@ -1,88 +0,0 @@ ---- -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.17.0/doc/links.markdown b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/links.markdown deleted file mode 100644 index 6baa05a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/links.markdown +++ /dev/null @@ -1,6 +0,0 @@ -[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.17.0/doc/metainfo b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/metainfo deleted file mode 100644 index 89ddeb2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/metainfo +++ /dev/null @@ -1,13 +0,0 @@ ---- paths -[/**/*.js, /**/*.css]: - modified_at_in_dest_path: true - -/**/*.scss: - modified_at_in_dest_path: true - ---- alcn -[converter/*.html, parser/*.html, documentation.en.html, options.en.html, tests.en.html]: - template: ../documentation.template - -/**/*.css: - pipeline: scss,cssminify diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/news.feed b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/news.feed deleted file mode 100644 index 84e611d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/news.feed +++ /dev/null @@ -1,9 +0,0 @@ ---- -title: kramdown News -description: kramdown - a fast, pure Ruby Markdown-superset converter -author: Thomas Leitner -author_url: https://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.17.0/doc/news.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/news.page deleted file mode 100644 index b0f7f42..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/news.page +++ /dev/null @@ -1,29 +0,0 @@ ---- -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.17.0/doc/options.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/options.page deleted file mode 100644 index 6b8bb48..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/options.page +++ /dev/null @@ -1,49 +0,0 @@ ---- -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.17.0/doc/quickref.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/quickref.page deleted file mode 100644 index eeeacfb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/quickref.page +++ /dev/null @@ -1,603 +0,0 @@ ---- -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.17.0/doc/sidebar.template b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/sidebar.template deleted file mode 100644 index 9702a40..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/sidebar.template +++ /dev/null @@ -1,22 +0,0 @@ -

    Support kramdown

    - -

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

    - -
    - -Become a Patron! - -
    - - - -
    - -
    - -

    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.17.0/doc/sitemap.sitemap b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/sitemap.sitemap deleted file mode 100644 index 1f19756..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/sitemap.sitemap +++ /dev/null @@ -1,5 +0,0 @@ ---- -entries: - alcn: /**/*.html -default_change_freq: monthly ---- diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/syntax.page b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/syntax.page deleted file mode 100644 index e8477a5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/doc/syntax.page +++ /dev/null @@ -1,1799 +0,0 @@ ---- -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.17.0/test/testcases/block/09_html/parse_as_raw.htmlinput b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.htmlinput deleted file mode 100644 index 22b9ea5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.htmlinput +++ /dev/null @@ -1,34 +0,0 @@ -

    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.17.0/test/testcases/block/09_html/parse_as_raw.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.options deleted file mode 100644 index a660da2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.options +++ /dev/null @@ -1 +0,0 @@ -:parse_block_html: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.text deleted file mode 100644 index e0617c4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_raw.text +++ /dev/null @@ -1,33 +0,0 @@ -

    baz { |qux| quux }

    - -This is some para. - - - - -

    *parsed* -This too -

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

    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.17.0/test/testcases/block/09_html/parse_as_span.htmlinput b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.htmlinput deleted file mode 100644 index 4199b8b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.htmlinput +++ /dev/null @@ -1,12 +0,0 @@ -

    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.17.0/test/testcases/block/09_html/parse_as_span.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.options deleted file mode 100644 index a660da2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.options +++ /dev/null @@ -1 +0,0 @@ -:parse_block_html: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.text deleted file mode 100644 index d07cf6d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_as_span.text +++ /dev/null @@ -1,9 +0,0 @@ -

    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.17.0/test/testcases/block/09_html/parse_block_html.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_block_html.html deleted file mode 100644 index 8de78c0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/parse_block_html.html +++ /dev/null @@ -1,21 +0,0 @@ -

    -

    test

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

    No matching end tag

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

    para

    - - -

    para

    - -

    other

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

    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.17.0/test/testcases/block/09_html/simple.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.html.19 deleted file mode 100644 index 0d926c5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.html.19 +++ /dev/null @@ -1,60 +0,0 @@ -
    -

    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.17.0/test/testcases/block/09_html/simple.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.options deleted file mode 100644 index a660da2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.options +++ /dev/null @@ -1 +0,0 @@ -:parse_block_html: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.text deleted file mode 100644 index a2ffe25..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/simple.text +++ /dev/null @@ -1,55 +0,0 @@ -
    -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.17.0/test/testcases/block/09_html/textarea.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/textarea.html deleted file mode 100644 index 6f5693e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/09_html/textarea.html +++ /dev/null @@ -1,8 +0,0 @@ -

    This is a

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

    Some paragraph

    - diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/10_ald/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/10_ald/simple.text deleted file mode 100644 index f58768a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/10_ald/simple.text +++ /dev/null @@ -1,8 +0,0 @@ -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.17.0/test/testcases/block/11_ial/auto_id_and_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/auto_id_and_ial.html deleted file mode 100644 index 9857a03..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/auto_id_and_ial.html +++ /dev/null @@ -1 +0,0 @@ -

    A header

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

    test

    -
    - -
    -

    para

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

    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.17.0/test/testcases/block/11_ial/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/simple.text deleted file mode 100644 index b97eef3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/11_ial/simple.text +++ /dev/null @@ -1,41 +0,0 @@ -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.17.0/test/testcases/block/12_extension/comment.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/comment.html deleted file mode 100644 index 20b4c66..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/comment.html +++ /dev/null @@ -1,8 +0,0 @@ -

    This is a simple paragraph.

    - - - -

    And another paragraph

    - -

    {::comment} -Another paragraph

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/comment.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/comment.text deleted file mode 100644 index 2dfc919..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/comment.text +++ /dev/null @@ -1,12 +0,0 @@ -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.17.0/test/testcases/block/12_extension/ignored.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/ignored.html deleted file mode 100644 index 17aae5c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/ignored.html +++ /dev/null @@ -1,8 +0,0 @@ -

    paragraph

    - -

    {::something} -anotherthing -{:/something}

    - -

    {::something/} -paragraph

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

    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.17.0/test/testcases/block/12_extension/nomarkdown.kramdown b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.kramdown deleted file mode 100644 index 2cee512..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.kramdown +++ /dev/null @@ -1,20 +0,0 @@ -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.17.0/test/testcases/block/12_extension/nomarkdown.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.latex deleted file mode 100644 index 5af0263..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.latex +++ /dev/null @@ -1,13 +0,0 @@ -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.17.0/test/testcases/block/12_extension/nomarkdown.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.text deleted file mode 100644 index 43d441d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/nomarkdown.text +++ /dev/null @@ -1,21 +0,0 @@ -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.17.0/test/testcases/block/12_extension/options.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options.html deleted file mode 100644 index d3567ec..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options.html +++ /dev/null @@ -1,21 +0,0 @@ -

    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.17.0/test/testcases/block/12_extension/options.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options.text deleted file mode 100644 index 5991ab7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options.text +++ /dev/null @@ -1,21 +0,0 @@ -# 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.17.0/test/testcases/block/12_extension/options2.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options2.html deleted file mode 100644 index 203d6eb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options2.html +++ /dev/null @@ -1,10 +0,0 @@ - -

    Some text1.

    - -
    -
      -
    1. -

      Some text. 

      -
    2. -
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options2.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options2.text deleted file mode 100644 index 78abfbe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options2.text +++ /dev/null @@ -1,5 +0,0 @@ -{::options footnote_nr="da10" /} - -Some text[^ab]. - -[^ab]: Some text. diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.html deleted file mode 100644 index 7434df6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.html +++ /dev/null @@ -1,7 +0,0 @@ -
    x = Class.new - -
    - -
    x = Class.new - -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.text deleted file mode 100644 index e0ee87c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/12_extension/options3.text +++ /dev/null @@ -1,7 +0,0 @@ - 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.17.0/test/testcases/block/13_definition_list/auto_ids.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/auto_ids.html deleted file mode 100644 index 398628a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/auto_ids.html +++ /dev/null @@ -1,15 +0,0 @@ -
    -
    item
    -
    def
    -
    item2
    -
    def
    -
    - -
    -
    item
    -
    def
    -
    item2
    -
    def
    -
    item3
    -
    def
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/auto_ids.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/auto_ids.text deleted file mode 100644 index f1797a7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/auto_ids.text +++ /dev/null @@ -1,18 +0,0 @@ -{: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.17.0/test/testcases/block/13_definition_list/definition_at_beginning.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/definition_at_beginning.html deleted file mode 100644 index 7c5cc04..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/definition_at_beginning.html +++ /dev/null @@ -1 +0,0 @@ -

    : no definition

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/definition_at_beginning.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/definition_at_beginning.text deleted file mode 100644 index cd3671b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/definition_at_beginning.text +++ /dev/null @@ -1 +0,0 @@ -: no definition diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.html deleted file mode 100644 index 3090b1e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.html +++ /dev/null @@ -1,4 +0,0 @@ -
    -
    item
    -
    definition
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.text deleted file mode 100644 index 587c3b0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/deflist_ial.text +++ /dev/null @@ -1,4 +0,0 @@ -{:.dl-horizontal} -item -: definition -{:.dl-other} diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/item_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/item_ial.html deleted file mode 100644 index 0ed1197..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/item_ial.html +++ /dev/null @@ -1,17 +0,0 @@ -
    -
    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.17.0/test/testcases/block/13_definition_list/item_ial.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/item_ial.text deleted file mode 100644 index 2058d74..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/item_ial.text +++ /dev/null @@ -1,16 +0,0 @@ -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.17.0/test/testcases/block/13_definition_list/multiple_terms.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/multiple_terms.html deleted file mode 100644 index e2e089b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/multiple_terms.html +++ /dev/null @@ -1,13 +0,0 @@ -
    -
    kram
    -
    down
    -
    now
    -
    definition 1
    -
    definition 2
    -
    -

    definition 3

    -
    -
    -

    definition 4

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

    This is a para -: and not a definition list

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

    definition

    -
    -
    definition
    -
    -

    definition

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

    para

    - -

    : no definition

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/too_much_space.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/too_much_space.text deleted file mode 100644 index 30ab445..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/too_much_space.text +++ /dev/null @@ -1,4 +0,0 @@ -para - - -: no definition diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/with_blocks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/with_blocks.html deleted file mode 100644 index 45b5865..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/with_blocks.html +++ /dev/null @@ -1,38 +0,0 @@ -
    -
    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.17.0/test/testcases/block/13_definition_list/with_blocks.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/with_blocks.text deleted file mode 100644 index 15195ce..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/13_definition_list/with_blocks.text +++ /dev/null @@ -1,24 +0,0 @@ -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.17.0/test/testcases/block/14_table/empty_tag_in_cell.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.html deleted file mode 100644 index af9b3e5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.html +++ /dev/null @@ -1,8 +0,0 @@ - - - - - - - -
    first line of cell
    second line of cell
    another cell
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.options deleted file mode 100644 index 63936b9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.options +++ /dev/null @@ -1 +0,0 @@ -:html_to_native: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.text deleted file mode 100644 index 60fec0b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/empty_tag_in_cell.text +++ /dev/null @@ -1 +0,0 @@ -| first line of cell
    second line of cell | another cell | diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/errors.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/errors.html deleted file mode 100644 index 302e97a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/errors.html +++ /dev/null @@ -1,12 +0,0 @@ -

    No table body

    - -

    |-|-|-

    - -

    |no|table|here|

    - -

    |no|table|here| -paragraph

    - -

    |-|-| -|-|-|

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

    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.17.0/test/testcases/block/14_table/escaping.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/escaping.text deleted file mode 100644 index a8a24d6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/escaping.text +++ /dev/null @@ -1,19 +0,0 @@ -`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.17.0/test/testcases/block/14_table/footer.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/footer.html deleted file mode 100644 index e6596ed..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/footer.html +++ /dev/null @@ -1,65 +0,0 @@ -

    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.17.0/test/testcases/block/14_table/footer.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/footer.text deleted file mode 100644 index faaed8d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/footer.text +++ /dev/null @@ -1,25 +0,0 @@ -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.17.0/test/testcases/block/14_table/header.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/header.html deleted file mode 100644 index 647f2c4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/header.html +++ /dev/null @@ -1,117 +0,0 @@ -

    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.17.0/test/testcases/block/14_table/header.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/header.text deleted file mode 100644 index 6961bfb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/header.text +++ /dev/null @@ -1,39 +0,0 @@ -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.17.0/test/testcases/block/14_table/no_table.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/no_table.html deleted file mode 100644 index dce46b1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/no_table.html +++ /dev/null @@ -1,3 +0,0 @@ -

    No table

    - -

    | Some | thing | here

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/no_table.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/no_table.text deleted file mode 100644 index 90f90b3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/no_table.text +++ /dev/null @@ -1,3 +0,0 @@ -No table - -\| Some \| thing \| here diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/simple.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/simple.html deleted file mode 100644 index 506b442..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/simple.html +++ /dev/null @@ -1,192 +0,0 @@ - - - - - - - - - - - - - - - - - - - -
    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.17.0/test/testcases/block/14_table/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/simple.text deleted file mode 100644 index 0f225a4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/simple.text +++ /dev/null @@ -1,53 +0,0 @@ -| 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.17.0/test/testcases/block/14_table/table_with_footnote.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.html deleted file mode 100644 index 0bf6781..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.html +++ /dev/null @@ -1,25 +0,0 @@ - - - - - - - - - - - -
    this is 1a table
    with afootnote
    - -
    -
      -
    1. -

      Something

      - -
      -

      special here

      -
      -

      -
    2. -
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.latex deleted file mode 100644 index 99b5312..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.latex +++ /dev/null @@ -1,11 +0,0 @@ -\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.17.0/test/testcases/block/14_table/table_with_footnote.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.text deleted file mode 100644 index 345fc5d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/14_table/table_with_footnote.text +++ /dev/null @@ -1,6 +0,0 @@ -| this is [^1] | a table -| with a | footnote - -[^1]: Something - - > special here diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.html deleted file mode 100644 index ab27b4b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.html +++ /dev/null @@ -1,2 +0,0 @@ - diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.text deleted file mode 100644 index 95252a7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/gh_128.text +++ /dev/null @@ -1 +0,0 @@ -$$ $$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.html deleted file mode 100644 index 214212a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.html +++ /dev/null @@ -1 +0,0 @@ -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.17.0/test/testcases/block/15_math/itex2mml.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.options deleted file mode 100644 index 953bdae..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: itex2mml diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.text deleted file mode 100644 index 23fe297..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/itex2mml.text +++ /dev/null @@ -1 +0,0 @@ -$$f(x) = a{x^3} + b{x^2} + cx + d$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.html.19 deleted file mode 100644 index 9e89673..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.html.19 +++ /dev/null @@ -1,2 +0,0 @@ -Δ=12∣abcdefghi∣\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.17.0/test/testcases/block/15_math/katex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.options deleted file mode 100644 index 108b265..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: :katex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.text deleted file mode 100644 index 2f18490..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/katex.text +++ /dev/null @@ -1,2 +0,0 @@ -$$\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.17.0/test/testcases/block/15_math/mathjax_preview.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview.html deleted file mode 100644 index 5ef3a83..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/mathjax_preview.html +++ /dev/null @@ -1,4 +0,0 @@ -

    This is a 5 + 5 statement

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

    This is a 5 + 5 statement

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

    This is a math statement

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

    This is a para. -

    - - - -

    -This is a para.

    - - - - - - - - - - - -
    $$5+5$$
    -
    - - - - - diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/normal.text deleted file mode 100644 index aa5984a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/normal.text +++ /dev/null @@ -1,30 +0,0 @@ -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.17.0/test/testcases/block/15_math/ritex.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.html deleted file mode 100644 index e9d61b5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.html +++ /dev/null @@ -1 +0,0 @@ -f(x)=ax3+bx2+cx+d diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.options deleted file mode 100644 index 0ef54eb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: ritex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.text deleted file mode 100644 index 23fe297..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/ritex.text +++ /dev/null @@ -1 +0,0 @@ -$$f(x) = a{x^3} + b{x^2} + cx + d$$ diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.html.19 deleted file mode 100644 index f1623a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.html.19 +++ /dev/null @@ -1,2 +0,0 @@ -Δ=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.17.0/test/testcases/block/15_math/sskatex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.options deleted file mode 100644 index 214a301..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: sskatex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.text deleted file mode 100644 index 2f18490..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/15_math/sskatex.text +++ /dev/null @@ -1,2 +0,0 @@ -$$\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.17.0/test/testcases/block/16_toc/no_toc.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/no_toc.html deleted file mode 100644 index bbb831e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/no_toc.html +++ /dev/null @@ -1,14 +0,0 @@ - -

    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.17.0/test/testcases/block/16_toc/no_toc.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/no_toc.text deleted file mode 100644 index 11ad829..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/no_toc.text +++ /dev/null @@ -1,16 +0,0 @@ -* 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.17.0/test/testcases/block/16_toc/toc_exclude.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.html deleted file mode 100644 index d352684..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.html +++ /dev/null @@ -1,35 +0,0 @@ -

    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.17.0/test/testcases/block/16_toc/toc_exclude.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.options deleted file mode 100644 index 8776b55..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.options +++ /dev/null @@ -1 +0,0 @@ -:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.text deleted file mode 100644 index d8f0b86..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_exclude.text +++ /dev/null @@ -1,19 +0,0 @@ -# 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.17.0/test/testcases/block/16_toc/toc_levels.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.html deleted file mode 100644 index e50a07c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.html +++ /dev/null @@ -1,24 +0,0 @@ - - -

    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.17.0/test/testcases/block/16_toc/toc_levels.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.options deleted file mode 100644 index bdfbeba..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.options +++ /dev/null @@ -1,2 +0,0 @@ -:toc_levels: 2..3 -:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.text deleted file mode 100644 index 1a62dea..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_levels.text +++ /dev/null @@ -1,16 +0,0 @@ -* 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.17.0/test/testcases/block/16_toc/toc_with_footnotes.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.html deleted file mode 100644 index a395a02..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.html +++ /dev/null @@ -1,13 +0,0 @@ - - -

    Header1 level 1

    - -
    -
      -
    1. -

      Some footnote content here 

      -
    2. -
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.options deleted file mode 100644 index 8776b55..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.options +++ /dev/null @@ -1 +0,0 @@ -:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.text deleted file mode 100644 index 5879ed5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_footnotes.text +++ /dev/null @@ -1,6 +0,0 @@ -* 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.17.0/test/testcases/block/16_toc/toc_with_links.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_links.html deleted file mode 100644 index ebde543..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/block/16_toc/toc_with_links.html +++ /dev/null @@ -1,8 +0,0 @@ -

    Header

    - -

    Header

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

    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.17.0/test/testcases/encoding.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/encoding.text deleted file mode 100644 index 65edf4b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/encoding.text +++ /dev/null @@ -1,28 +0,0 @@ -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.17.0/test/testcases/man/example.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/example.man deleted file mode 100644 index b1afee7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/example.man +++ /dev/null @@ -1,123 +0,0 @@ -.\" 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.17.0/test/testcases/man/example.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/example.text deleted file mode 100644 index 12b011b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/example.text +++ /dev/null @@ -1,85 +0,0 @@ -# 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.17.0/test/testcases/man/heading-name-dash-description.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-dash-description.man deleted file mode 100644 index 8e47527..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-dash-description.man +++ /dev/null @@ -1,4 +0,0 @@ -.\" generated by kramdown -.TH "NAME" "7" -.SH NAME -name \- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-dash-description.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-dash-description.text deleted file mode 100644 index 832c921..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-dash-description.text +++ /dev/null @@ -1 +0,0 @@ -# name -- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-description.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-description.man deleted file mode 100644 index e59dc5e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-description.man +++ /dev/null @@ -1,4 +0,0 @@ -.\" 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.17.0/test/testcases/man/heading-name-description.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-description.text deleted file mode 100644 index 941482c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-description.text +++ /dev/null @@ -1,2 +0,0 @@ -# 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.17.0/test/testcases/man/heading-name-section-description.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section-description.man deleted file mode 100644 index 8df4ff7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section-description.man +++ /dev/null @@ -1,4 +0,0 @@ -.\" generated by kramdown -.TH "NAME" "1" -.SH NAME -name \- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section-description.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section-description.text deleted file mode 100644 index 5f3e765..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section-description.text +++ /dev/null @@ -1 +0,0 @@ -# name(1) -- description diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.man deleted file mode 100644 index 7ca8757..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.man +++ /dev/null @@ -1,2 +0,0 @@ -.\" generated by kramdown -.TH "NAME" "1" diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.text deleted file mode 100644 index da98dbd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name-section.text +++ /dev/null @@ -1 +0,0 @@ -# name(1) diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.man deleted file mode 100644 index 8488496..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.man +++ /dev/null @@ -1,2 +0,0 @@ -.\" generated by kramdown -.TH "NAME" "7" diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.text deleted file mode 100644 index 5f4656a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/heading-name.text +++ /dev/null @@ -1 +0,0 @@ -# name diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.man deleted file mode 100644 index 14ab233..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.man +++ /dev/null @@ -1,4 +0,0 @@ -.\" generated by kramdown -.SH "NAME" -works -.SS "Sub section" diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.text deleted file mode 100644 index d1f5f86..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/sections.text +++ /dev/null @@ -1,11 +0,0 @@ -## NAME - -works - -### Sub section - -#### Ignored - -##### Ignored - -###### Ignored diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/text-escaping.man b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/text-escaping.man deleted file mode 100644 index 710a4f1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/text-escaping.man +++ /dev/null @@ -1,8 +0,0 @@ -.\" 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.17.0/test/testcases/man/text-escaping.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/text-escaping.text deleted file mode 100644 index 052b94f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/man/text-escaping.text +++ /dev/null @@ -1,7 +0,0 @@ -. 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.17.0/test/testcases/span/01_link/empty.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty.html deleted file mode 100644 index a1102ea..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty.html +++ /dev/null @@ -1,5 +0,0 @@ -

    This is [] empty.

    - -

    This is [][] empty.

    - -

    This is empty.

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

    Image with empty title: alt text

    - -

    Link reference with empty title.

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty_title.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty_title.text deleted file mode 100644 index baabe7d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/empty_title.text +++ /dev/null @@ -1,7 +0,0 @@ -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.17.0/test/testcases/span/01_link/image_in_a.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/image_in_a.html deleted file mode 100644 index e1f4ade..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/image_in_a.html +++ /dev/null @@ -1,5 +0,0 @@ -

    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.17.0/test/testcases/span/01_link/image_in_a.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/image_in_a.text deleted file mode 100644 index bdbfb65..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/image_in_a.text +++ /dev/null @@ -1,5 +0,0 @@ -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.17.0/test/testcases/span/01_link/imagelinks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/imagelinks.html deleted file mode 100644 index 565d36f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/imagelinks.html +++ /dev/null @@ -1,15 +0,0 @@ -

    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.17.0/test/testcases/span/01_link/imagelinks.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/imagelinks.text deleted file mode 100644 index 05050a2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/imagelinks.text +++ /dev/null @@ -1,18 +0,0 @@ -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.17.0/test/testcases/span/01_link/inline.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.html deleted file mode 100644 index 0810bc7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.html +++ /dev/null @@ -1,46 +0,0 @@ -

    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.17.0/test/testcases/span/01_link/inline.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.html.19 deleted file mode 100644 index 8d00efa..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.html.19 +++ /dev/null @@ -1,46 +0,0 @@ -

    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.17.0/test/testcases/span/01_link/inline.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.text deleted file mode 100644 index c705764..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/inline.text +++ /dev/null @@ -1,48 +0,0 @@ -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.17.0/test/testcases/span/01_link/latex_escaping.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/latex_escaping.latex deleted file mode 100644 index 63e58e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/latex_escaping.latex +++ /dev/null @@ -1,6 +0,0 @@ -\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.17.0/test/testcases/span/01_link/latex_escaping.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/latex_escaping.text deleted file mode 100644 index 9b27ae8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/latex_escaping.text +++ /dev/null @@ -1,5 +0,0 @@ - - - - - diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs.html deleted file mode 100644 index 15e2ca7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs.html +++ /dev/null @@ -1,9 +0,0 @@ -

    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.17.0/test/testcases/span/01_link/link_defs.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs.text deleted file mode 100644 index 16a25b5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs.text +++ /dev/null @@ -1,27 +0,0 @@ -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.17.0/test/testcases/span/01_link/link_defs_with_ial.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs_with_ial.html deleted file mode 100644 index f56d77d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs_with_ial.html +++ /dev/null @@ -1,4 +0,0 @@ -

    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.17.0/test/testcases/span/01_link/link_defs_with_ial.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs_with_ial.text deleted file mode 100644 index 59398a3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/link_defs_with_ial.text +++ /dev/null @@ -1,16 +0,0 @@ -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.17.0/test/testcases/span/01_link/links_with_angle_brackets.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/links_with_angle_brackets.html deleted file mode 100644 index ecaa31e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/links_with_angle_brackets.html +++ /dev/null @@ -1,3 +0,0 @@ -

    This is a link.

    - -

    This is a link.

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

    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.17.0/test/testcases/span/01_link/reference.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.html.19 deleted file mode 100644 index f6fed18..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.html.19 +++ /dev/null @@ -1,37 +0,0 @@ - -

    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.17.0/test/testcases/span/01_link/reference.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.options deleted file mode 100644 index efb4b01..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.options +++ /dev/null @@ -1,3 +0,0 @@ -:link_defs: - predefined: [predefined.html] - URI: [uri.html, My URI] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.text deleted file mode 100644 index 9f39fa7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/01_link/reference.text +++ /dev/null @@ -1,53 +0,0 @@ -[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.17.0/test/testcases/span/02_emphasis/empty.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/empty.html deleted file mode 100644 index 127e694..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/empty.html +++ /dev/null @@ -1,3 +0,0 @@ -

    This __is **empty.

    - -

    This **is empty.

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

    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.17.0/test/testcases/span/02_emphasis/errors.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/errors.text deleted file mode 100644 index e80e5eb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/errors.text +++ /dev/null @@ -1,9 +0,0 @@ -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.17.0/test/testcases/span/02_emphasis/nesting.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/nesting.html deleted file mode 100644 index 3d34cee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/nesting.html +++ /dev/null @@ -1,41 +0,0 @@ -
      -
    • 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.17.0/test/testcases/span/02_emphasis/nesting.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/nesting.text deleted file mode 100644 index ba67e84..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/nesting.text +++ /dev/null @@ -1,36 +0,0 @@ -- ***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.17.0/test/testcases/span/02_emphasis/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.html deleted file mode 100644 index ca53cfe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.html +++ /dev/null @@ -1,61 +0,0 @@ -

    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.17.0/test/testcases/span/02_emphasis/normal.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.options deleted file mode 100644 index 2e6e0a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.options +++ /dev/null @@ -1 +0,0 @@ -:entity_output: :numeric diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.text deleted file mode 100644 index ab30913..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/02_emphasis/normal.text +++ /dev/null @@ -1,59 +0,0 @@ -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.17.0/test/testcases/span/03_codespan/empty.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/empty.html deleted file mode 100644 index 20c5051..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/empty.html +++ /dev/null @@ -1,5 +0,0 @@ -

    This is `` empty.

    - -

    This is ``empty.

    - -

    This is ````empty.

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

    Not ended `span.

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

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

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

    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.17.0/test/testcases/span/03_codespan/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/normal.text deleted file mode 100644 index 10d06e2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/normal.text +++ /dev/null @@ -1,16 +0,0 @@ -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.17.0/test/testcases/span/03_codespan/rouge/disabled.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/disabled.html deleted file mode 100644 index 7822f78..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/03_codespan/rouge/disabled.html +++ /dev/null @@ -1 +0,0 @@ -

    You can say Class.

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

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

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

    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.17.0/test/testcases/span/04_footnote/backlink_inline.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.options deleted file mode 100644 index ac54fc0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.options +++ /dev/null @@ -1 +0,0 @@ -footnote_backlink_inline: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.text deleted file mode 100644 index 55f94a3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_inline.text +++ /dev/null @@ -1,38 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/backlink_text.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_text.html deleted file mode 100644 index dc66dc8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/backlink_text.html +++ /dev/null @@ -1,9 +0,0 @@ -

    Some footnote here1

    - -
    -
      -
    1. -

      Some text here text &8617; <img />

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

    Some para.

    - -
    -

    blockquote

    -
    - -
      -
    • a list -with some text
    • -
    - -
      -
    • other list
    • -
    -
    code
    -
    - diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.latex deleted file mode 100644 index 965653c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.latex +++ /dev/null @@ -1,17 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/definitions.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.text deleted file mode 100644 index 44b52e0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/definitions.text +++ /dev/null @@ -1,24 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/footnote_nr.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.html deleted file mode 100644 index bbd8eac..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.html +++ /dev/null @@ -1,12 +0,0 @@ -

    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.17.0/test/testcases/span/04_footnote/footnote_nr.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.latex deleted file mode 100644 index 8f07dde..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.latex +++ /dev/null @@ -1,2 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/footnote_nr.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.options deleted file mode 100644 index f606ecf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.options +++ /dev/null @@ -1 +0,0 @@ -:footnote_nr: 35 diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.text deleted file mode 100644 index cad2935..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/footnote_nr.text +++ /dev/null @@ -1,4 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/inside_footnote.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/inside_footnote.html deleted file mode 100644 index 26ce52e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/inside_footnote.html +++ /dev/null @@ -1,17 +0,0 @@ -

    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.17.0/test/testcases/span/04_footnote/inside_footnote.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/inside_footnote.text deleted file mode 100644 index f4f91e9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/inside_footnote.text +++ /dev/null @@ -1,9 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/markers.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.html deleted file mode 100644 index d4c45d7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.html +++ /dev/null @@ -1,46 +0,0 @@ -

    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.17.0/test/testcases/span/04_footnote/markers.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.latex deleted file mode 100644 index 8f406b8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.latex +++ /dev/null @@ -1,23 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/markers.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.options deleted file mode 100644 index 5cfe250..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.options +++ /dev/null @@ -1,2 +0,0 @@ -:auto_ids: false -:entity_output: :symbolic diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.text deleted file mode 100644 index 42b77fb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/markers.text +++ /dev/null @@ -1,27 +0,0 @@ -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.17.0/test/testcases/span/04_footnote/placement.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.html deleted file mode 100644 index 997ef26..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.html +++ /dev/null @@ -1,11 +0,0 @@ -
    -
      -
    1. -

      Footnote \` text 

      -
    2. -
    -
    - -

    Some para with a1 footnote.

    - -

    And another para.

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.options deleted file mode 100644 index 2e6e0a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.options +++ /dev/null @@ -1 +0,0 @@ -:entity_output: :numeric diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.text deleted file mode 100644 index 97c0ab1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/placement.text +++ /dev/null @@ -1,8 +0,0 @@ -* 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.17.0/test/testcases/span/04_footnote/regexp_problem.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/regexp_problem.html deleted file mode 100644 index d246a37..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/04_footnote/regexp_problem.html +++ /dev/null @@ -1,14 +0,0 @@ -

    Something

    -

    something1.

    - -

    Footnotes

    - -

    Test

    -
    -
      -
    1. - -

      A note 

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

    Some footnote here1

    - -
    -
      -
    1. -

      Some text here

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

    Link: test

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

    - -

    First some text and then a

    - -

    and then text.

    - -

    A it.

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

    This is some text

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

    Link: text

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

    Lorem ipsum.

    - -

    Test

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

    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.17.0/test/testcases/span/05_html/markdown_attr.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/markdown_attr.text deleted file mode 100644 index dcc10ff..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/markdown_attr.text +++ /dev/null @@ -1,6 +0,0 @@ -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.17.0/test/testcases/span/05_html/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/normal.html deleted file mode 100644 index 0da5f26..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/normal.html +++ /dev/null @@ -1,43 +0,0 @@ -

    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.17.0/test/testcases/span/05_html/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/normal.text deleted file mode 100644 index 0156d7c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/normal.text +++ /dev/null @@ -1,43 +0,0 @@ -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.17.0/test/testcases/span/05_html/raw_span_elements.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/raw_span_elements.html deleted file mode 100644 index 808f1db..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/05_html/raw_span_elements.html +++ /dev/null @@ -1,2 +0,0 @@ -

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

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

    This doit test

    - -

    This doit test

    - -

    This doit</some> test

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

    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.17.0/test/testcases/span/abbreviations/abbrev.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev.text deleted file mode 100644 index 1aa8100..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev.text +++ /dev/null @@ -1,34 +0,0 @@ -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.17.0/test/testcases/span/abbreviations/abbrev_defs.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev_defs.html deleted file mode 100644 index 108fcfc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev_defs.html +++ /dev/null @@ -1,2 +0,0 @@ -
    *[4]: noabbrev
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev_defs.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev_defs.text deleted file mode 100644 index 3f3a0e5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/abbrev_defs.text +++ /dev/null @@ -1,5 +0,0 @@ -*[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.17.0/test/testcases/span/abbreviations/in_footnote.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/in_footnote.html deleted file mode 100644 index f4f6ea4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/in_footnote.html +++ /dev/null @@ -1,9 +0,0 @@ -

    There is a TXT file here. 1

    - -
    -
      -
    1. -

      A TXT file. 

      -
    2. -
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/in_footnote.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/in_footnote.text deleted file mode 100644 index e7709cb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/abbreviations/in_footnote.text +++ /dev/null @@ -1,5 +0,0 @@ -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.17.0/test/testcases/span/autolinks/url_links.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/autolinks/url_links.html deleted file mode 100644 index 90eae7d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/autolinks/url_links.html +++ /dev/null @@ -1,15 +0,0 @@ -

    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.17.0/test/testcases/span/autolinks/url_links.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/autolinks/url_links.text deleted file mode 100644 index 033e8af..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/autolinks/url_links.text +++ /dev/null @@ -1,16 +0,0 @@ -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.17.0/test/testcases/span/escaped_chars/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/escaped_chars/normal.html deleted file mode 100644 index 015d594..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/escaped_chars/normal.html +++ /dev/null @@ -1,47 +0,0 @@ -

    \

    - -

    .

    - -

    *

    - -

    _

    - -

    +

    - -

    -

    - -

    `

    - -

    (

    - -

    )

    - -

    [

    - -

    ]

    - -

    {

    - -

    }

    - -

    #

    - -

    !

    - -

    <<

    - -

    >>

    - -

    :

    - -

    |

    - -

    "

    - -

    '

    - -

    =

    - -

    >

    - -

    <

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

    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.17.0/test/testcases/span/extension/comment.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/comment.text deleted file mode 100644 index 8b9e8d3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/comment.text +++ /dev/null @@ -1,6 +0,0 @@ -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.17.0/test/testcases/span/extension/ignored.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/ignored.html deleted file mode 100644 index 63c2c40..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/extension/ignored.html +++ /dev/null @@ -1 +0,0 @@ -

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

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

    This is *some* text.

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

    This is an option *true*!

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

    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.17.0/test/testcases/span/ial/simple.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/ial/simple.text deleted file mode 100644 index 8945602..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/ial/simple.text +++ /dev/null @@ -1,6 +0,0 @@ -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.17.0/test/testcases/span/line_breaks/normal.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.html deleted file mode 100644 index 11066a5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.html +++ /dev/null @@ -1,11 +0,0 @@ -

    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.17.0/test/testcases/span/line_breaks/normal.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.latex deleted file mode 100644 index a62ff56..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.latex +++ /dev/null @@ -1,12 +0,0 @@ -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.17.0/test/testcases/span/line_breaks/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.text deleted file mode 100644 index 92f866f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/line_breaks/normal.text +++ /dev/null @@ -1,11 +0,0 @@ -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.17.0/test/testcases/span/math/itex2mml.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.html deleted file mode 100644 index 4e195d1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.html +++ /dev/null @@ -1 +0,0 @@ -

    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.17.0/test/testcases/span/math/itex2mml.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.options deleted file mode 100644 index 953bdae..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: itex2mml diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.text deleted file mode 100644 index 3e20b55..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/itex2mml.text +++ /dev/null @@ -1 +0,0 @@ -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.17.0/test/testcases/span/math/katex.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.html.19 deleted file mode 100644 index 7317df2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.html.19 +++ /dev/null @@ -1 +0,0 @@ -

    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.17.0/test/testcases/span/math/katex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.options deleted file mode 100644 index 108b265..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: :katex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.text deleted file mode 100644 index 94af230..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/katex.text +++ /dev/null @@ -1 +0,0 @@ -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.17.0/test/testcases/span/math/mathjaxnode.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.html.19 deleted file mode 100644 index df82f90..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.html.19 +++ /dev/null @@ -1,27 +0,0 @@ -

    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.17.0/test/testcases/span/math/mathjaxnode.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.options deleted file mode 100644 index adc27e8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: mathjaxnode diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.text deleted file mode 100644 index 3e20b55..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/mathjaxnode.text +++ /dev/null @@ -1 +0,0 @@ -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.17.0/test/testcases/span/math/no_engine.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/no_engine.html deleted file mode 100644 index 3b93c54..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/no_engine.html +++ /dev/null @@ -1 +0,0 @@ -

    $5+5$ inline math

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

    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.17.0/test/testcases/span/math/normal.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/normal.text deleted file mode 100644 index e37a007..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/normal.text +++ /dev/null @@ -1,10 +0,0 @@ -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.17.0/test/testcases/span/math/ritex.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.html deleted file mode 100644 index 60ba8fe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.html +++ /dev/null @@ -1 +0,0 @@ -

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

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.options deleted file mode 100644 index 0ef54eb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: ritex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.text deleted file mode 100644 index 3e20b55..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/ritex.text +++ /dev/null @@ -1 +0,0 @@ -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.17.0/test/testcases/span/math/sskatex.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.html.19 deleted file mode 100644 index 7317df2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.html.19 +++ /dev/null @@ -1 +0,0 @@ -

    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.17.0/test/testcases/span/math/sskatex.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.options deleted file mode 100644 index 214a301..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.options +++ /dev/null @@ -1 +0,0 @@ -:math_engine: sskatex diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.text deleted file mode 100644 index 94af230..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/math/sskatex.text +++ /dev/null @@ -1 +0,0 @@ -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.17.0/test/testcases/span/text_substitutions/entities.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.html deleted file mode 100644 index 96b3b5c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.html +++ /dev/null @@ -1,6 +0,0 @@ -

    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.17.0/test/testcases/span/text_substitutions/entities.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.options deleted file mode 100644 index 036c561..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.options +++ /dev/null @@ -1 +0,0 @@ -:entity_output: :as_input diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.text deleted file mode 100644 index 0446f4c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities.text +++ /dev/null @@ -1,6 +0,0 @@ -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.17.0/test/testcases/span/text_substitutions/entities_as_char.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_char.html deleted file mode 100644 index 7507f75..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/entities_as_char.html +++ /dev/null @@ -1 +0,0 @@ -

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

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

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

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

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

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

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

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

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

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

    2 > 1 > 0

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

    0 < 1 < 2

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

    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.17.0/test/testcases/span/text_substitutions/typography.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.options deleted file mode 100644 index 4f1c17c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.options +++ /dev/null @@ -1 +0,0 @@ -:entity_output: symbolic diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.text deleted file mode 100644 index 27e090e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography.text +++ /dev/null @@ -1,40 +0,0 @@ -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.17.0/test/testcases/span/text_substitutions/typography_subst.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.html deleted file mode 100644 index 4a6c226..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.html +++ /dev/null @@ -1,3 +0,0 @@ -

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

    - -

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

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.latex b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.latex deleted file mode 100644 index c7d9ba5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.latex +++ /dev/null @@ -1,4 +0,0 @@ -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.17.0/test/testcases/span/text_substitutions/typography_subst.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.options deleted file mode 100644 index d0a0313..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.options +++ /dev/null @@ -1,8 +0,0 @@ -typographic_symbols: - hellip: '...' - mdash: '---' - ndash: '--' - laquo: '<<' - raquo: '>>' - laquo_space: '<< ' - raquo_space: ' >>' diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.text deleted file mode 100644 index a3d59b3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases/span/text_substitutions/typography_subst.text +++ /dev/null @@ -1,3 +0,0 @@ -This ... something---this too--! - -This <> some text, << this >> too! diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.html deleted file mode 100644 index 776d7a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.html +++ /dev/null @@ -1,3 +0,0 @@ -

    header

    - -

    #no header

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.text deleted file mode 100644 index 5e70e2b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/atx_header.text +++ /dev/null @@ -1,3 +0,0 @@ -# header - -#no header diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.html deleted file mode 100644 index 8390d09..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.html +++ /dev/null @@ -1,2 +0,0 @@ -
    Kramdown::Document.new(text, :input => 'GFM')
    -
    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.options deleted file mode 100644 index 72e9bc1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.options +++ /dev/null @@ -1 +0,0 @@ -:enable_coderay: false diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.text deleted file mode 100644 index 98cf3a8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_disable_highlighting.text +++ /dev/null @@ -1,3 +0,0 @@ -```ruby -Kramdown::Document.new(text, :input => 'GFM') -``` diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_syntax.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_syntax.html deleted file mode 100644 index 8c1079d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_syntax.html +++ /dev/null @@ -1,20 +0,0 @@ -
    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.17.0/test/testcases_gfm/backticks_syntax.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_syntax.text deleted file mode 100644 index fb5c611..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/backticks_syntax.text +++ /dev/null @@ -1,19 +0,0 @@ -``` -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.17.0/test/testcases_gfm/codeblock_fenced.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.html deleted file mode 100644 index 0bdefdc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.html +++ /dev/null @@ -1,20 +0,0 @@ -

    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.17.0/test/testcases_gfm/codeblock_fenced.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.options deleted file mode 100644 index 72e9bc1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.options +++ /dev/null @@ -1 +0,0 @@ -:enable_coderay: false diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.text deleted file mode 100644 index 5e3e192..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/codeblock_fenced.text +++ /dev/null @@ -1,21 +0,0 @@ -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.17.0/test/testcases_gfm/hard_line_breaks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/hard_line_breaks.html deleted file mode 100644 index 1dfb2f0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/hard_line_breaks.html +++ /dev/null @@ -1,3 +0,0 @@ -

    one
    -two
    -three

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

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

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

    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.17.0/test/testcases_gfm/header_ids.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.html.19 deleted file mode 100644 index b45fe8f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.html.19 +++ /dev/null @@ -1,27 +0,0 @@ -

    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.17.0/test/testcases_gfm/header_ids.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.options deleted file mode 100644 index 8776b55..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.options +++ /dev/null @@ -1 +0,0 @@ -:auto_ids: true diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.text deleted file mode 100644 index 0a89c0b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids.text +++ /dev/null @@ -1,27 +0,0 @@ -### 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.17.0/test/testcases_gfm/header_ids_with_prefix.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids_with_prefix.html deleted file mode 100644 index 4aab072..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/header_ids_with_prefix.html +++ /dev/null @@ -1,3 +0,0 @@ -

    Header 1

    - -

    123

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

    Header with --ndash

    - -

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

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

    Header with --ndash

    - -

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

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

    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.17.0/test/testcases_gfm/paragraph_end-disabled.options b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.options deleted file mode 100644 index 704f643..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.options +++ /dev/null @@ -1 +0,0 @@ -:gfm_quirks: [] diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.text deleted file mode 100644 index 4e09e03..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end-disabled.text +++ /dev/null @@ -1,27 +0,0 @@ -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.17.0/test/testcases_gfm/paragraph_end.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end.html deleted file mode 100644 index c337d61..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end.html +++ /dev/null @@ -1,38 +0,0 @@ -

    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.17.0/test/testcases_gfm/paragraph_end.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end.text deleted file mode 100644 index 4e09e03..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/paragraph_end.text +++ /dev/null @@ -1,27 +0,0 @@ -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.17.0/test/testcases_gfm/strikethrough.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.html deleted file mode 100644 index dad32ab..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.html +++ /dev/null @@ -1,27 +0,0 @@ -

    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.17.0/test/testcases_gfm/strikethrough.html.19 b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.html.19 deleted file mode 100644 index ed28995..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.html.19 +++ /dev/null @@ -1,27 +0,0 @@ -

    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.17.0/test/testcases_gfm/strikethrough.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.text deleted file mode 100644 index fbeffc6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/strikethrough.text +++ /dev/null @@ -1,27 +0,0 @@ -~~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.17.0/test/testcases_gfm/task_list.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/task_list.html deleted file mode 100644 index a11b553..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/task_list.html +++ /dev/null @@ -1,40 +0,0 @@ -

    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.17.0/test/testcases_gfm/task_list.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/task_list.text deleted file mode 100644 index f6ade2f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/task_list.text +++ /dev/null @@ -1,26 +0,0 @@ -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.17.0/test/testcases_gfm/two_para_hard_line_breaks.html b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/two_para_hard_line_breaks.html deleted file mode 100644 index d5ba2e4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/two_para_hard_line_breaks.html +++ /dev/null @@ -1,4 +0,0 @@ -

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

    - -

    Another paragraph.

    diff --git a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/two_para_hard_line_breaks.text b/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/two_para_hard_line_breaks.text deleted file mode 100644 index 6b3d7c5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/kramdown-1.17.0/test/testcases_gfm/two_para_hard_line_breaks.text +++ /dev/null @@ -1,4 +0,0 @@ -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.1/History.md b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/History.md deleted file mode 100644 index 2dc8f3d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/History.md +++ /dev/null @@ -1,235 +0,0 @@ -# Liquid Change Log - -## 4.0.0 / 2016-12-14 / branch "4-0-stable" - -### 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 `liquid_methods` (See https://github.com/Shopify/liquid/pull/568 for replacement) -* Liquid::Template.register_filter raises when the module overrides registered public methods as private or protected (#705) [Gaurav Chande] - -### Fixed - -* Fix variable names being detected as an operator when starting with contains (#788) [Michael Angell] -* Fix include tag used with strict_variables (#828) [QuickPay] -* 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.1/LICENSE b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/LICENSE deleted file mode 100644 index 926b04e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/LICENSE +++ /dev/null @@ -1,20 +0,0 @@ -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.1/README.md b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/README.md deleted file mode 100644 index 77e9ff4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/README.md +++ /dev/null @@ -1,108 +0,0 @@ -[![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 - -Install Liquid by adding `gem 'liquid'` to your gemfile. - -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.1/lib/liquid.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid.rb deleted file mode 100644 index 7d9da26..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid.rb +++ /dev/null @@ -1,79 +0,0 @@ -# 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.1/lib/liquid/block.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/block.rb deleted file mode 100644 index 00c59b2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/block.rb +++ /dev/null @@ -1,77 +0,0 @@ -module Liquid - class Block < Tag - MAX_DEPTH = 100 - - 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) - if tag == 'else'.freeze - raise SyntaxError.new(parse_context.locale.t("errors.syntax.unexpected_else".freeze, - block_name: block_name)) - elsif tag.start_with?('end'.freeze) - raise SyntaxError.new(parse_context.locale.t("errors.syntax.invalid_delimiter".freeze, - tag: tag, - 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) - if parse_context.depth >= MAX_DEPTH - raise StackLevelError, "Nesting too deep".freeze - end - parse_context.depth += 1 - begin - 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 - ensure - parse_context.depth -= 1 - end - - true - end - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/block_body.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/block_body.rb deleted file mode 100644 index 266d8ed..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/block_body.rb +++ /dev/null @@ -1,142 +0,0 @@ -module Liquid - class BlockBody - FullToken = /\A#{TagStart}#{WhitespaceControl}?\s*(\w+)\s*(.*?)#{WhitespaceControl}?#{TagEnd}\z/om - ContentOfVariable = /\A#{VariableStart}#{WhitespaceControl}?(.*?)#{WhitespaceControl}?#{VariableEnd}\z/om - WhitespaceOrNothing = /\A\s*\z/ - 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 - next if token.empty? - case - when token.start_with?(TAGSTART) - whitespace_handler(token, parse_context) - unless token =~ FullToken - raise_missing_tag_terminator(token, parse_context) - end - tag_name = $1 - markup = $2 - # fetch the tag from registered blocks - unless tag = registered_tags[tag_name] - # end parsing if we reach an unknown tag and let the caller decide - # determine how to proceed - return yield tag_name, markup - end - new_tag = tag.parse(tag_name, markup, tokenizer, parse_context) - @blank &&= new_tag.blank? - @nodelist << new_tag - 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 =~ WhitespaceOrNothing) - 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 - - idx = 0 - while node = @nodelist[idx] - case node - when String - check_resources(context, node) - output << node - when Variable - render_node_to_output(node, output, context) - when Block - render_node_to_output(node, output, context, node.blank?) - break if context.interrupt? # might have happened in a for-block - when Continue, Break - # 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 %} - context.push_interrupt(node.interrupt) - break - else # Other non-Block tags - render_node_to_output(node, output, context) - end - idx += 1 - end - - output.join - end - - private - - def render_node_to_output(node, output, context, skip_output = false) - node_output = node.render(context) - node_output = node_output.is_a?(Array) ? node_output.join : node_output.to_s - check_resources(context, node_output) - output << node_output unless skip_output - rescue MemoryError => e - raise e - rescue UndefinedVariable, UndefinedDropMethod, UndefinedFilter => e - context.handle_error(e, node.line_number) - output << nil - rescue ::StandardError => e - line_number = node.is_a?(String) ? nil : node.line_number - output << context.handle_error(e, line_number) - end - - def check_resources(context, node_output) - context.resource_limits.render_length += node_output.length - return unless context.resource_limits.reached? - raise MemoryError.new("Memory limits exceeded".freeze) - 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.1/lib/liquid/condition.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/condition.rb deleted file mode 100644 index 3e79849..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/condition.rb +++ /dev/null @@ -1,142 +0,0 @@ -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) - condition = self - result = nil - loop do - result = interpret_condition(condition.left, condition.right, condition.operator, context) - - case condition.child_relation - when :or - break if result - when :and - break unless result - else - break - end - condition = condition.child_condition - end - result - 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 - - protected - - attr_reader :child_relation, :child_condition - - 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) && !left.is_a?(Hash) && !right.is_a?(Hash) - 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.1/lib/liquid/context.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/context.rb deleted file mode 100644 index 2dcc6af..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/context.rb +++ /dev/null @@ -1,226 +0,0 @@ -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) - 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 > Block::MAX_DEPTH - 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, raise_on_not_found: true) - # 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, raise_on_not_found: raise_on_not_found) - # When lookup returned a value OR there is no value but the lookup also did not raise - # then it is the value we are looking for. - if !variable.nil? || @strict_variables && raise_on_not_found - scope = e - break - end - end - end - - scope ||= @environments.last || @scopes.last - variable ||= lookup_and_evaluate(scope, key, raise_on_not_found: raise_on_not_found) - - variable = variable.to_liquid - variable.context = self if variable.respond_to?(:context=) - - variable - end - - def lookup_and_evaluate(obj, key, raise_on_not_found: true) - if @strict_variables && raise_on_not_found && 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.1/lib/liquid/document.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/document.rb deleted file mode 100644 index d035dd4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/document.rb +++ /dev/null @@ -1,27 +0,0 @@ -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.1/lib/liquid/drop.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/drop.rb deleted file mode 100644 index 6b5aa99..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/drop.rb +++ /dev/null @@ -1,78 +0,0 @@ -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.1/lib/liquid/errors.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/errors.rb deleted file mode 100644 index defa5ea..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/errors.rb +++ /dev/null @@ -1,56 +0,0 @@ -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.1/lib/liquid/expression.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/expression.rb deleted file mode 100644 index 1d01cdd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/expression.rb +++ /dev/null @@ -1,49 +0,0 @@ -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 - } - - SINGLE_QUOTED_STRING = /\A'(.*)'\z/m - DOUBLE_QUOTED_STRING = /\A"(.*)"\z/m - INTEGERS_REGEX = /\A(-?\d+)\z/ - FLOATS_REGEX = /\A(-?\d[\d\.]+)\z/ - RANGES_REGEX = /\A\((\S+)\.\.(\S+)\)\z/ - - def self.parse(markup) - if LITERALS.key?(markup) - LITERALS[markup] - else - case markup - when SINGLE_QUOTED_STRING, DOUBLE_QUOTED_STRING - $1 - when INTEGERS_REGEX - $1.to_i - when RANGES_REGEX - RangeLookup.parse($1, $2) - when FLOATS_REGEX - $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.1/lib/liquid/extensions.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/extensions.rb deleted file mode 100644 index 0907819..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/extensions.rb +++ /dev/null @@ -1,74 +0,0 @@ -require 'time' -require 'date' - -class String # :nodoc: - def to_liquid - self - end -end - -class Symbol # :nodoc: - def to_liquid - to_s - 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.1/lib/liquid/file_system.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/file_system.rb deleted file mode 100644 index 13f1f46..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/file_system.rb +++ /dev/null @@ -1,73 +0,0 @@ -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.1/lib/liquid/forloop_drop.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/forloop_drop.rb deleted file mode 100644 index 81b2d1a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/forloop_drop.rb +++ /dev/null @@ -1,42 +0,0 @@ -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.1/lib/liquid/i18n.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/i18n.rb deleted file mode 100644 index e998d58..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/i18n.rb +++ /dev/null @@ -1,39 +0,0 @@ -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.1/lib/liquid/interrupts.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/interrupts.rb deleted file mode 100644 index 41359d7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/interrupts.rb +++ /dev/null @@ -1,16 +0,0 @@ -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.1/lib/liquid/lexer.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/lexer.rb deleted file mode 100644 index e9114df..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/lexer.rb +++ /dev/null @@ -1,55 +0,0 @@ -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(?=\s)/ - WHITESPACE_OR_NOTHING = /\s*/ - - def initialize(input) - @ss = StringScanner.new(input) - end - - def tokenize - @output = [] - - until @ss.eos? - @ss.skip(WHITESPACE_OR_NOTHING) - break if @ss.eos? - 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.1/lib/liquid/locales/en.yml b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/locales/en.yml deleted file mode 100644 index 48b3b1d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/locales/en.yml +++ /dev/null @@ -1,26 +0,0 @@ ---- - 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: "'%{tag}' 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.1/lib/liquid/parse_context.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parse_context.rb deleted file mode 100644 index abcdaeb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parse_context.rb +++ /dev/null @@ -1,38 +0,0 @@ -module Liquid - class ParseContext - attr_accessor :locale, :line_number, :trim_whitespace, :depth - attr_reader :partial, :warnings, :error_mode - - def initialize(options = {}) - @template_options = options ? options.dup : {} - @locale = @template_options[:locale] ||= I18n.new - @warnings = [] - self.depth = 0 - 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.1/lib/liquid/parser.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parser.rb deleted file mode 100644 index 6954343..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parser.rb +++ /dev/null @@ -1,90 +0,0 @@ -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.1/lib/liquid/parser_switching.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parser_switching.rb deleted file mode 100644 index 3aa664a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/parser_switching.rb +++ /dev/null @@ -1,31 +0,0 @@ -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.1/lib/liquid/profiler.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/profiler.rb deleted file mode 100644 index dc9db60..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/profiler.rb +++ /dev/null @@ -1,158 +0,0 @@ -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.1/lib/liquid/profiler/hooks.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/profiler/hooks.rb deleted file mode 100644 index cb11cd7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/profiler/hooks.rb +++ /dev/null @@ -1,23 +0,0 @@ -module Liquid - class BlockBody - def render_node_with_profiling(node, output, context, skip_output = false) - Profiler.profile_node_render(node) do - render_node_without_profiling(node, output, context, skip_output) - end - end - - alias_method :render_node_without_profiling, :render_node_to_output - alias_method :render_node_to_output, :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.1/lib/liquid/range_lookup.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/range_lookup.rb deleted file mode 100644 index 93bb420..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/range_lookup.rb +++ /dev/null @@ -1,37 +0,0 @@ -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.1/lib/liquid/resource_limits.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/resource_limits.rb deleted file mode 100644 index 08b359b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/resource_limits.rb +++ /dev/null @@ -1,23 +0,0 @@ -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.1/lib/liquid/standardfilters.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/standardfilters.rb deleted file mode 100644 index 35809ce..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/standardfilters.rb +++ /dev/null @@ -1,456 +0,0 @@ -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.to_s).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.to_s) unless input.nil? - end - - def url_decode(input) - CGI.unescape(input.to_s) 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 do |a, b| - if !a.nil? && !b.nil? - a <=> b - else - a.nil? ? 1 : -1 - end - end - elsif ary.empty? # The next two cases assume a non-empty array. - [] - elsif ary.all? { |el| el.respond_to?(:[]) } - ary.sort do |a, b| - a = a[property] - b = b[property] - if !a.nil? && !b.nil? - a <=> b - else - a.nil? ? 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 do |a, b| - if !a.nil? && !b.nil? - a.to_s.casecmp(b.to_s) - else - a.nil? ? 1 : -1 - end - end - elsif ary.empty? # The next two cases assume a non-empty array. - [] - elsif ary.all? { |el| el.respond_to?(:[]) } - ary.sort do |a, b| - a = a[property] - b = b[property] - if !a.nil? && !b.nil? - a.to_s.casecmp(b.to_s) - else - a.nil? ? 1 : -1 - end - end - 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 at_least(input, n) - min_value = Utils.to_number(n) - - result = Utils.to_number(input) - result = min_value if min_value > result - result.is_a?(BigDecimal) ? result.to_f : result - end - - def at_most(input, n) - max_value = Utils.to_number(n) - - result = Utils.to_number(input) - result = max_value if max_value < result - result.is_a?(BigDecimal) ? result.to_f : result - 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.to_s) - 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.1/lib/liquid/strainer.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/strainer.rb deleted file mode 100644 index 76d56d2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/strainer.rb +++ /dev/null @@ -1,66 +0,0 @@ -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.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.1/lib/liquid/tablerowloop_drop.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tablerowloop_drop.rb deleted file mode 100644 index cda4a1e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tablerowloop_drop.rb +++ /dev/null @@ -1,62 +0,0 @@ -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.1/lib/liquid/tag.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tag.rb deleted file mode 100644 index 06970c1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tag.rb +++ /dev/null @@ -1,43 +0,0 @@ -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.1/lib/liquid/tags/assign.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/assign.rb deleted file mode 100644 index f6cd5fa..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/assign.rb +++ /dev/null @@ -1,51 +0,0 @@ -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.1/lib/liquid/tags/break.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/break.rb deleted file mode 100644 index 6fe0969..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/break.rb +++ /dev/null @@ -1,18 +0,0 @@ -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.1/lib/liquid/tags/capture.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/capture.rb deleted file mode 100644 index 8674356..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/capture.rb +++ /dev/null @@ -1,38 +0,0 @@ -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.1/lib/liquid/tags/case.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/case.rb deleted file mode 100644 index 453b4d6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/case.rb +++ /dev/null @@ -1,86 +0,0 @@ -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.1/lib/liquid/tags/comment.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/comment.rb deleted file mode 100644 index c57c9cd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/comment.rb +++ /dev/null @@ -1,16 +0,0 @@ -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.1/lib/liquid/tags/continue.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/continue.rb deleted file mode 100644 index 9c81ec2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/continue.rb +++ /dev/null @@ -1,18 +0,0 @@ -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.1/lib/liquid/tags/cycle.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/cycle.rb deleted file mode 100644 index ad116a6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/cycle.rb +++ /dev/null @@ -1,57 +0,0 @@ -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] ||= {} - - context.stack do - key = context.evaluate(@name) - iteration = context.registers[:cycle][key].to_i - 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.1/lib/liquid/tags/decrement.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/decrement.rb deleted file mode 100644 index b5cdaaa..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/decrement.rb +++ /dev/null @@ -1,35 +0,0 @@ -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.1/lib/liquid/tags/for.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/for.rb deleted file mode 100644 index 6c95624..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/for.rb +++ /dev/null @@ -1,198 +0,0 @@ -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 %} (note that the flag's spelling is different to the filter `reverse`) - # - # == 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 - - attr_reader :collection_name - attr_reader :variable_name - - 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] ||= {} - - 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 do |item| - 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.1/lib/liquid/tags/if.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/if.rb deleted file mode 100644 index 904369d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/if.rb +++ /dev/null @@ -1,114 +0,0 @@ -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_comparisons(p) - p.consume(:end_of_string) - condition - end - - def parse_binary_comparisons(p) - condition = parse_comparison(p) - first_condition = condition - while op = (p.id?('and'.freeze) || p.id?('or'.freeze)) - child_condition = parse_comparison(p) - condition.send(op, child_condition) - condition = child_condition - end - first_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.1/lib/liquid/tags/ifchanged.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/ifchanged.rb deleted file mode 100644 index d70cbe1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/ifchanged.rb +++ /dev/null @@ -1,18 +0,0 @@ -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.1/lib/liquid/tags/include.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/include.rb deleted file mode 100644 index a800703..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/include.rb +++ /dev/null @@ -1,113 +0,0 @@ -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, raise_on_not_found: false) - 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.1/lib/liquid/tags/increment.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/increment.rb deleted file mode 100644 index baa0cbb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/increment.rb +++ /dev/null @@ -1,31 +0,0 @@ -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.1/lib/liquid/tags/raw.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/raw.rb deleted file mode 100644 index 6b461bd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/raw.rb +++ /dev/null @@ -1,47 +0,0 @@ -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.1/lib/liquid/tags/table_row.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/table_row.rb deleted file mode 100644 index cfdef33..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/table_row.rb +++ /dev/null @@ -1,54 +0,0 @@ -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 do |item| - 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.1/lib/liquid/tags/unless.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/unless.rb deleted file mode 100644 index 1d4280d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tags/unless.rb +++ /dev/null @@ -1,30 +0,0 @@ -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.1/lib/liquid/template.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/template.rb deleted file mode 100644 index 31a67e4..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/template.rb +++ /dev/null @@ -1,254 +0,0 @@ -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.1/lib/liquid/tokenizer.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tokenizer.rb deleted file mode 100644 index d03657e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/tokenizer.rb +++ /dev/null @@ -1,31 +0,0 @@ -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.1/lib/liquid/utils.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/utils.rb deleted file mode 100644 index 516ac0c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/utils.rb +++ /dev/null @@ -1,83 +0,0 @@ -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(obj.to_s) - when Numeric - obj - when String - (obj.strip =~ /\A-?\d+\.\d+\z/) ? BigDecimal(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.1/lib/liquid/variable.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/variable.rb deleted file mode 100644 index 5f88eb3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/variable.rb +++ /dev/null @@ -1,142 +0,0 @@ -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 - FilterMarkupRegex = /#{FilterSeparator}\s*(.*)/om - FilterParser = /(?:\s+|#{QuotedFragment}|#{ArgumentSeparator})+/o - FilterArgsRegex = /(?:#{FilterArgumentSeparator}|#{ArgumentSeparator})\s*((?:\w+\s*\:\s*)?#{QuotedFragment})/o - JustTagAttributes = /\A#{TagAttributes}\z/o - MarkupWithQuotedFragment = /(#{QuotedFragment})(.*)/om - - 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 =~ MarkupWithQuotedFragment - - name_markup = $1 - filter_markup = $2 - @name = Expression.parse(name_markup) - if filter_markup =~ FilterMarkupRegex - filters = $1.scan(FilterParser) - filters.each do |f| - next unless f =~ /\w+/ - filtername = Regexp.last_match(0) - filterargs = f.scan(FilterArgsRegex).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(JustTagAttributes) - 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.1/lib/liquid/variable_lookup.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/variable_lookup.rb deleted file mode 100644 index 3ed4e4a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/variable_lookup.rb +++ /dev/null @@ -1,82 +0,0 @@ -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.1/lib/liquid/version.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/version.rb deleted file mode 100644 index 64abb7e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/lib/liquid/version.rb +++ /dev/null @@ -1,4 +0,0 @@ -# encoding: utf-8 -module Liquid - VERSION = "4.0.1" -end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/fixtures/en_locale.yml b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/fixtures/en_locale.yml deleted file mode 100644 index 0b113c6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/fixtures/en_locale.yml +++ /dev/null @@ -1,9 +0,0 @@ ---- - 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.1/test/integration/assign_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/assign_test.rb deleted file mode 100644 index 5502289..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/assign_test.rb +++ /dev/null @@ -1,48 +0,0 @@ -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.1/test/integration/blank_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/blank_test.rb deleted file mode 100644 index e9b56df..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/blank_test.rb +++ /dev/null @@ -1,106 +0,0 @@ -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.1/test/integration/block_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/block_test.rb deleted file mode 100644 index 0824530..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/block_test.rb +++ /dev/null @@ -1,12 +0,0 @@ -require 'test_helper' - -class BlockTest < Minitest::Test - include Liquid - - def test_unexpected_end_tag - exc = assert_raises(SyntaxError) do - Template.parse("{% if true %}{% endunless %}") - end - assert_equal exc.message, "Liquid syntax error: 'endunless' is not a valid delimiter for if tags. use endif" - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/capture_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/capture_test.rb deleted file mode 100644 index 8d965b3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/capture_test.rb +++ /dev/null @@ -1,50 +0,0 @@ -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.1/test/integration/context_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/context_test.rb deleted file mode 100644 index 2d109bb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/context_test.rb +++ /dev/null @@ -1,32 +0,0 @@ -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.1/test/integration/document_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/document_test.rb deleted file mode 100644 index bcc4a21..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/document_test.rb +++ /dev/null @@ -1,19 +0,0 @@ -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.1/test/integration/drop_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/drop_test.rb deleted file mode 100644 index 2de4a5a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/drop_test.rb +++ /dev/null @@ -1,273 +0,0 @@ -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.1/test/integration/error_handling_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/error_handling_test.rb deleted file mode 100644 index ba81861..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/error_handling_test.rb +++ /dev/null @@ -1,260 +0,0 @@ -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.1/test/integration/filter_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/filter_test.rb deleted file mode 100644 index d3c880e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/filter_test.rb +++ /dev/null @@ -1,178 +0,0 @@ -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.1/test/integration/hash_ordering_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/hash_ordering_test.rb deleted file mode 100644 index dfc1c29..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/hash_ordering_test.rb +++ /dev/null @@ -1,23 +0,0 @@ -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.1/test/integration/output_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/output_test.rb deleted file mode 100644 index b4cf9d7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/output_test.rb +++ /dev/null @@ -1,123 +0,0 @@ -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.1/test/integration/parsing_quirks_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/parsing_quirks_test.rb deleted file mode 100644 index 23742dc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/parsing_quirks_test.rb +++ /dev/null @@ -1,122 +0,0 @@ -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 - - def test_contains_in_id - assert_template_result(' YES ', '{% if containsallshipments == true %} YES {% endif %}', 'containsallshipments' => true) - end -end # ParsingQuirksTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/render_profiling_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/render_profiling_test.rb deleted file mode 100644 index d0111e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/render_profiling_test.rb +++ /dev/null @@ -1,154 +0,0 @@ -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.1/test/integration/security_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/security_test.rb deleted file mode 100644 index f603ff0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/security_test.rb +++ /dev/null @@ -1,80 +0,0 @@ -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 - - def test_max_depth_nested_blocks_does_not_raise_exception - depth = Liquid::Block::MAX_DEPTH - code = "{% if true %}" * depth + "rendered" + "{% endif %}" * depth - assert_equal "rendered", Template.parse(code).render! - end - - def test_more_than_max_depth_nested_blocks_raises_exception - depth = Liquid::Block::MAX_DEPTH + 1 - code = "{% if true %}" * depth + "rendered" + "{% endif %}" * depth - assert_raises(Liquid::StackLevelError) do - Template.parse(code).render! - end - end -end # SecurityTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/standard_filter_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/standard_filter_test.rb deleted file mode 100644 index bb72862..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/standard_filter_test.rb +++ /dev/null @@ -1,626 +0,0 @@ -# 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 '1', @filters.escape(1) - assert_equal '2001-02-03', @filters.escape(Date.new(2001, 2, 3)) - assert_nil @filters.escape(nil) - end - - def test_h - assert_equal '<strong>', @filters.h('') - assert_equal '1', @filters.h(1) - assert_equal '2001-02-03', @filters.h(Date.new(2001, 2, 3)) - assert_nil @filters.h(nil) - 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 '1', @filters.url_encode(1) - assert_equal '2001-02-03', @filters.url_encode(Date.new(2001, 2, 3)) - assert_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 '1', @filters.url_decode(1) - assert_equal '2001-02-03', @filters.url_decode(Date.new(2001, 2, 3)) - assert_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], ' - ') - assert_equal '1121314', @filters.join([1, 2, 3, 4], 1) - 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_with_nils - assert_equal [1, 2, 3, 4, nil], @filters.sort([nil, 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_natural - assert_equal ["a", "B", "c", "D"], @filters.sort_natural(["c", "D", "a", "B"]) - assert_equal [{ "a" => "a" }, { "a" => "B" }, { "a" => "c" }, { "a" => "D" }], @filters.sort_natural([{ "a" => "D" }, { "a" => "c" }, { "a" => "a" }, { "a" => "B" }], "a") - end - - def test_sort_natural_with_nils - assert_equal ["a", "B", "c", "D", nil], @filters.sort_natural([nil, "c", "D", "a", "B"]) - assert_equal [{ "a" => "a" }, { "a" => "B" }, { "a" => "c" }, { "a" => "D" }, {}], @filters.sort_natural([{ "a" => "D" }, { "a" => "c" }, {}, { "a" => "a" }, { "a" => "B" }], "a") - end - - def test_sort_natural_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_natural(input, "price") - end - - def test_sort_natural_case_check - input = [ - { "key" => "X" }, - { "key" => "Y" }, - { "key" => "Z" }, - { "fake" => "t" }, - { "key" => "a" }, - { "key" => "b" }, - { "key" => "c" } - ] - expectation = [ - { "key" => "a" }, - { "key" => "b" }, - { "key" => "c" }, - { "key" => "X" }, - { "key" => "Y" }, - { "key" => "Z" }, - { "fake" => "t" } - ] - assert_equal expectation, @filters.sort_natural(input, "key") - assert_equal ["a", "b", "c", "X", "Y", "Z"], @filters.sort_natural(["X", "Y", "Z", "a", "b", "c"]) - 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_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_nil @filters.first([]) - assert_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_at_most - assert_template_result "4", "{{ 5 | at_most:4 }}" - assert_template_result "5", "{{ 5 | at_most:5 }}" - assert_template_result "5", "{{ 5 | at_most:6 }}" - - assert_template_result "4.5", "{{ 4.5 | at_most:5 }}" - assert_template_result "5", "{{ width | at_most:5 }}", 'width' => NumberLikeThing.new(6) - assert_template_result "4", "{{ width | at_most:5 }}", 'width' => NumberLikeThing.new(4) - assert_template_result "4", "{{ 5 | at_most: width }}", 'width' => NumberLikeThing.new(4) - end - - def test_at_least - assert_template_result "5", "{{ 5 | at_least:4 }}" - assert_template_result "5", "{{ 5 | at_least:5 }}" - assert_template_result "6", "{{ 5 | at_least:6 }}" - - assert_template_result "5", "{{ 4.5 | at_least:5 }}" - assert_template_result "6", "{{ width | at_least:5 }}", 'width' => NumberLikeThing.new(6) - assert_template_result "5", "{{ width | at_least:5 }}", 'width' => NumberLikeThing.new(4) - assert_template_result "6", "{{ 5 | at_least: width }}", 'width' => NumberLikeThing.new(6) - 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.1/test/integration/tags/break_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/break_tag_test.rb deleted file mode 100644 index 0fbde83..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/break_tag_test.rb +++ /dev/null @@ -1,15 +0,0 @@ -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.1/test/integration/tags/continue_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/continue_tag_test.rb deleted file mode 100644 index ce4c158..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/continue_tag_test.rb +++ /dev/null @@ -1,15 +0,0 @@ -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.1/test/integration/tags/for_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/for_tag_test.rb deleted file mode 100644 index cb7a822..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/for_tag_test.rb +++ /dev/null @@ -1,410 +0,0 @@ -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.1/test/integration/tags/if_else_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/if_else_tag_test.rb deleted file mode 100644 index 45a5d3a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/if_else_tag_test.rb +++ /dev/null @@ -1,188 +0,0 @@ -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.1/test/integration/tags/include_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/include_tag_test.rb deleted file mode 100644 index 1d854b0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/include_tag_test.rb +++ /dev/null @@ -1,245 +0,0 @@ -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) 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 - - def test_including_with_strict_variables - template = Liquid::Template.parse("{% include 'simple' %}", error_mode: :warn) - template.render(nil, strict_variables: true) - - assert_equal [], template.errors - end -end # IncludeTagTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/increment_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/increment_tag_test.rb deleted file mode 100644 index 97c51ac..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/increment_tag_test.rb +++ /dev/null @@ -1,23 +0,0 @@ -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.1/test/integration/tags/raw_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/raw_tag_test.rb deleted file mode 100644 index 634d052..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/raw_tag_test.rb +++ /dev/null @@ -1,31 +0,0 @@ -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.1/test/integration/tags/standard_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/standard_tag_test.rb deleted file mode 100644 index 4b4703a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/standard_tag_test.rb +++ /dev/null @@ -1,296 +0,0 @@ -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.1/test/integration/tags/statements_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/statements_test.rb deleted file mode 100644 index eeff166..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/statements_test.rb +++ /dev/null @@ -1,111 +0,0 @@ -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.1/test/integration/tags/table_row_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/table_row_test.rb deleted file mode 100644 index d7bc14c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/table_row_test.rb +++ /dev/null @@ -1,64 +0,0 @@ -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.1/test/integration/tags/unless_else_tag_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/unless_else_tag_test.rb deleted file mode 100644 index c414a71..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/tags/unless_else_tag_test.rb +++ /dev/null @@ -1,26 +0,0 @@ -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.1/test/integration/template_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/template_test.rb deleted file mode 100644 index d10e1c5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/template_test.rb +++ /dev/null @@ -1,332 +0,0 @@ -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_nil_value_does_not_raise - Liquid::Template.error_mode = :strict - t = Template.parse("some{{x}}thing") - result = t.render!({ 'x' => nil }, strict_variables: true) - - assert_equal 0, t.errors.count - assert_equal 'something', result - 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.1/test/integration/trim_mode_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/trim_mode_test.rb deleted file mode 100644 index 52248cf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/trim_mode_test.rb +++ /dev/null @@ -1,529 +0,0 @@ -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_right_trim_followed_by_tag - assert_template_result('ab c', '{{ "a" -}}{{ "b" }} c') - 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.1/test/integration/variable_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/variable_test.rb deleted file mode 100644 index abd6e70..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/integration/variable_test.rb +++ /dev/null @@ -1,96 +0,0 @@ -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 - - def test_render_symbol - assert_template_result 'bar', '{{ foo }}', 'foo' => :bar - end -end diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/test_helper.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/test_helper.rb deleted file mode 100644 index ac5ab53..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/test_helper.rb +++ /dev/null @@ -1,116 +0,0 @@ -#!/usr/bin/env ruby - -ENV["MT_NO_EXPECTATIONS"] = "1" -require 'minitest/autorun' - -$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.1/test/unit/block_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/block_unit_test.rb deleted file mode 100644 index 6a27a7d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/block_unit_test.rb +++ /dev/null @@ -1,58 +0,0 @@ -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.1/test/unit/condition_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/condition_unit_test.rb deleted file mode 100644 index 5afa2b7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/condition_unit_test.rb +++ /dev/null @@ -1,166 +0,0 @@ -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_hash_compare_backwards_compatibility - assert_nil Condition.new({}, '>', 2).evaluate - assert_nil Condition.new(2, '>', {}).evaluate - assert_equal false, Condition.new({}, '==', 2).evaluate - assert_equal true, Condition.new({ 'a' => 1 }, '==', { 'a' => 1 }).evaluate - assert_equal true, Condition.new({ 'a' => 2 }, 'contains', 'a').evaluate - 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.1/test/unit/context_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/context_unit_test.rb deleted file mode 100644 index fab19b8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/context_unit_test.rb +++ /dev/null @@ -1,489 +0,0 @@ -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 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_nil @context['nil'] - assert_nil @context['nil'] - end - - def test_variables_not_existing - assert_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_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_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_interrupt_avoids_object_allocations - assert_no_object_allocations do - @context.interrupt? - end - 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 - - private - - def assert_no_object_allocations - unless RUBY_ENGINE == 'ruby' - skip "stackprof needed to count object allocations" - end - require 'stackprof' - - profile = StackProf.run(mode: :object) do - yield - end - assert_equal 0, profile[:samples] - end -end # ContextTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/file_system_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/file_system_unit_test.rb deleted file mode 100644 index 2c7250b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/file_system_unit_test.rb +++ /dev/null @@ -1,35 +0,0 @@ -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.1/test/unit/i18n_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/i18n_unit_test.rb deleted file mode 100644 index b57500e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/i18n_unit_test.rb +++ /dev/null @@ -1,37 +0,0 @@ -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.1/test/unit/lexer_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/lexer_unit_test.rb deleted file mode 100644 index 5adcf2b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/lexer_unit_test.rb +++ /dev/null @@ -1,51 +0,0 @@ -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.1/test/unit/parser_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/parser_unit_test.rb deleted file mode 100644 index 9f23337..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/parser_unit_test.rb +++ /dev/null @@ -1,82 +0,0 @@ -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.1/test/unit/regexp_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/regexp_unit_test.rb deleted file mode 100644 index 0821229..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/regexp_unit_test.rb +++ /dev/null @@ -1,44 +0,0 @@ -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.1/test/unit/strainer_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/strainer_unit_test.rb deleted file mode 100644 index 5ce2100..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/strainer_unit_test.rb +++ /dev/null @@ -1,164 +0,0 @@ -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 - - def test_add_filter_does_not_include_already_included_module - mod = Module.new do - class << self - attr_accessor :include_count - def included(mod) - self.include_count += 1 - end - end - self.include_count = 0 - end - strainer = Context.new.strainer - strainer.class.add_filter(mod) - strainer.class.add_filter(mod) - assert_equal 1, mod.include_count - end -end # StrainerTest diff --git a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tag_unit_test.rb deleted file mode 100644 index c4b901b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tag_unit_test.rb +++ /dev/null @@ -1,21 +0,0 @@ -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.1/test/unit/tags/case_tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/case_tag_unit_test.rb deleted file mode 100644 index 7110308..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/case_tag_unit_test.rb +++ /dev/null @@ -1,10 +0,0 @@ -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.1/test/unit/tags/for_tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/for_tag_unit_test.rb deleted file mode 100644 index b8fc520..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/for_tag_unit_test.rb +++ /dev/null @@ -1,13 +0,0 @@ -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.1/test/unit/tags/if_tag_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/if_tag_unit_test.rb deleted file mode 100644 index 7ecfc40..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tags/if_tag_unit_test.rb +++ /dev/null @@ -1,8 +0,0 @@ -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.1/test/unit/template_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/template_unit_test.rb deleted file mode 100644 index 6328be5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/template_unit_test.rb +++ /dev/null @@ -1,78 +0,0 @@ -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.1/test/unit/tokenizer_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tokenizer_unit_test.rb deleted file mode 100644 index de84c1f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/tokenizer_unit_test.rb +++ /dev/null @@ -1,55 +0,0 @@ -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.1/test/unit/variable_unit_test.rb b/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/variable_unit_test.rb deleted file mode 100644 index 5a21ace..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/liquid-4.0.1/test/unit/variable_unit_test.rb +++ /dev/null @@ -1,162 +0,0 @@ -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 deleted file mode 100644 index 232adbd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CHANGELOG.md +++ /dev/null @@ -1 +0,0 @@ -# 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 deleted file mode 100644 index 5a5d6de..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/CONTRIBUTING.md +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index b5f71c8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index 2682872..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/README.md +++ /dev/null @@ -1,297 +0,0 @@ -## 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 deleted file mode 100755 index dbbdef2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/bin/listen +++ /dev/null @@ -1,12 +0,0 @@ -#!/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 deleted file mode 100644 index fc9ae3e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen.rb +++ /dev/null @@ -1,57 +0,0 @@ -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 deleted file mode 100644 index a1954d9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter.rb +++ /dev/null @@ -1,45 +0,0 @@ -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 deleted file mode 100644 index e33349a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/base.rb +++ /dev/null @@ -1,141 +0,0 @@ -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 deleted file mode 100644 index 7db424f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/bsd.rb +++ /dev/null @@ -1,106 +0,0 @@ -# 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 deleted file mode 100644 index fbd60e0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/config.rb +++ /dev/null @@ -1,26 +0,0 @@ -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 deleted file mode 100644 index d65779f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/darwin.rb +++ /dev/null @@ -1,92 +0,0 @@ -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 deleted file mode 100644 index c1ddf73..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/linux.rb +++ /dev/null @@ -1,106 +0,0 @@ -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 deleted file mode 100644 index 486eafe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/polling.rb +++ /dev/null @@ -1,37 +0,0 @@ -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 deleted file mode 100644 index 35dcca7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/adapter/windows.rb +++ /dev/null @@ -1,98 +0,0 @@ -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 deleted file mode 100644 index ff25495..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/backend.rb +++ /dev/null @@ -1,38 +0,0 @@ -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 deleted file mode 100644 index 3d49c79..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/change.rb +++ /dev/null @@ -1,76 +0,0 @@ -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 deleted file mode 100644 index 851f063..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/cli.rb +++ /dev/null @@ -1,65 +0,0 @@ -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 deleted file mode 100644 index 873a722..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/directory.rb +++ /dev/null @@ -1,87 +0,0 @@ -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 deleted file mode 100644 index d49a8f2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/config.rb +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index 008dbfb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/loop.rb +++ /dev/null @@ -1,117 +0,0 @@ -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 deleted file mode 100644 index ab492e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/processor.rb +++ /dev/null @@ -1,122 +0,0 @@ -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 deleted file mode 100644 index 9daf175..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/event/queue.rb +++ /dev/null @@ -1,55 +0,0 @@ -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 deleted file mode 100644 index 32fc6c3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/file.rb +++ /dev/null @@ -1,80 +0,0 @@ -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 deleted file mode 100644 index 882cc00..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/fsm.rb +++ /dev/null @@ -1,132 +0,0 @@ -# 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 deleted file mode 100644 index e112d90..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/internals/thread_pool.rb +++ /dev/null @@ -1,29 +0,0 @@ -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 deleted file mode 100644 index e0fe656..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener.rb +++ /dev/null @@ -1,133 +0,0 @@ -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 deleted file mode 100644 index d135322..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/listener/config.rb +++ /dev/null @@ -1,41 +0,0 @@ -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 deleted file mode 100644 index b0e6333..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/logger.rb +++ /dev/null @@ -1,32 +0,0 @@ -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 deleted file mode 100644 index 7ae36a7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/options.rb +++ /dev/null @@ -1,23 +0,0 @@ -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 deleted file mode 100644 index 752297a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/queue_optimizer.rb +++ /dev/null @@ -1,132 +0,0 @@ -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 deleted file mode 100644 index ad374ce..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record.rb +++ /dev/null @@ -1,118 +0,0 @@ -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 deleted file mode 100644 index 759be61..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/entry.rb +++ /dev/null @@ -1,64 +0,0 @@ -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 deleted file mode 100644 index 5884092..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/record/symlink_detector.rb +++ /dev/null @@ -1,39 +0,0 @@ -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 deleted file mode 100644 index 4addd34..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer.rb +++ /dev/null @@ -1,97 +0,0 @@ -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 deleted file mode 100644 index a07e0ae..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/silencer/controller.rb +++ /dev/null @@ -1,48 +0,0 @@ -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 deleted file mode 100644 index 2a19c7f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/listen-3.1.5/lib/listen/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index d87d4be..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.gitignore +++ /dev/null @@ -1,17 +0,0 @@ -*.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 deleted file mode 100644 index 5f16476..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.rspec +++ /dev/null @@ -1,2 +0,0 @@ ---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 deleted file mode 100644 index d7c261d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/.travis.yml +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index 50c90db..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Gemfile +++ /dev/null @@ -1,4 +0,0 @@ -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 deleted file mode 100644 index 360b83f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/History.markdown +++ /dev/null @@ -1,109 +0,0 @@ -## 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 deleted file mode 100644 index 354c0b2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -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 deleted file mode 100644 index ed9b1a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/README.md +++ /dev/null @@ -1,250 +0,0 @@ -# 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 deleted file mode 100644 index 2995527..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/Rakefile +++ /dev/null @@ -1 +0,0 @@ -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 deleted file mode 100755 index 807e587..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/help_dialogue.rb +++ /dev/null @@ -1,46 +0,0 @@ -#!/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 deleted file mode 100644 index 2cb867a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/logging.rb +++ /dev/null @@ -1,39 +0,0 @@ -#!/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 deleted file mode 100644 index 0aaa365..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/examples/trace.rb +++ /dev/null @@ -1,21 +0,0 @@ -#!/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 deleted file mode 100644 index 1c4be62..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary.rb +++ /dev/null @@ -1,21 +0,0 @@ -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 deleted file mode 100644 index 0bcc4dd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/command.rb +++ /dev/null @@ -1,280 +0,0 @@ -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 deleted file mode 100644 index 56a49b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/option.rb +++ /dev/null @@ -1,87 +0,0 @@ -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 deleted file mode 100644 index 0521ee0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/presenter.rb +++ /dev/null @@ -1,94 +0,0 @@ -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 deleted file mode 100644 index 53591c0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/program.rb +++ /dev/null @@ -1,53 +0,0 @@ -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 deleted file mode 100644 index 296046b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/lib/mercenary/version.rb +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index e9f8294..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/mercenary.gemspec +++ /dev/null @@ -1,24 +0,0 @@ -# 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 deleted file mode 100755 index a0cf262..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/bootstrap +++ /dev/null @@ -1,7 +0,0 @@ -#! /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 deleted file mode 100755 index 260e363..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/cibuild +++ /dev/null @@ -1,6 +0,0 @@ -#! /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 deleted file mode 100755 index 27ed279..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/console +++ /dev/null @@ -1,3 +0,0 @@ -#! /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 deleted file mode 100755 index a722ab3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/script/examples +++ /dev/null @@ -1,18 +0,0 @@ -#! /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 deleted file mode 100644 index e1c029a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/command_spec.rb +++ /dev/null @@ -1,98 +0,0 @@ -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 deleted file mode 100644 index 83e58fd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/option_spec.rb +++ /dev/null @@ -1,83 +0,0 @@ -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 deleted file mode 100644 index f61ed45..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/presenter_spec.rb +++ /dev/null @@ -1,39 +0,0 @@ -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 deleted file mode 100644 index f5d961e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/program_spec.rb +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index c379985..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/mercenary-0.3.6/spec/spec_helper.rb +++ /dev/null @@ -1,14 +0,0 @@ -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/pathutil-0.16.1/Gemfile b/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Gemfile deleted file mode 100644 index 60ea36c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Gemfile +++ /dev/null @@ -1,22 +0,0 @@ -# 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 deleted file mode 100644 index 139db79..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/LICENSE +++ /dev/null @@ -1,19 +0,0 @@ -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 deleted file mode 100644 index 58aaac7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/Rakefile +++ /dev/null @@ -1,81 +0,0 @@ -# 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 deleted file mode 100644 index 1a15873..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil.rb +++ /dev/null @@ -1,909 +0,0 @@ -# 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 deleted file mode 100644 index bec5f70..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/helpers.rb +++ /dev/null @@ -1,111 +0,0 @@ -# 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 deleted file mode 100644 index 7bb2e86..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/pathutil-0.16.1/lib/pathutil/version.rb +++ /dev/null @@ -1,7 +0,0 @@ -# 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.3/.gitignore b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.gitignore deleted file mode 100644 index 9e5a30a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# Bundler -.bundle -Gemfile.lock -pkg/* - -# Rubinius -*.rbc - -# YARD -.yardoc -yardoc/ diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.rubocop.yml b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.rubocop.yml deleted file mode 100644 index 5283089..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.rubocop.yml +++ /dev/null @@ -1,36 +0,0 @@ -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/**/*' - -# I often use @_variable to avoid clashing. -Naming/MemoizedInstanceVariableName: - Enabled: false - -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.3/.rubocop_defaults.yml b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.rubocop_defaults.yml deleted file mode 100644 index 4d07840..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.rubocop_defaults.yml +++ /dev/null @@ -1,184 +0,0 @@ -AllCops: - Exclude: - # Exclude .gemspec files because they are generally auto-generated - - '*.gemspec' - # Exclude vendored folders - - 'tmp/**/*' - - 'vendor/**/*' - -# [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 - -# Annotated tokens (like %s) are a good thing, but in most cases we don't need them. -# %s is a simpler and straightforward version that works in almost all cases. So don't complain. -Style/FormatStringToken: - 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' - -Style/RescueStandardError: - Enabled: false - -# 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/TrailingCommaInArrayLiteral: - EnforcedStyleForMultiline: consistent_comma -Style/TrailingCommaInHashLiteral: - 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.3/.ruby-gemset b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.ruby-gemset deleted file mode 100644 index 06070ae..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.ruby-gemset +++ /dev/null @@ -1 +0,0 @@ -publicsuffix \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.travis.yml b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.travis.yml deleted file mode 100644 index e023d2e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.travis.yml +++ /dev/null @@ -1,25 +0,0 @@ -language: ruby - -rvm: - - 2.1 - - 2.2 - - 2.3 - - 2.4 - - 2.5 - - 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.3/.yardopts b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.yardopts deleted file mode 100644 index 0a782de..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/.yardopts +++ /dev/null @@ -1 +0,0 @@ ---title 'Ruby Public Suffix API Documentation' diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/2.0-Upgrade.md b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/2.0-Upgrade.md deleted file mode 100644 index 1a10bfb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/2.0-Upgrade.md +++ /dev/null @@ -1,52 +0,0 @@ -# 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.3/CHANGELOG.md b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/CHANGELOG.md deleted file mode 100644 index 5df36bf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/CHANGELOG.md +++ /dev/null @@ -1,340 +0,0 @@ -# Changelog - - -#### Release 3.0.3 - -- CHANGED: Updated definitions. - - -#### Release 3.0.2 - -- CHANGED: Updated definitions. - - -#### 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.3/Gemfile b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/Gemfile deleted file mode 100644 index db22b74..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/Gemfile +++ /dev/null @@ -1,10 +0,0 @@ -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.3/LICENSE.txt b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/LICENSE.txt deleted file mode 100644 index 69e44da..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/LICENSE.txt +++ /dev/null @@ -1,22 +0,0 @@ -Copyright (c) 2009-2018 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.3/README.md b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/README.md deleted file mode 100644 index a82c95a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/README.md +++ /dev/null @@ -1,202 +0,0 @@ -# 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-2018 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.3/Rakefile b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/Rakefile deleted file mode 100644 index d304b66..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/Rakefile +++ /dev/null @@ -1,49 +0,0 @@ -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.3/bin/console b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/bin/console deleted file mode 100755 index fd0f739..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/bin/console +++ /dev/null @@ -1,14 +0,0 @@ -#!/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.3/data/list.txt b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/data/list.txt deleted file mode 100644 index f671831..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/data/list.txt +++ /dev/null @@ -1,12659 +0,0 @@ -// 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 : http://www.bnnic.bn/faqs -bn -com.bn -edu.bn -gov.bn -net.bn -org.bn - -// bo : https://nic.bo/delegacion2015.php#h-1.10 -bo -com.bo -edu.bo -gob.bo -int.bo -org.bo -net.bo -mil.bo -tv.bo -web.bo -// Social Domains -academia.bo -agro.bo -arte.bo -blog.bo -bolivia.bo -ciencia.bo -cooperativa.bo -democracia.bo -deporte.bo -ecologia.bo -economia.bo -empresa.bo -indigena.bo -industria.bo -info.bo -medicina.bo -movimiento.bo -musica.bo -natural.bo -nombre.bo -noticias.bo -patria.bo -politica.bo -profesional.bo -plurinacional.bo -pueblo.bo -revista.bo -salud.bo -tecnologia.bo -tksat.bo -transporte.bo -wiki.bo - -// br : http://registro.br/dominio/categoria.html -// Submitted by registry -br -9guacu.br -abc.br -adm.br -adv.br -agr.br -aju.br -am.br -anani.br -aparecida.br -arq.br -art.br -ato.br -b.br -barueri.br -belem.br -bhz.br -bio.br -blog.br -bmd.br -boavista.br -bsb.br -campinagrande.br -campinas.br -caxias.br -cim.br -cng.br -cnt.br -com.br -contagem.br -coop.br -cri.br -cuiaba.br -curitiba.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 -foz.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 -manaus.br -maringa.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 -riopreto.br -salvador.br -sampa.br -santamaria.br -santoandre.br -saobernardo.br -saogonca.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/register.html -// University of Guam : https://www.uog.edu -// Submitted by uognoc@triton.uog.edu -gu -com.gu -edu.gu -gov.gu -guam.gu -info.gu -net.gu -org.gu -web.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.hkirc.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://pandi.id/en/domain/registration-requirements/ -id -ac.id -biz.id -co.id -desa.id -go.id -mil.id -my.id -net.id -or.id -ponpes.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 (regions and provinces): -// http://www.nic.it/sites/default/files/docs/Regulation_assignation_v7.1.pdf -// 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 -trentin-sud-tirol.it -trentin-süd-tirol.it -trentin-sudtirol.it -trentin-südtirol.it -trentin-sued-tirol.it -trentin-suedtirol.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-süd-tirol.it -trentino-sudtirol.it -trentino-südtirol.it -trentino-sued-tirol.it -trentino-suedtirol.it -trentino.it -trentinoa-adige.it -trentinoaadige.it -trentinoalto-adige.it -trentinoaltoadige.it -trentinos-tirol.it -trentinostirol.it -trentinosud-tirol.it -trentinosüd-tirol.it -trentinosudtirol.it -trentinosüdtirol.it -trentinosued-tirol.it -trentinosuedtirol.it -trentinsud-tirol.it -trentinsüd-tirol.it -trentinsudtirol.it -trentinsüdtirol.it -trentinsued-tirol.it -trentinsuedtirol.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 -valleÌe-aoste.it -vallee-d-aoste.it -valleÌe-d-aoste.it -valleeaoste.it -valleÌeaoste.it -valleedaoste.it -valleÌedaoste.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-sudtirol.it -balsan-südtirol.it -balsan-suedtirol.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-altoadige.it -bolzano.it -bozen-sudtirol.it -bozen-südtirol.it -bozen-suedtirol.it -bozen.it -br.it -brescia.it -brindisi.it -bs.it -bt.it -bulsan-sudtirol.it -bulsan-südtirol.it -bulsan-suedtirol.it -bulsan.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 -cesena-forliÌ€.it -cesenaforli.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 -forliÌ€-cesena.it -forlicesena.it -forliÌ€cesena.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 -südtirol.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 -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/en/ke-domains/ke-domains -ke -ac.ke -co.ke -go.ke -info.ke -me.ke -mobi.ke -ne.ke -or.ke -sc.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://www.nic.kw/policies/ -// Confirmed by registry -kw -com.kw -edu.kw -emb.kw -gov.kw -ind.kw -net.kw -org.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 - -// 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://www.hkirc.hk -// Submitted by registry -// https://www.hkirc.hk/content.jsp?id=30#!/34 -香港 -å…¬å¸.香港 -教育.香港 -政府.香港 -個人.香港 -網絡.香港 -組織.香港 - -// 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--mgbbh1a ("Bharat", Kashmiri) : 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 - - -// newGTLDs -// List of new gTLDs imported from https://newgtlds.icann.org/newgtlds.csv on 2018-05-08T19:40:37Z -// This list is auto-generated, don't edit it manually. - -// 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 Minds + Machines Group Limited -abogado - -// abudhabi : 2015-07-30 Abu Dhabi Systems and Information Centre -abudhabi - -// academy : 2013-11-07 Binky Moon, LLC -academy - -// accenture : 2014-08-15 Accenture plc -accenture - -// accountant : 2014-11-20 dot Accountant Limited -accountant - -// accountants : 2014-03-20 Binky Moon, LLC -accountants - -// aco : 2015-01-08 ACO Severin Ahlmann GmbH & Co. KG -aco - -// active : 2014-05-01 Active Network, LLC -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 Binky Moon, 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 Grand Est -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 Oath Inc. -aol - -// apartments : 2014-12-11 Binky Moon, 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 Afilias plc -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 Binky Moon, LLC -associates - -// athleta : 2015-07-30 The Gap, Inc. -athleta - -// attorney : 2014-03-20 United TLD Holdco Ltd. -attorney - -// auction : 2014-03-20 United TLD Holdco Ltd. -auction - -// audi : 2015-05-21 AUDI Aktiengesellschaft -audi - -// audible : 2015-06-25 Amazon Registry Services, Inc. -audible - -// audio : 2014-03-20 Uniregistry, Corp. -audio - -// auspost : 2015-08-13 Australian Postal Corporation -auspost - -// author : 2014-12-18 Amazon Registry Services, Inc. -author - -// auto : 2014-11-13 Cars Registry Limited -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 Registry Services, Inc. -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 United TLD Holdco Ltd. -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 Binky Moon, 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 Minds + Machines Group 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 Binky Moon, LLC -bike - -// bing : 2014-12-18 Microsoft Corporation -bing - -// bingo : 2014-12-04 Binky Moon, LLC -bingo - -// bio : 2014-03-06 Afilias plc -bio - -// black : 2014-01-16 Afilias plc -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 Knock Knock WHOIS There, LLC -blog - -// bloomberg : 2014-07-17 Bloomberg IP Holdings LLC -bloomberg - -// blue : 2013-11-07 Afilias plc -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 Bank of America Corporation -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 Registry Services, Inc. -book - -// booking : 2015-07-16 Booking.com B.V. -booking - -// bosch : 2015-06-18 Robert Bosch GMBH -bosch - -// bostik : 2015-05-28 Bostik SA -bostik - -// boston : 2015-12-10 Boston TLD Management, LLC -boston - -// bot : 2014-12-18 Amazon Registry Services, Inc. -bot - -// boutique : 2013-11-14 Binky Moon, 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 Dotbroker Registry Limited -broker - -// brother : 2015-01-29 Brother Industries, Ltd. -brother - -// brussels : 2014-02-06 DNS.be vzw -brussels - -// budapest : 2013-11-21 Minds + Machines Group Limited -budapest - -// bugatti : 2015-07-23 Bugatti International SA -bugatti - -// build : 2013-11-07 Plan Bee LLC -build - -// builders : 2013-11-07 Binky Moon, LLC -builders - -// business : 2013-11-07 Binky Moon, LLC -business - -// buy : 2014-12-18 Amazon Registry Services, Inc. -buy - -// buzz : 2013-10-02 DOTSTRATEGY CO. -buzz - -// bzh : 2014-02-27 Association www.bzh -bzh - -// cab : 2013-10-24 Binky Moon, LLC -cab - -// cafe : 2015-02-11 Binky Moon, LLC -cafe - -// cal : 2014-07-24 Charleston Road Registry Inc. -cal - -// call : 2014-12-18 Amazon Registry Services, Inc. -call - -// calvinklein : 2015-07-30 PVH gTLD Holdings LLC -calvinklein - -// cam : 2016-04-21 AC Webconnecting Holding B.V. -cam - -// camera : 2013-08-27 Binky Moon, LLC -camera - -// camp : 2013-11-07 Binky Moon, 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 Binky Moon, LLC -capital - -// capitalone : 2015-08-06 Capital One Financial Corporation -capitalone - -// car : 2015-01-22 Cars Registry Limited -car - -// caravan : 2013-12-12 Caravan International, Inc. -caravan - -// cards : 2013-12-05 Binky Moon, LLC -cards - -// care : 2014-03-06 Binky Moon, LLC -care - -// career : 2013-10-09 dotCareer LLC -career - -// careers : 2013-10-02 Binky Moon, LLC -careers - -// cars : 2014-11-13 Cars Registry Limited -cars - -// cartier : 2014-06-23 Richemont DNS Inc. -cartier - -// casa : 2013-11-21 Minds + Machines Group Limited -casa - -// case : 2015-09-03 CNH Industrial N.V. -case - -// caseih : 2015-09-03 CNH Industrial N.V. -caseih - -// cash : 2014-03-06 Binky Moon, LLC -cash - -// casino : 2014-12-18 Binky Moon, LLC -casino - -// catering : 2013-12-05 Binky Moon, 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 Binky Moon, 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 DotCFD Registry Limited -cfd - -// chanel : 2015-04-09 Chanel International B.V. -chanel - -// channel : 2014-05-08 Charleston Road Registry Inc. -channel - -// charity : 2018-04-11 Corn Lake, LLC -charity - -// chase : 2015-04-30 JPMorgan Chase Bank, National Association -chase - -// chat : 2014-12-04 Binky Moon, LLC -chat - -// cheap : 2013-11-14 Binky Moon, 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 Binky Moon, LLC -church - -// cipriani : 2015-02-19 Hotel Cipriani Srl -cipriani - -// circle : 2014-12-18 Amazon Registry Services, Inc. -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 Binky Moon, LLC -city - -// cityeats : 2014-12-11 Lifestyle Domain Holdings, Inc. -cityeats - -// claims : 2014-03-20 Binky Moon, LLC -claims - -// cleaning : 2013-12-05 Binky Moon, LLC -cleaning - -// click : 2014-06-05 Uniregistry, Corp. -click - -// clinic : 2014-03-20 Binky Moon, LLC -clinic - -// clinique : 2015-10-01 The Estée Lauder Companies Inc. -clinique - -// clothing : 2013-08-27 Binky Moon, LLC -clothing - -// cloud : 2015-04-16 Aruba PEC 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 Binky Moon, LLC -coach - -// codes : 2013-10-31 Binky Moon, LLC -codes - -// coffee : 2013-10-17 Binky Moon, LLC -coffee - -// college : 2014-01-16 XYZ.COM LLC -college - -// cologne : 2014-02-05 punkt.wien GmbH -cologne - -// comcast : 2015-07-23 Comcast IP Holdings I, LLC -comcast - -// commbank : 2014-06-26 COMMONWEALTH BANK OF AUSTRALIA -commbank - -// community : 2013-12-05 Binky Moon, LLC -community - -// company : 2013-11-07 Binky Moon, LLC -company - -// compare : 2015-10-08 iSelect Ltd -compare - -// computer : 2013-10-24 Binky Moon, LLC -computer - -// comsec : 2015-01-08 VeriSign, Inc. -comsec - -// condos : 2013-12-05 Binky Moon, LLC -condos - -// construction : 2013-09-16 Binky Moon, LLC -construction - -// consulting : 2013-12-05 United TLD Holdco Ltd. -consulting - -// contact : 2015-01-08 Top Level Spectrum, Inc. -contact - -// contractors : 2013-09-10 Binky Moon, LLC -contractors - -// cooking : 2013-11-21 Minds + Machines Group Limited -cooking - -// cookingchannel : 2015-07-02 Lifestyle Domain Holdings, Inc. -cookingchannel - -// cool : 2013-11-14 Binky Moon, LLC -cool - -// corsica : 2014-09-25 Collectivité de Corse -corsica - -// country : 2013-12-19 DotCountry LLC -country - -// coupon : 2015-02-26 Amazon Registry Services, Inc. -coupon - -// coupons : 2015-03-26 Binky Moon, LLC -coupons - -// courses : 2014-12-04 OPEN UNIVERSITIES AUSTRALIA PTY LTD -courses - -// credit : 2014-03-20 Binky Moon, LLC -credit - -// creditcard : 2014-03-20 Binky Moon, 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 Binky Moon, 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 Binky Moon, 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 Minds + Machines Group Limited -dds - -// deal : 2015-06-25 Amazon Registry Services, Inc. -deal - -// dealer : 2014-12-22 Dealer Dot Com, Inc. -dealer - -// deals : 2014-05-22 Binky Moon, LLC -deals - -// degree : 2014-03-06 United TLD Holdco Ltd. -degree - -// delivery : 2014-09-11 Binky Moon, 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 Binky Moon, LLC -dental - -// dentist : 2014-03-20 United TLD Holdco Ltd. -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 Binky Moon, LLC -diamonds - -// diet : 2014-06-26 Uniregistry, Corp. -diet - -// digital : 2014-03-06 Binky Moon, LLC -digital - -// direct : 2014-04-10 Binky Moon, LLC -direct - -// directory : 2013-09-20 Binky Moon, LLC -directory - -// discount : 2014-03-06 Binky Moon, 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 Binky Moon, LLC -doctor - -// dodge : 2015-07-30 FCA US LLC. -dodge - -// dog : 2014-12-04 Binky Moon, LLC -dog - -// doha : 2014-09-18 Communications Regulatory Authority (CRA) -doha - -// domains : 2013-10-17 Binky Moon, 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 Binky Moon, LLC -education - -// email : 2013-10-31 Binky Moon, LLC -email - -// emerck : 2014-04-03 Merck KGaA -emerck - -// energy : 2014-09-11 Binky Moon, LLC -energy - -// engineer : 2014-03-06 United TLD Holdco Ltd. -engineer - -// engineering : 2014-03-06 Binky Moon, LLC -engineering - -// enterprises : 2013-09-20 Binky Moon, LLC -enterprises - -// epost : 2015-07-23 Deutsche Post AG -epost - -// epson : 2014-12-04 Seiko Epson Corporation -epson - -// equipment : 2013-08-27 Binky Moon, 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 Binky Moon, 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 Binky Moon, LLC -events - -// everbank : 2014-05-15 EverBank -everbank - -// exchange : 2014-03-06 Binky Moon, LLC -exchange - -// expert : 2013-11-21 Binky Moon, LLC -expert - -// exposed : 2013-12-05 Binky Moon, LLC -exposed - -// express : 2015-02-11 Binky Moon, LLC -express - -// extraspace : 2015-05-14 Extra Space Storage LLC -extraspace - -// fage : 2014-12-18 Fage International S.A. -fage - -// fail : 2014-03-06 Binky Moon, LLC -fail - -// fairwinds : 2014-11-13 FairWinds Partners, LLC -fairwinds - -// faith : 2014-11-20 dot Faith Limited -faith - -// family : 2015-04-02 United TLD Holdco Ltd. -family - -// fan : 2014-03-06 Asiamix Digital Limited -fan - -// fans : 2014-11-07 Asiamix Digital Limited -fans - -// farm : 2013-11-07 Binky Moon, LLC -farm - -// farmers : 2015-07-09 Farmers Insurance Exchange -farmers - -// fashion : 2014-07-03 Minds + Machines Group Limited -fashion - -// fast : 2014-12-18 Amazon Registry Services, Inc. -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 Canada Inc. -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 Binky Moon, LLC -finance - -// financial : 2014-03-06 Binky Moon, LLC -financial - -// fire : 2015-06-25 Amazon Registry Services, Inc. -fire - -// firestone : 2014-12-18 Bridgestone Licensing Services, Inc -firestone - -// firmdale : 2014-03-27 Firmdale Holdings Limited -firmdale - -// fish : 2013-12-12 Binky Moon, LLC -fish - -// fishing : 2013-11-21 Minds + Machines Group Limited -fishing - -// fit : 2014-11-07 Minds + Machines Group Limited -fit - -// fitness : 2014-03-06 Binky Moon, LLC -fitness - -// flickr : 2015-04-02 Yahoo! Domain Services Inc. -flickr - -// flights : 2013-12-05 Binky Moon, LLC -flights - -// flir : 2015-07-23 FLIR Systems, Inc. -flir - -// florist : 2013-11-07 Binky Moon, 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 Binky Moon, LLC -football - -// ford : 2014-11-13 Ford Motor Company -ford - -// forex : 2014-12-11 Dotforex Registry Limited -forex - -// forsale : 2014-05-22 United TLD Holdco Ltd. -forsale - -// forum : 2015-04-02 Fegistry, LLC -forum - -// foundation : 2013-12-05 Binky Moon, LLC -foundation - -// fox : 2015-09-11 FOX Registry, LLC -fox - -// free : 2015-12-10 Amazon Registry Services, Inc. -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 DotSpace Inc. -fun - -// fund : 2014-03-20 Binky Moon, LLC -fund - -// furniture : 2014-03-20 Binky Moon, LLC -furniture - -// futbol : 2013-09-20 United TLD Holdco Ltd. -futbol - -// fyi : 2015-04-02 Binky Moon, LLC -fyi - -// gal : 2013-11-07 Asociación puntoGAL -gal - -// gallery : 2013-09-13 Binky Moon, 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 United TLD Holdco Ltd. -games - -// gap : 2015-07-31 The Gap, Inc. -gap - -// garden : 2014-06-26 Minds + Machines Group 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 NV -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 DotGift, LLC -gift - -// gifts : 2014-07-03 Binky Moon, 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 Binky Moon, LLC -glass - -// gle : 2014-07-24 Charleston Road Registry Inc. -gle - -// global : 2014-04-17 Dot Global Domain Registry Limited -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 Binky Moon, LLC -gmbh - -// gmo : 2014-01-09 GMO Internet Pte. Ltd. -gmo - -// gmx : 2014-04-24 1&1 Mail & Media GmbH -gmx - -// godaddy : 2015-07-23 Go Daddy East, LLC -godaddy - -// gold : 2015-01-22 Binky Moon, LLC -gold - -// goldpoint : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -goldpoint - -// golf : 2014-12-18 Binky Moon, 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 Registry Services, Inc. -got - -// grainger : 2015-05-07 Grainger Registry Services, LLC -grainger - -// graphics : 2013-09-13 Binky Moon, LLC -graphics - -// gratis : 2014-03-20 Binky Moon, LLC -gratis - -// green : 2014-05-08 Afilias plc -green - -// gripe : 2014-03-06 Binky Moon, LLC -gripe - -// grocery : 2016-06-16 Wal-Mart Stores, Inc. -grocery - -// group : 2014-08-15 Binky Moon, 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 Binky Moon, LLC -guide - -// guitars : 2013-11-14 Uniregistry, Corp. -guitars - -// guru : 2013-08-27 Binky Moon, 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 United TLD Holdco Ltd. -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 Binky Moon, 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 Uniregistry, Corp. -hiv - -// hkt : 2015-05-14 PCCW-HKT DataCom Services Limited -hkt - -// hockey : 2015-03-19 Binky Moon, LLC -hockey - -// holdings : 2013-08-27 Binky Moon, LLC -holdings - -// holiday : 2013-11-07 Binky Moon, LLC -holiday - -// homedepot : 2015-04-02 Home Depot Product Authority, LLC -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 Minds + Machines Group Limited -horse - -// hospital : 2016-10-20 Binky Moon, LLC -hospital - -// host : 2014-04-17 DotHost Inc. -host - -// hosting : 2014-05-29 Uniregistry, Corp. -hosting - -// hot : 2015-08-27 Amazon Registry Services, Inc. -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 Binky Moon, LLC -house - -// how : 2014-01-23 Charleston Road Registry Inc. -how - -// hsbc : 2014-10-24 HSBC Global Services (UK) Limited -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 ShortDot SA -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 Registry Services, Inc. -imdb - -// immo : 2014-07-10 Binky Moon, LLC -immo - -// immobilien : 2013-11-07 United TLD Holdco Ltd. -immobilien - -// inc : 2018-03-10 GTLD Limited -inc - -// industries : 2013-12-05 Binky Moon, 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 Binky Moon, LLC -institute - -// insurance : 2015-02-19 fTLD Registry Services LLC -insurance - -// insure : 2014-03-20 Binky Moon, LLC -insure - -// intel : 2015-08-06 Intel Corporation -intel - -// international : 2013-11-07 Binky Moon, LLC -international - -// intuit : 2015-07-30 Intuit Administrative Services, Inc. -intuit - -// investments : 2014-03-20 Binky Moon, LLC -investments - -// ipiranga : 2014-08-28 Ipiranga Produtos de Petroleo S.A. -ipiranga - -// irish : 2014-08-07 Binky Moon, 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 - -// 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 Binky Moon, LLC -jetzt - -// jewelry : 2015-03-05 Binky Moon, LLC -jewelry - -// jio : 2015-04-02 Reliance Industries Limited -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 Registry Services, Inc. -jot - -// joy : 2014-12-18 Amazon Registry Services, Inc. -joy - -// jpmorgan : 2015-04-30 JPMorgan Chase Bank, National Association -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 plc -kim - -// kinder : 2014-11-07 Ferrero Trading Lux S.A. -kinder - -// kindle : 2015-06-25 Amazon Registry Services, Inc. -kindle - -// kitchen : 2013-09-20 Binky Moon, LLC -kitchen - -// kiwi : 2013-09-20 DOT KIWI LIMITED -kiwi - -// koeln : 2014-01-09 punkt.wien GmbH -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 Fundación Bancaria Caixa d’Estalvis i Pensions de Barcelona, “la Caixa†-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 Binky 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 United TLD Holdco Ltd. -lawyer - -// lds : 2014-03-20 IRI Domain Management, LLC ("Applicant") -lds - -// lease : 2014-03-06 Binky Moon, 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 Binky Moon, LLC -legal - -// lego : 2015-07-16 LEGO Juris A/S -lego - -// lexus : 2015-04-23 TOYOTA MOTOR CORPORATION -lexus - -// lgbt : 2014-05-08 Afilias plc -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 Binky Moon, 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 Binky Moon, LLC -lighting - -// like : 2014-12-18 Amazon Registry Services, Inc. -like - -// lilly : 2015-07-31 Eli Lilly and Company -lilly - -// limited : 2014-03-06 Binky Moon, LLC -limited - -// limo : 2013-10-17 Binky Moon, 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 United TLD Holdco Ltd. -live - -// living : 2015-07-30 Lifestyle Domain Holdings, Inc. -living - -// lixil : 2015-03-19 LIXIL Group Corporation -lixil - -// llc : 2017-12-14 Afilias plc -llc - -// loan : 2014-11-20 dot Loan Limited -loan - -// loans : 2014-03-20 Binky Moon, 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 plc -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 Binky Moon, LLC -ltd - -// ltda : 2014-04-17 InterNetX, Corp -ltda - -// lundbeck : 2015-08-06 H. Lundbeck A/S -lundbeck - -// lupin : 2014-11-07 LUPIN LIMITED -lupin - -// luxe : 2014-01-09 Minds + Machines Group 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 Binky Moon, LLC -maison - -// makeup : 2015-01-15 L'Oréal -makeup - -// man : 2014-12-04 MAN SE -man - -// management : 2013-11-07 Binky Moon, LLC -management - -// mango : 2013-10-24 PUNTO FA S.L. -mango - -// map : 2016-06-09 Charleston Road Registry Inc. -map - -// market : 2014-03-06 United TLD Holdco Ltd. -market - -// marketing : 2013-11-07 Binky Moon, LLC -marketing - -// markets : 2014-12-11 Dotmarkets Registry Limited -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 Binky Moon, LLC -mba - -// mckinsey : 2015-07-31 McKinsey Holdings, Inc. -mckinsey - -// med : 2015-08-06 Medistry LLC -med - -// media : 2014-03-06 Binky Moon, LLC -media - -// meet : 2014-01-16 Charleston Road Registry Inc. -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 - -// merckmsd : 2016-07-14 MSD Registry Holdings, Inc. -merckmsd - -// metlife : 2015-05-07 MetLife Services and Solutions, LLC -metlife - -// miami : 2013-12-19 Minds + Machines Group 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 Registry Services, Inc. -moi - -// mom : 2015-04-16 Uniregistry, Corp. -mom - -// monash : 2013-09-30 Monash University -monash - -// money : 2014-10-16 Binky Moon, 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 United TLD Holdco Ltd. -mortgage - -// moscow : 2013-12-19 Foundation for Assistance for Internet Technologies and Infrastructure Development (FAITID) -moscow - -// moto : 2015-06-04 Motorola Trademark Holdings, LLC -moto - -// motorcycles : 2014-01-09 DERMotorcycles, LLC -motorcycles - -// mov : 2014-01-30 Charleston Road Registry Inc. -mov - -// movie : 2015-02-05 Binky Moon, 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 - -// 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 Nadex Domains, Inc. -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 Binky Moon, LLC -network - -// neustar : 2013-12-05 Registry Services, LLC -neustar - -// new : 2014-01-30 Charleston Road Registry Inc. -new - -// newholland : 2015-09-03 CNH Industrial N.V. -newholland - -// news : 2014-12-18 United TLD Holdco Ltd. -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 Registry Services, Inc. -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 Top Level Spectrum, Inc. -observer - -// off : 2015-07-23 Johnson Shareholdings, Inc. -off - -// office : 2015-03-12 Microsoft Corporation -office - -// okinawa : 2013-12-05 BRregistry, 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 plc -organic - -// origins : 2015-10-01 The Estée Lauder Companies Inc. -origins - -// osaka : 2014-09-04 Osaka Registry 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 Binky Moon, LLC -partners - -// parts : 2013-12-05 Binky Moon, LLC -parts - -// party : 2014-09-11 Blue Sky Registry Limited -party - -// passagens : 2015-03-05 Travel Reservations SRL -passagens - -// pay : 2015-08-27 Amazon Registry Services, Inc. -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 Binky Moon, LLC -photography - -// photos : 2013-10-17 Binky Moon, 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 Binky Moon, LLC -pictures - -// pid : 2015-01-08 Top Level Spectrum, Inc. -pid - -// pin : 2014-12-18 Amazon Registry Services, Inc. -pin - -// ping : 2015-06-11 Ping Registry Provider, Inc. -ping - -// pink : 2013-10-01 Afilias plc -pink - -// pioneer : 2015-07-16 Pioneer Corporation -pioneer - -// pizza : 2014-06-26 Binky Moon, LLC -pizza - -// place : 2014-04-24 Binky Moon, LLC -place - -// play : 2015-03-05 Charleston Road Registry Inc. -play - -// playstation : 2015-07-02 Sony Computer Entertainment Inc. -playstation - -// plumbing : 2013-09-10 Binky Moon, LLC -plumbing - -// plus : 2015-02-05 Binky Moon, 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 plc -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 Registry Services, Inc. -prime - -// prod : 2014-01-23 Charleston Road Registry Inc. -prod - -// productions : 2013-12-05 Binky Moon, LLC -productions - -// prof : 2014-07-24 Charleston Road Registry Inc. -prof - -// progressive : 2015-07-23 Progressive Casualty Insurance Company -progressive - -// promo : 2014-12-18 Afilias plc -promo - -// properties : 2013-12-05 Binky Moon, LLC -properties - -// property : 2014-05-22 Uniregistry, Corp. -property - -// protection : 2015-04-23 XYZ.COM LLC -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 Registry Services, Inc. -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 Binky Moon, LLC -recipes - -// red : 2013-11-07 Afilias plc -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 Binky Moon, LLC -reise - -// reisen : 2014-03-06 Binky Moon, 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 XYZ.COM LLC -rent - -// rentals : 2013-12-05 Binky Moon, LLC -rentals - -// repair : 2013-11-07 Binky Moon, LLC -repair - -// report : 2013-12-05 Binky Moon, 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 Binky Moon, LLC -restaurant - -// review : 2014-11-20 dot Review Limited -review - -// reviews : 2013-09-13 United TLD Holdco Ltd. -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 United TLD Holdco Ltd. -rocks - -// rodeo : 2013-12-19 Minds + Machines Group Limited -rodeo - -// rogers : 2015-08-06 Rogers Communications Canada Inc. -rogers - -// room : 2014-12-18 Amazon Registry Services, Inc. -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 Binky Moon, LLC -run - -// rwe : 2015-04-02 RWE AG -rwe - -// ryukyu : 2014-01-09 BRregistry, Inc. -ryukyu - -// saarland : 2013-12-12 dotSaarland GmbH -saarland - -// safe : 2014-12-18 Amazon Registry Services, Inc. -safe - -// safety : 2015-01-08 Safety Registry Services, LLC. -safety - -// sakura : 2014-12-18 SAKURA Internet Inc. -sakura - -// sale : 2014-10-16 United TLD Holdco Ltd. -sale - -// salon : 2014-12-11 Binky Moon, 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 - -// sarl : 2014-07-03 Binky Moon, LLC -sarl - -// sas : 2015-04-02 Research IP LLC -sas - -// save : 2015-06-25 Amazon Registry Services, Inc. -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 Binky Moon, LLC -school - -// schule : 2014-03-06 Binky 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 Registry Services, Inc. -secure - -// security : 2015-05-14 XYZ.COM LLC -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 Binky Moon, 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 plc -shiksha - -// shoes : 2013-10-02 Binky Moon, LLC -shoes - -// shop : 2016-04-08 GMO Registry, Inc. -shop - -// shopping : 2016-03-31 Binky Moon, LLC -shopping - -// shouji : 2015-01-08 QIHOO 360 TECHNOLOGY CO. LTD. -shouji - -// show : 2015-03-05 Binky Moon, LLC -show - -// showtime : 2015-08-06 CBS Domains Inc. -showtime - -// shriram : 2014-01-23 Shriram Capital Ltd. -shriram - -// silk : 2015-06-25 Amazon Registry Services, Inc. -silk - -// sina : 2015-03-12 Sina Corporation -sina - -// singles : 2013-08-27 Binky Moon, LLC -singles - -// site : 2015-01-15 DotSite Inc. -site - -// ski : 2015-04-09 Afilias plc -ski - -// skin : 2015-01-15 L'Oréal -skin - -// sky : 2014-06-19 Sky International AG -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 Registry Services, Inc. -smile - -// sncf : 2015-02-19 Société Nationale des Chemins de fer Francais S N C F -sncf - -// soccer : 2015-03-26 Binky Moon, LLC -soccer - -// social : 2013-11-07 United TLD Holdco Ltd. -social - -// softbank : 2015-07-02 SoftBank Corp. -softbank - -// software : 2014-03-20 United TLD Holdco Ltd. -software - -// sohu : 2013-12-19 Sohu.com Limited -sohu - -// solar : 2013-11-07 Binky Moon, LLC -solar - -// solutions : 2013-11-07 Binky Moon, LLC -solutions - -// song : 2015-02-26 Amazon Registry Services, Inc. -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 - -// sport : 2017-11-16 Global Association of International Sports Federations (GAISF) -sport - -// spot : 2015-02-26 Amazon Registry Services, Inc. -spot - -// spreadbetting : 2014-12-11 Dotspreadbetting Registry Limited -spreadbetting - -// srl : 2015-05-07 InterNetX, Corp -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 XYZ.COM LLC -storage - -// store : 2015-04-09 DotStore Inc. -store - -// stream : 2016-01-08 dot Stream Limited -stream - -// studio : 2015-02-11 United TLD Holdco Ltd. -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 Ltd. -sucks - -// supplies : 2013-12-19 Binky Moon, LLC -supplies - -// supply : 2013-12-19 Binky Moon, LLC -supply - -// support : 2013-10-24 Binky Moon, LLC -support - -// surf : 2014-01-09 Minds + Machines Group Limited -surf - -// surgery : 2014-03-20 Binky Moon, 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 Binky Moon, LLC -systems - -// tab : 2014-12-04 Tabcorp Holdings Limited -tab - -// taipei : 2014-07-10 Taipei City Government -taipei - -// talk : 2015-04-09 Amazon Registry Services, Inc. -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 Binky Moon, LLC -tax - -// taxi : 2015-03-19 Binky Moon, 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 Binky Moon, LLC -team - -// tech : 2015-01-30 Personals TLD Inc. -tech - -// technology : 2013-09-13 Binky Moon, LLC -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 Binky Moon, LLC -tennis - -// teva : 2015-07-02 Teva Pharmaceutical Industries Limited -teva - -// thd : 2015-04-02 Home Depot Product Authority, LLC -thd - -// theater : 2015-03-19 Binky Moon, LLC -theater - -// theatre : 2015-05-07 XYZ.COM LLC -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 Binky Moon, LLC -tienda - -// tiffany : 2015-01-30 Tiffany and Company -tiffany - -// tips : 2013-09-20 Binky Moon, LLC -tips - -// tires : 2014-11-07 Binky Moon, 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 Binky Moon, LLC -today - -// tokyo : 2013-11-13 GMO Registry, Inc. -tokyo - -// tools : 2013-11-21 Binky Moon, LLC -tools - -// top : 2014-03-20 .TOP Registry -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 Binky Moon, LLC -tours - -// town : 2014-03-06 Binky Moon, LLC -town - -// toyota : 2015-04-23 TOYOTA MOTOR CORPORATION -toyota - -// toys : 2014-03-06 Binky Moon, LLC -toys - -// trade : 2014-01-23 Elite Registry Limited -trade - -// trading : 2014-12-11 Dottrading Registry Limited -trading - -// training : 2013-11-07 Binky Moon, LLC -training - -// travel : Dog Beach, LLC -travel - -// 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 NCC Group Inc. -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 Registry Services, Inc. -tunes - -// tushu : 2014-12-18 Amazon Registry Services, Inc. -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 Binky Moon, 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 Binky Moon, 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 Moon, LLC -ventures - -// verisign : 2015-08-13 VeriSign, Inc. -verisign - -// versicherung : 2014-03-20 TLD-BOX Registrydienstleistungen GmbH -versicherung - -// vet : 2014-03-06 United TLD Holdco Ltd. -vet - -// viajes : 2013-10-17 Binky Moon, LLC -viajes - -// video : 2014-10-16 United TLD Holdco Ltd. -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 Binky Moon, LLC -villas - -// vin : 2015-06-18 Binky Moon, 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 Binky Moon, 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 Minds + Machines Group 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 Binky Moon, 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 Wang Limited -wang - -// wanggou : 2014-12-18 Amazon Registry Services, Inc. -wanggou - -// warman : 2015-06-18 Weir Group IP Limited -warman - -// watch : 2013-11-14 Binky Moon, LLC -watch - -// watches : 2014-12-22 Richemont DNS Inc. -watches - -// weather : 2015-01-08 International Business Machines Corporation -weather - -// weatherchannel : 2015-03-12 International Business Machines Corporation -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 Minds + Machines Group 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 Binky Moon, 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 Minds + Machines Group Limited -work - -// works : 2013-11-14 Binky Moon, LLC -works - -// world : 2014-06-12 Binky Moon, LLC -world - -// wow : 2015-10-08 Amazon Registry Services, Inc. -wow - -// wtc : 2013-12-19 World Trade Centers Association, Inc. -wtc - -// wtf : 2014-03-06 Binky Moon, 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 Registry Services, Inc. -セール - -// 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 Gemini Ltd -å…«å¦ - -// xn--4gbrim : 2013-10-04 Suhub Electronic Establishment -موقع - -// xn--55qw42g : 2013-11-08 China Organizational Name Administration Center -公益 - -// xn--55qx5d : 2013-11-14 China Internet Network Information Center (CNNIC) -å…¬å¸ - -// 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 plc -移动 - -// 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 Registry Services, Inc. -ファッション - -// xn--c1avg : 2013-11-14 Public Interest Registry -орг - -// xn--c2br7g : 2015-01-15 VeriSign Sarl -नेट - -// xn--cck2b3b : 2015-02-26 Amazon Registry Services, Inc. -ストア - -// 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 Binky Moon, LLC -商店 - -// xn--czru2d : 2013-11-21 Zodiac Aquarius Limited -商城 - -// xn--d1acj3b : 2013-11-20 The Foundation for Network Initiatives “The Smart Internet†-дети - -// xn--eckvdtc9d : 2014-12-18 Amazon Registry Services, Inc. -ãƒã‚¤ãƒ³ãƒˆ - -// xn--efvy88h : 2014-08-22 Guangzhou YU Wei Information Technology Co., Ltd. -æ–°é—» - -// xn--estv75g : 2015-02-19 Industrial and Commercial Bank of China Limited -工行 - -// xn--fct429k : 2015-04-09 Amazon Registry Services, Inc. -å®¶é›» - -// 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 Binky Moon, 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 Registry Services, Inc. -クラウド - -// xn--gk3at1e : 2015-10-08 Amazon Registry Services, Inc. -通販 - -// xn--hxt814e : 2014-05-15 Zodiac Taurus 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 China Internet Network Information Center (CNNIC) -网络 - -// xn--j1aef : 2015-01-15 VeriSign Sarl -ком - -// xn--jlq61u9w7b : 2015-01-08 Nokia Corporation -诺基亚 - -// xn--jvr189m : 2015-02-26 Amazon Registry Services, Inc. -é£Ÿå“ - -// 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--otu796d : 2017-08-06 Dot Trademark TLD Holding Company 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 Registry Services, Inc. -æ›¸ç± - -// xn--ses554g : 2014-01-16 KNET Co., Ltd. -ç½‘å€ - -// 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 Binky Moon, 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 Binky Moon, 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 -政务 - -// 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 Registry Services, Inc. -yamaxun - -// yandex : 2014-04-10 YANDEX, LLC -yandex - -// yodobashi : 2014-11-20 YODOBASHI CAMERA CO.,LTD. -yodobashi - -// yoga : 2014-05-29 Minds + Machines Group Limited -yoga - -// yokohama : 2013-12-12 GMO Registry, Inc. -yokohama - -// you : 2015-04-09 Amazon Registry Services, Inc. -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 Registry Services, Inc. -zappos - -// zara : 2014-11-07 Industria de Diseño Textil, S.A. (INDITEX, S.A.) -zara - -// zero : 2014-12-18 Amazon Registry Services, Inc. -zero - -// zip : 2014-05-08 Charleston Road Registry Inc. -zip - -// zippo : 2015-07-02 Zadco Company -zippo - -// zone : 2013-11-14 Binky Moon, 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-northeast-3.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 -eu-west-3.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-eu-west-3.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.eu-west-3.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.eu-west-3.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.eu-west-3.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 - -// Blackbaud, Inc. : https://www.blackbaud.com -// Submitted by Paul Crowder -blackbaudcdn.net - -// 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.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 - -// Clever Cloud : https://www.clever-cloud.com/ -// Submitted by Quentin Adam -cleverapps.io - -// Cloud66 : https://www.cloud66.com/ -// Submitted by Khash Sajadi -c66.me -cloud66.ws - -// 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 - -// Co & Co : https://co-co.nl/ -// Submitted by Govert Versluis -*.otap.co - -// 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 - -// Cloudeity Inc : https://cloudeity.com -// Submitted by Stefan Dimitrov -cloudeity.net - -// CNPY : https://cnpy.gdn -// Submitted by Angelo Gladding -cnpy.gdn - -// CoDNS B.V. -co.nl -co.no - -// Combell.com : https://www.combell.com -// Submitted by Thomas Wouters -webhosting.be -hosting-cluster.nl - -// 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 - -// Datto, Inc. : https://www.datto.com/ -// Submitted by Philipp Heckel -dattolocal.com -dattorelay.com -dattoweb.com -mydatto.com -dattolocal.net -mydatto.net - -// 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 - -// dnstrace.pro : https://dnstrace.pro/ -// Submitted by Chris Partridge -bci.dnstrace.pro - -// 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 - -// FASTVPS EESTI OU : https://fastvps.ru/ -// Submitted by Likhachev Vasiliy -fastpanel.direct -fastvps-server.com - -// 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 -app.os.fedoraproject.org -app.os.stg.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 - -// freedesktop.org : https://www.freedesktop.org -// Submitted by Daniel Stone -freedesktop.org - -// Futureweb OG : http://www.futureweb.at -// Submitted by Andreas Schnederle-Wagner -*.futurecms.at -*.ex.futurecms.at -*.in.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 -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 - -// Hibernating Rhinos -// Submitted by Oren Eini -myravendb.com -ravendb.community -ravendb.me -development.run -ravendb.run - -// 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 - -// IServ GmbH : https://iserv.eu -// Submitted by Kim-Alexander Brodowski -mein-iserv.de -test-iserv.de - -// Jino : https://www.jino.ru -// Submitted by Sergey Ulyashin -myjino.ru -*.hosting.myjino.ru -*.landing.myjino.ru -*.spectrum.myjino.ru -*.vps.myjino.ru - -// 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 - -// Lightmaker Property Manager, Inc. : https://app.lmpm.com/ -// Submitted by Greg Holland -app.lmpm.com - -// Linki Tools UG : https://linki.tools -// Submitted by Paulo Matos -linkitools.space - -// linkyard ldt: https://www.linkyard.ch/ -// Submitted by Mario Siegenthaler -linkyard.cloud -linkyard-cloud.ch - -// LiquidNet Ltd : http://www.liquidnetlimited.com/ -// Submitted by Victor Velchev -we.bs - -// Lug.org.uk : https://lug.org.uk -// Submitted by Jon Spriggs -uklugs.org -glug.org.uk -lug.org.uk -lugs.org.uk - -// Lukanet Ltd : https://lukanet.com -// Submitted by Anton Avramov -barsy.bg -barsy.co.uk -barsyonline.co.uk -barsycenter.com -barsyonline.com -barsy.club -barsy.de -barsy.eu -barsy.in -barsy.info -barsy.io -barsy.me -barsy.menu -barsy.mobi -barsy.net -barsy.online -barsy.org -barsy.pro -barsy.pub -barsy.shop -barsy.site -barsy.support -barsy.uk - -// Magento Commerce -// Submitted by Damien Tournoud -*.magentosite.cloud - -// May First - People Link : https://mayfirst.org/ -// Submitted by Jamie McClelland -mayfirst.info -mayfirst.org - -// Mail.Ru Group : https://hb.cldmail.ru -// Submitted by Ilya Zaretskiy -hb.cldmail.ru - -// Memset hosting : https://www.memset.com -// Submitted by Tom Whitwell -miniserver.com -memset.net - -// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ -// Submitted by ZdenÄ›k Å ustr -cloud.metacentrum.cz -custom.metacentrum.cz - -// MetaCentrum, CESNET z.s.p.o. : https://www.metacentrum.cz/en/ -// Submitted by Radim JanÄa -flt.cloud.muni.cz -usr.cloud.muni.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 Corporation : http://microsoft.com -// Submitted by Justin Luk -azurecontainer.io -azurewebsites.net -azure-mobile.net -cloudapp.net - -// Mozilla Corporation : https://mozilla.com -// Submitted by Ben Francis -mozilla-iot.org - -// 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 - -// Nimbus Hosting Ltd. : https://www.nimbushosting.co.uk/ -// Submitted by Nicholas Ford -nh-serv.co.uk - -// NFSN, Inc. : https://www.NearlyFreeSpeech.NET/ -// Submitted by Jeff Wheelhouse -nfshost.com - -// Now-DNS : https://now-dns.com -// Submitted by Steve Russell -dnsking.ch -mypi.co -n4t.co -001www.com -ddnslive.com -myiphost.com -forumz.info -16-b.it -32-b.it -64-b.it -soundcast.me -tcp4.me -dnsup.net -hicam.net -now-dns.net -ownip.net -vpndns.net -dynserv.org -now-dns.org -x443.pw -now-dns.top -ntdll.top -freeddns.us -crafting.xyz -zapto.xyz - -// 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 - -// Nucleos Inc. : https://nucleos.com -// Submitted by Piotr Zduniak -pcloud.host - -// NYC.mn : http://www.information.nyc.mn -// Submitted by Matthew Brown -nyc.mn - -// NymNom : https://nymnom.com/ -// Submitted by Dave McCormack -nom.ae -nom.af -nom.ai -nom.al -nym.by -nym.bz -nom.cl -nom.gd -nom.ge -nom.gl -nym.gr -nom.gt -nym.gy -nom.hn -nym.ie -nom.im -nom.ke -nym.kz -nym.la -nym.lc -nom.li -nym.li -nym.lt -nym.lu -nym.me -nom.mk -nym.mn -nym.mx -nom.nu -nym.nz -nym.pe -nym.pt -nom.pw -nom.qa -nym.ro -nom.rs -nom.si -nym.sk -nom.st -nym.su -nym.sx -nom.tj -nym.tw -nom.ug -nom.uy -nom.vc -nom.vg - -// Octopodal Solutions, LLC. : https://ulterius.io/ -// Submitted by Andrew Sampson -cya.gg - -// Omnibond Systems, LLC. : https://www.omnibond.com -// Submitted by Cole Estep -cloudycluster.net - -// 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 GmbH: http://www.ownprovider.com -// Submitted by Jan Moennich -ownprovider.com -own.pm - -// OX : http://www.ox.rs -// Submitted by Adam Grand -ox.rs - -// 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 - -// Russian Academy of Sciences -// Submitted by Tech Support -ras.ru - -// 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 - -// Resin.io : https://resin.io -// Submitted by Tim Perry -resindevice.io -devices.resinstaging.io - -// 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 - -// schokokeks.org GbR : https://schokokeks.org/ -// Submitted by Hanno Böck -schokokeks.net - -// Scry Security : http://www.scrysec.com -// Submitted by Shante Adam -scrysec.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 -*.s5y.io -*.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 - -// SpeedPartner GmbH: https://www.speedpartner.de/ -// Submitted by Stefan Neufeind -customer.speedpartner.de - -// Storj Labs Inc. : https://storj.io/ -// Submitted by Philip Hutchins -storj.farm - -// Studenten Net Twente : http://www.snt.utwente.nl/ -// Submitted by Silke Hofstra -utwente.io - -// 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 - -// The Gwiddle Foundation : https://gwiddlefoundation.org.uk -// Submitted by Joshua Bayfield -gwiddle.co.uk - -// 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 : https://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 -*.uberspace.de - -// UDR Limited : http://www.udr.hk.com -// Submitted by registry -hk.com -hk.org -ltd.hk -inc.hk - -// United Gameserver GmbH : https://united-gameserver.de -// Submitted by Stefan Schwarz -virtualuser.de -virtual-user.de - -// .US -// Submitted by Ed Moore -lib.de.us - -// VeryPositive SIA : http://very.lv -// Submitted by Danko Aleksejevs -2038.io - -// 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 - -// XenonCloud GbR: https://xenoncloud.net -// Submitted by Julian Uphoff -half.host - -// XnBay Technology : http://www.xnbay.com/ -// Submitted by XnBay Developer -xnbay.com -u2.xnbay.com -u2-local.xnbay.com - -// XS4ALL Internet bv : https://www.xs4all.nl/ -// Submitted by Daniel Mostertman -cistron.nl -demon.nl -xs4all.space - -// YesCourse Pty Ltd : https://yescourse.com -// Submitted by Atul Bhouraskar -official.academy - -// 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 - -// Yunohost : https://yunohost.org -// Submitted by Valentin Grimaud -nohost.me -noho.st - -// ZaNiC : http://www.za.net/ -// Submitted by registry -za.net -za.org - -// Zeit, Inc. : https://zeit.domains/ -// Submitted by Olli Vanhoja -now.sh - -// Zone.id : https://zone.id/ -// Submitted by Su Hendro -zone.id - -// ===END PRIVATE DOMAINS=== diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix.rb deleted file mode 100644 index c94eb66..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix.rb +++ /dev/null @@ -1,175 +0,0 @@ -# = Public Suffix -# -# Domain name parser based on the Public Suffix List. -# -# Copyright (c) 2009-2018 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.3/lib/public_suffix/domain.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/domain.rb deleted file mode 100644 index 07ca889..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/domain.rb +++ /dev/null @@ -1,233 +0,0 @@ -# = Public Suffix -# -# Domain name parser based on the Public Suffix List. -# -# Copyright (c) 2009-2018 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. - # - # @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.3/lib/public_suffix/errors.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/errors.rb deleted file mode 100644 index 687befb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/errors.rb +++ /dev/null @@ -1,39 +0,0 @@ -# = Public Suffix -# -# Domain name parser based on the Public Suffix List. -# -# Copyright (c) 2009-2018 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.3/lib/public_suffix/list.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/list.rb deleted file mode 100644 index 605a918..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/list.rb +++ /dev/null @@ -1,243 +0,0 @@ -# = Public Suffix -# -# Domain name parser based on the Public Suffix List. -# -# Copyright (c) 2009-2018 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 # rubocop:disable Style/AccessModifierDeclarations - - # 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.3/lib/public_suffix/rule.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/rule.rb deleted file mode 100644 index ec2ecd0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/rule.rb +++ /dev/null @@ -1,348 +0,0 @@ -# = Public Suffix -# -# Domain name parser based on the Public Suffix List. -# -# Copyright (c) 2009-2018 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.3/lib/public_suffix/version.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/version.rb deleted file mode 100644 index 85fc0e6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/lib/public_suffix/version.rb +++ /dev/null @@ -1,10 +0,0 @@ -# = Public Suffix -# -# Domain name parser based on the Public Suffix List. -# -# Copyright (c) 2009-2018 Simone Carletti - -module PublicSuffix - # The current library version. - VERSION = "3.0.3".freeze -end diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/public_suffix.gemspec b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/public_suffix.gemspec deleted file mode 100644 index 44bfccf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/public_suffix.gemspec +++ /dev/null @@ -1,25 +0,0 @@ -# -*- 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.3/test/.empty b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/.empty deleted file mode 100644 index e322015..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/.empty +++ /dev/null @@ -1,2 +0,0 @@ -# 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.3/test/acceptance_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/acceptance_test.rb deleted file mode 100644 index ce53bb8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/acceptance_test.rb +++ /dev/null @@ -1,127 +0,0 @@ -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.bd", 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.3/test/benchmarks/bm_find.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_find.rb deleted file mode 100644 index 0074f1d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_find.rb +++ /dev/null @@ -1,66 +0,0 @@ -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.3/test/benchmarks/bm_find_all.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_find_all.rb deleted file mode 100644 index 0bcfd42..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_find_all.rb +++ /dev/null @@ -1,102 +0,0 @@ -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.3/test/benchmarks/bm_names.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_names.rb deleted file mode 100644 index 36b2bce..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_names.rb +++ /dev/null @@ -1,91 +0,0 @@ -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.3/test/benchmarks/bm_select.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_select.rb deleted file mode 100644 index 66d908b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_select.rb +++ /dev/null @@ -1,26 +0,0 @@ -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.3/test/benchmarks/bm_select_incremental.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_select_incremental.rb deleted file mode 100644 index f002c82..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_select_incremental.rb +++ /dev/null @@ -1,25 +0,0 @@ -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.3/test/benchmarks/bm_valid.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_valid.rb deleted file mode 100644 index a484451..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/benchmarks/bm_valid.rb +++ /dev/null @@ -1,101 +0,0 @@ -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.3/test/profilers/domain_profiler.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/domain_profiler.rb deleted file mode 100644 index 1ed1050..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/domain_profiler.rb +++ /dev/null @@ -1,12 +0,0 @@ -$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.3/test/profilers/find_profiler.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/find_profiler.rb deleted file mode 100644 index 53d28eb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/find_profiler.rb +++ /dev/null @@ -1,12 +0,0 @@ -$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.3/test/profilers/find_profiler_jp.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/find_profiler_jp.rb deleted file mode 100644 index 65c13fe..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/find_profiler_jp.rb +++ /dev/null @@ -1,12 +0,0 @@ -$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.3/test/profilers/initialization_profiler.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/initialization_profiler.rb deleted file mode 100644 index 008b1e7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/initialization_profiler.rb +++ /dev/null @@ -1,11 +0,0 @@ -$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.3/test/profilers/list_profsize.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/list_profsize.rb deleted file mode 100644 index 0b98b4b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/list_profsize.rb +++ /dev/null @@ -1,11 +0,0 @@ -$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.3/test/profilers/object_binsize.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/object_binsize.rb deleted file mode 100644 index dc60bdb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/profilers/object_binsize.rb +++ /dev/null @@ -1,57 +0,0 @@ -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.3/test/psl_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/psl_test.rb deleted file mode 100644 index 004eb26..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/psl_test.rb +++ /dev/null @@ -1,49 +0,0 @@ -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("..", __dir__) - - # 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 Security/Eval - - - 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.3/test/test_helper.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/test_helper.rb deleted file mode 100644 index 55a9643..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/test_helper.rb +++ /dev/null @@ -1,13 +0,0 @@ -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", __dir__) -require "public_suffix" diff --git a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/tests.txt b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/tests.txt deleted file mode 100644 index b11150a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/tests.txt +++ /dev/null @@ -1,98 +0,0 @@ -// 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.3/test/unit/domain_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/domain_test.rb deleted file mode 100644 index 509ce1b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/domain_test.rb +++ /dev/null @@ -1,104 +0,0 @@ -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.3/test/unit/errors_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/errors_test.rb deleted file mode 100644 index 47ac592..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/errors_test.rb +++ /dev/null @@ -1,23 +0,0 @@ -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.3/test/unit/list_test.rb b/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/list_test.rb deleted file mode 100644 index 693945d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/public_suffix-3.0.3/test/unit/list_test.rb +++ /dev/null @@ -1,239 +0,0 @@ -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.3/Rakefile b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/Rakefile deleted file mode 100644 index 53a08a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/Rakefile +++ /dev/null @@ -1,33 +0,0 @@ -# -*- 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.3/bin/fsevent_watch b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/bin/fsevent_watch deleted file mode 100755 index 889204f817bb1d78d27a44090b3deff259732162..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 42376 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 diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/LICENSE b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/LICENSE deleted file mode 100644 index a35e195..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -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.3/ext/fsevent_watch/FSEventsFix.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/FSEventsFix.c deleted file mode 100644 index 60e3d37..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/FSEventsFix.c +++ /dev/null @@ -1,626 +0,0 @@ -/* - * 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.3/ext/fsevent_watch/FSEventsFix.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/FSEventsFix.h deleted file mode 100644 index b70b880..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/FSEventsFix.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * 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.3/ext/fsevent_watch/TSICTString.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/TSICTString.c deleted file mode 100644 index 6e033d0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/TSICTString.c +++ /dev/null @@ -1,373 +0,0 @@ -// -// 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.3/ext/fsevent_watch/TSICTString.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/TSICTString.h deleted file mode 100644 index daf085c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/TSICTString.h +++ /dev/null @@ -1,74 +0,0 @@ -// -// 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.3/ext/fsevent_watch/cli.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/cli.c deleted file mode 100644 index 6d36dd1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/cli.c +++ /dev/null @@ -1,201 +0,0 @@ -#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.3/ext/fsevent_watch/cli.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/cli.h deleted file mode 100644 index 2164995..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/cli.h +++ /dev/null @@ -1,45 +0,0 @@ -#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.3/ext/fsevent_watch/common.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/common.h deleted file mode 100644 index b2d3e4e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/common.h +++ /dev/null @@ -1,22 +0,0 @@ -#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.3/ext/fsevent_watch/compat.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/compat.c deleted file mode 100644 index 5f51baf..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/compat.c +++ /dev/null @@ -1,41 +0,0 @@ -#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.3/ext/fsevent_watch/compat.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/compat.h deleted file mode 100644 index 757b413..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/compat.h +++ /dev/null @@ -1,100 +0,0 @@ -/** - * @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.3/ext/fsevent_watch/defines.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/defines.h deleted file mode 100644 index 6f6e87b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/defines.h +++ /dev/null @@ -1,40 +0,0 @@ -#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.3/ext/fsevent_watch/main.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/main.c deleted file mode 100644 index b18596a..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/main.c +++ /dev/null @@ -1,548 +0,0 @@ -#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.3/ext/fsevent_watch/signal_handlers.c b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/signal_handlers.c deleted file mode 100644 index b20da3f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/signal_handlers.c +++ /dev/null @@ -1,66 +0,0 @@ -#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.3/ext/fsevent_watch/signal_handlers.h b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/signal_handlers.h deleted file mode 100644 index c31685d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/fsevent_watch/signal_handlers.h +++ /dev/null @@ -1,16 +0,0 @@ -/** - * @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.3/ext/rakefile.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/rakefile.rb deleted file mode 100644 index d7789bd..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/ext/rakefile.rb +++ /dev/null @@ -1,226 +0,0 @@ -# -*- 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.3/lib/otnetstring.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/otnetstring.rb deleted file mode 100644 index cd8de4c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/otnetstring.rb +++ /dev/null @@ -1,85 +0,0 @@ -# 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.3/lib/rb-fsevent.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent.rb deleted file mode 100644 index 1ff68a3..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent.rb +++ /dev/null @@ -1,3 +0,0 @@ -# -*- 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.3/lib/rb-fsevent/fsevent.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent/fsevent.rb deleted file mode 100644 index 23c5aa9..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent/fsevent.rb +++ /dev/null @@ -1,157 +0,0 @@ -# -*- 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_nonblock(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.3/lib/rb-fsevent/version.rb b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent/version.rb deleted file mode 100644 index ced7151..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/lib/rb-fsevent/version.rb +++ /dev/null @@ -1,5 +0,0 @@ -# -*- encoding: utf-8 -*- - -class FSEvent - VERSION = '0.10.3' -end diff --git a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/rb-fsevent.gemspec b/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/rb-fsevent.gemspec deleted file mode 100644 index a7370db..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-fsevent-0.10.3/rb-fsevent.gemspec +++ /dev/null @@ -1,27 +0,0 @@ -# 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 deleted file mode 100644 index db868c7..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.gitignore +++ /dev/null @@ -1,19 +0,0 @@ -*.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 deleted file mode 100644 index 014f847..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -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 deleted file mode 100644 index cd347c5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/.yardopts +++ /dev/null @@ -1,4 +0,0 @@ ---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 deleted file mode 100644 index fa75df1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Gemfile +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index 5c38acb..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/README.md +++ /dev/null @@ -1,103 +0,0 @@ -# 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 deleted file mode 100644 index bc3a3b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/Rakefile +++ /dev/null @@ -1,14 +0,0 @@ -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 deleted file mode 100644 index 8897aef..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify.rb +++ /dev/null @@ -1,15 +0,0 @@ -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 deleted file mode 100644 index afee709..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/errors.rb +++ /dev/null @@ -1,3 +0,0 @@ -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 deleted file mode 100644 index 11701ac..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/event.rb +++ /dev/null @@ -1,146 +0,0 @@ -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 deleted file mode 100644 index ee51f7c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native.rb +++ /dev/null @@ -1,36 +0,0 @@ -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 deleted file mode 100644 index 5640130..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/native/flags.rb +++ /dev/null @@ -1,94 +0,0 @@ -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 deleted file mode 100644 index 043bc20..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/notifier.rb +++ /dev/null @@ -1,339 +0,0 @@ -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 deleted file mode 100644 index 661eb1c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/version.rb +++ /dev/null @@ -1,24 +0,0 @@ -# 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 deleted file mode 100644 index 1205e2d..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/lib/rb-inotify/watcher.rb +++ /dev/null @@ -1,88 +0,0 @@ -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 deleted file mode 100644 index 1dbc777..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/rb-inotify.gemspec +++ /dev/null @@ -1,30 +0,0 @@ -# -*- 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 deleted file mode 100644 index f2f5e3e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify/errors_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index b73ea30..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/rb-inotify_spec.rb +++ /dev/null @@ -1,9 +0,0 @@ -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 deleted file mode 100644 index 7dceb7b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rb-inotify-0.9.10/spec/spec_helper.rb +++ /dev/null @@ -1,12 +0,0 @@ - -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-2.2.1/Gemfile b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/Gemfile deleted file mode 100644 index cf9c0a1..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/Gemfile +++ /dev/null @@ -1,26 +0,0 @@ -source 'http://rubygems.org' - -gemspec - -gem 'bundler', '~> 1.15' -gem 'rake', '~> 12.0' - -gem 'minitest', '~> 4.0' -gem 'wrong' - -gem 'rubocop', '~> 0.49.1' if RUBY_VERSION >= '2.0.0' - -# 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-2.2.1/LICENSE b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/LICENSE deleted file mode 100644 index 660592c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/LICENSE +++ /dev/null @@ -1,186 +0,0 @@ -# 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-2.2.1/bin/rougify b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/bin/rougify deleted file mode 100755 index a7d7df2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/bin/rougify +++ /dev/null @@ -1,17 +0,0 @@ -#!/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-2.2.1/lib/rouge.rb b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge.rb deleted file mode 100644 index 8ef3161..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge.rb +++ /dev/null @@ -1,80 +0,0 @@ -# -*- 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/guesser.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/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/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-2.2.1/lib/rouge/cli.rb b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/cli.rb deleted file mode 100644 index d818d17..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/cli.rb +++ /dev/null @@ -1,395 +0,0 @@ -# -*- 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, 'r:utf-8') - when String - File.new(input, 'r: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 %| 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 - 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 - - 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-2.2.1/lib/rouge/demos/abap b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/abap deleted file mode 100644 index 1f0171b..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/abap +++ /dev/null @@ -1,6 +0,0 @@ -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-2.2.1/lib/rouge/demos/actionscript b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/actionscript deleted file mode 100644 index f081e25..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/actionscript +++ /dev/null @@ -1,4 +0,0 @@ -function hello(name:String):void -{ - trace("hello " + name); -} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/apache b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/apache deleted file mode 100644 index ce3e5fc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/apache +++ /dev/null @@ -1,21 +0,0 @@ -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-2.2.1/lib/rouge/demos/apiblueprint b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/apiblueprint deleted file mode 100644 index 25dc577..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/apiblueprint +++ /dev/null @@ -1,33 +0,0 @@ -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-2.2.1/lib/rouge/demos/applescript b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/applescript deleted file mode 100644 index c824919..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/applescript +++ /dev/null @@ -1,2 +0,0 @@ --- AppleScript playing with iTunes -tell application "iTunes" to get current selection diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/awk b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/awk deleted file mode 100644 index fb6ca72..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/awk +++ /dev/null @@ -1,4 +0,0 @@ -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-2.2.1/lib/rouge/demos/biml b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/biml deleted file mode 100644 index e4d5f68..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/biml +++ /dev/null @@ -1,38 +0,0 @@ -<#@ 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-2.2.1/lib/rouge/demos/bsl b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/bsl deleted file mode 100644 index a71bca2..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/bsl +++ /dev/null @@ -1,7 +0,0 @@ -#ОблаÑть ÐŸÑ€Ð¾Ð³Ñ€Ð°Ð¼Ð¼Ð½Ñ‹Ð¹Ð˜Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ - -Процедура ПриветМир() ЭкÑпорт - Сообщить("Привет мир"); -КонецПроцедуры - -#КонецОблаÑти \ No newline at end of file diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/c b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/c deleted file mode 100644 index 34771c8..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/c +++ /dev/null @@ -1,8 +0,0 @@ -#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-2.2.1/lib/rouge/demos/ceylon b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/ceylon deleted file mode 100644 index fcf19e0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/ceylon +++ /dev/null @@ -1,7 +0,0 @@ -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-2.2.1/lib/rouge/demos/cfscript b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cfscript deleted file mode 100644 index 9006416..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cfscript +++ /dev/null @@ -1,18 +0,0 @@ -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-2.2.1/lib/rouge/demos/clojure b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/clojure deleted file mode 100644 index a9b682e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/clojure +++ /dev/null @@ -1,5 +0,0 @@ -(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-2.2.1/lib/rouge/demos/cmake b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cmake deleted file mode 100644 index 89fcc51..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cmake +++ /dev/null @@ -1,7 +0,0 @@ -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-2.2.1/lib/rouge/demos/coffeescript b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/coffeescript deleted file mode 100644 index a562db6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/coffeescript +++ /dev/null @@ -1,5 +0,0 @@ -# Objects: -math = - root: Math.sqrt - square: square - cube: (x) -> x * square x diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/common_lisp b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/common_lisp deleted file mode 100644 index c6d2861..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/common_lisp +++ /dev/null @@ -1 +0,0 @@ -(defun square (x) (* x x)) diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/conf b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/conf deleted file mode 100644 index 5386d4e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/conf +++ /dev/null @@ -1,4 +0,0 @@ -# A generic configuration file -option1 "val1" -option2 23 -option3 'val3' diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/console b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/console deleted file mode 100644 index 9d6ed1c..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/console +++ /dev/null @@ -1,6 +0,0 @@ -# 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-2.2.1/lib/rouge/demos/coq b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/coq deleted file mode 100644 index 1d8d68f..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/coq +++ /dev/null @@ -1,13 +0,0 @@ -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-2.2.1/lib/rouge/demos/cpp b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cpp deleted file mode 100644 index c20cf27..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/cpp +++ /dev/null @@ -1,8 +0,0 @@ -#include - -using namespace std; - -int main() -{ - cout << "Hello World" << endl; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/csharp b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/csharp deleted file mode 100644 index 04e4a8e..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/csharp +++ /dev/null @@ -1,5 +0,0 @@ -// 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-2.2.1/lib/rouge/demos/css b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/css deleted file mode 100644 index 0d1fe74..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/css +++ /dev/null @@ -1,4 +0,0 @@ -body { - font-size: 12pt; - background: #fff url(temp.png) top left no-repeat; -} diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/d b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/d deleted file mode 100644 index 65d4945..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/d +++ /dev/null @@ -1,16 +0,0 @@ -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-2.2.1/lib/rouge/demos/dart b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/dart deleted file mode 100644 index 4b40da5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/dart +++ /dev/null @@ -1,6 +0,0 @@ -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-2.2.1/lib/rouge/demos/diff b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/diff deleted file mode 100644 index ab4f316..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/diff +++ /dev/null @@ -1,7 +0,0 @@ ---- 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-2.2.1/lib/rouge/demos/digdag b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/digdag deleted file mode 100644 index f7dbad0..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/digdag +++ /dev/null @@ -1,19 +0,0 @@ -# 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-2.2.1/lib/rouge/demos/docker b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/docker deleted file mode 100644 index 656d2bc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/docker +++ /dev/null @@ -1,9 +0,0 @@ -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-2.2.1/lib/rouge/demos/dot b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/dot deleted file mode 100644 index 243ee73..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/dot +++ /dev/null @@ -1,5 +0,0 @@ -// 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-2.2.1/lib/rouge/demos/eiffel b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/eiffel deleted file mode 100644 index ec025cc..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/eiffel +++ /dev/null @@ -1,30 +0,0 @@ -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-2.2.1/lib/rouge/demos/elixir b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/elixir deleted file mode 100644 index f81d641..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/elixir +++ /dev/null @@ -1 +0,0 @@ -Enum.map([1,2,3], fn(x) -> x * 2 end) diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erb b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erb deleted file mode 100644 index 1f922b6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erb +++ /dev/null @@ -1 +0,0 @@ -<%= @title %> diff --git a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erlang b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erlang deleted file mode 100644 index c942b60..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/erlang +++ /dev/null @@ -1,7 +0,0 @@ -%%% 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-2.2.1/lib/rouge/demos/factor b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/factor deleted file mode 100644 index 2538dff..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/factor +++ /dev/null @@ -1,5 +0,0 @@ -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-2.2.1/lib/rouge/demos/fortran b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/fortran deleted file mode 100644 index 4fc52c5..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/fortran +++ /dev/null @@ -1,22 +0,0 @@ -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-2.2.1/lib/rouge/demos/fsharp b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/fsharp deleted file mode 100644 index b1812ee..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/fsharp +++ /dev/null @@ -1,12 +0,0 @@ -(* 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-2.2.1/lib/rouge/demos/gherkin b/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/gherkin deleted file mode 100644 index 78e4ba6..0000000 --- a/vendor/bundle/ruby/2.3.0/gems/rouge-2.2.1/lib/rouge/demos/gherkin +++ /dev/null @@ -1,17 +0,0 @@ -# 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

    !7Fi3nfV_u= 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