ffi 1.9.23 → 1.9.24

Sign up to get free protection for your applications and to get access to all the features.
Files changed (78) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGELOG.md +66 -0
  3. data/Rakefile +1 -1
  4. data/ext/ffi_c/Call.c +5 -2
  5. data/ext/ffi_c/Function.c +8 -5
  6. data/ext/ffi_c/Thread.c +1 -0
  7. data/ext/ffi_c/extconf.rb +1 -0
  8. data/ext/ffi_c/libffi/.appveyor.yml +6 -4
  9. data/ext/ffi_c/libffi/.github/issue_template.md +10 -0
  10. data/ext/ffi_c/libffi/.gitignore +2 -0
  11. data/ext/ffi_c/libffi/.travis.yml +20 -16
  12. data/ext/ffi_c/libffi/.travis/ar-lib +270 -0
  13. data/ext/ffi_c/libffi/.travis/build.sh +34 -0
  14. data/ext/ffi_c/libffi/.travis/compile +351 -0
  15. data/ext/ffi_c/libffi/.travis/install.sh +11 -3
  16. data/ext/ffi_c/libffi/.travis/moxie-sim.exp +60 -0
  17. data/ext/ffi_c/libffi/.travis/site.exp +18 -0
  18. data/ext/ffi_c/libffi/LICENSE-BUILDTOOLS +352 -0
  19. data/ext/ffi_c/libffi/Makefile.am +4 -45
  20. data/ext/ffi_c/libffi/{README → README.md} +237 -230
  21. data/ext/ffi_c/libffi/configure.ac +10 -8
  22. data/ext/ffi_c/libffi/configure.host +5 -0
  23. data/ext/ffi_c/libffi/include/ffi.h.in +48 -26
  24. data/ext/ffi_c/libffi/include/ffi_common.h +2 -0
  25. data/ext/ffi_c/libffi/m4/ax_append_flag.m4 +18 -16
  26. data/ext/ffi_c/libffi/m4/ax_cc_maxopt.m4 +21 -8
  27. data/ext/ffi_c/libffi/m4/ax_cflags_warn_all.m4 +4 -4
  28. data/ext/ffi_c/libffi/m4/ax_check_compile_flag.m4 +9 -7
  29. data/ext/ffi_c/libffi/m4/ax_compiler_vendor.m4 +8 -5
  30. data/ext/ffi_c/libffi/m4/ax_configure_args.m4 +5 -5
  31. data/ext/ffi_c/libffi/m4/ax_enable_builddir.m4 +7 -6
  32. data/ext/ffi_c/libffi/m4/ax_gcc_archflag.m4 +99 -61
  33. data/ext/ffi_c/libffi/m4/ax_gcc_x86_cpuid.m4 +18 -8
  34. data/ext/ffi_c/libffi/m4/ax_require_defined.m4 +37 -0
  35. data/ext/ffi_c/libffi/msvcc.sh +82 -14
  36. data/ext/ffi_c/libffi/src/aarch64/ffi.c +8 -31
  37. data/ext/ffi_c/libffi/src/closures.c +31 -1
  38. data/ext/ffi_c/libffi/src/ia64/ffi.c +24 -6
  39. data/ext/ffi_c/libffi/src/ia64/ffitarget.h +2 -1
  40. data/ext/ffi_c/libffi/src/ia64/unix.S +6 -1
  41. data/ext/ffi_c/libffi/src/mips/ffi.c +29 -12
  42. data/ext/ffi_c/libffi/src/mips/ffitarget.h +7 -12
  43. data/ext/ffi_c/libffi/src/moxie/eabi.S +1 -1
  44. data/ext/ffi_c/libffi/src/moxie/ffi.c +18 -5
  45. data/ext/ffi_c/libffi/src/powerpc/ffi_linux64.c +45 -16
  46. data/ext/ffi_c/libffi/src/riscv/ffi.c +445 -0
  47. data/ext/ffi_c/libffi/src/riscv/ffitarget.h +68 -0
  48. data/ext/ffi_c/libffi/src/riscv/sysv.S +214 -0
  49. data/ext/ffi_c/libffi/src/types.c +3 -1
  50. data/ext/ffi_c/libffi/src/x86/ffi.c +18 -0
  51. data/ext/ffi_c/libffi/src/x86/ffi64.c +15 -9
  52. data/ext/ffi_c/libffi/src/x86/ffitarget.h +8 -2
  53. data/ext/ffi_c/libffi/src/x86/ffiw64.c +30 -9
  54. data/ext/ffi_c/libffi/src/xtensa/sysv.S +6 -1
  55. data/ext/ffi_c/libffi/testsuite/Makefile.am +108 -77
  56. data/ext/ffi_c/libffi/testsuite/lib/libffi.exp +195 -5
  57. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/Makefile +28 -0
  58. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/README +78 -0
  59. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/alignof.h +50 -0
  60. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/bhaible.exp +58 -0
  61. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-call.c +1745 -0
  62. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/test-callback.c +2885 -0
  63. data/ext/ffi_c/libffi/testsuite/libffi.bhaible/testcases.c +743 -0
  64. data/ext/ffi_c/libffi/testsuite/libffi.call/align_stdcall.c +46 -0
  65. data/ext/ffi_c/libffi/testsuite/libffi.call/call.exp +14 -1
  66. data/ext/ffi_c/libffi/testsuite/libffi.call/ffitest.h +3 -1
  67. data/ext/ffi_c/libffi/testsuite/libffi.call/nested_struct10.c +1 -0
  68. data/ext/ffi_c/libffi/testsuite/libffi.call/struct10.c +57 -0
  69. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest.cc +1 -1
  70. data/ext/ffi_c/libffi/testsuite/libffi.call/unwindtest_ffi_call.cc +1 -1
  71. data/lib/ffi/library.rb +2 -4
  72. data/lib/ffi/platform/mips64-linux/types.conf +104 -0
  73. data/lib/ffi/platform/mipsisa32r6-linux/types.conf +102 -0
  74. data/lib/ffi/platform/mipsisa32r6el-linux/types.conf +102 -0
  75. data/lib/ffi/platform/mipsisa64r6-linux/types.conf +104 -0
  76. data/lib/ffi/platform/mipsisa64r6el-linux/types.conf +104 -0
  77. data/lib/ffi/version.rb +1 -1
  78. metadata +29 -3
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 286fc5e69721d659cb72bba4dbafc0a65ce8ddd3d85432eefe94c4f8fae78d6c
4
- data.tar.gz: e1395b53a83cd497c8fe32176d029f0a5daf47de36a40390f6fadc2d478cc748
3
+ metadata.gz: 3c08414eed21b4a4c2dbb89687f9004a970ce2b997fc419566221ee01384e5eb
4
+ data.tar.gz: 4849cae15554e04a89322a7e1738b804be57f09e8606170803655c4804ba03a3
5
5
  SHA512:
6
- metadata.gz: 5538683e786da7e3c4ec7665f9e1ca3cfdd6ec2df3aaf3529b008f3acaf39b840889fe8cbdc8f19ecc1ea979882508a4b4e284ec59d1dd43ef6d6fa7062ce4c3
7
- data.tar.gz: b5cca527e86e49ac8e3d8d157a907f9601f68d1ccaf06fd922d7b3706ae1c5df4ff1539be2305fde2db7d357377530a76238082bd0f8577fe5d2b79a6936c8ed
6
+ metadata.gz: a4984c832d1358e61c05b50b936e6f757cb301202d441a686bbd2b2a963f77fd1371bfcb2644e75522ded093d0f9055843d28bf7593ef7f037c349cd443efab5
7
+ data.tar.gz: cae427a16110ac965beb4e999f9f5a8950a69f321a09d641343dfd2b3ec4f3fcd5ad428047f25e1b87800b4f0dd2827eb5cd143e51c50af9944ce2c0f38eb892
@@ -0,0 +1,66 @@
1
+ 1.9.24 / 2018-06-02
2
+ -------------------
3
+
4
+ Added:
5
+ * Added a CHANGELOG file
6
+ * Add mips64(eb) support, and mips r6 support. (#601)
7
+
8
+ Changed:
9
+ * Update libffi to latest changes on master.
10
+ * Don't search in hardcoded /usr paths on Windows.
11
+ * Don't treat Symbol args different to Strings in ffi_lib.
12
+ * Make sure size_t is defined in Thread.c. Fixes #609
13
+
14
+
15
+ 1.9.23 / 2018-02-25
16
+ -------------------
17
+
18
+ Changed:
19
+ * Fix unnecessary rebuild of configure in darwin multi arch. Fixes #605
20
+
21
+
22
+ 1.9.22 / 2018-02-22
23
+ -------------------
24
+
25
+ Changed:
26
+ * Update libffi to latest changes on master.
27
+ * Update detection of system libffi to match new requirements. Fixes #617
28
+ * Prefer bundled libffi over system libffi on Mac OS.
29
+ * Do closures via libffi. This removes ClosurePool and fixes compat with PaX. #540
30
+ * Use a more deterministic gem packaging.
31
+ * Fix unnecessary update of autoconf files at gem install.
32
+
33
+
34
+ 1.9.21 / 2018-02-06
35
+ -------------------
36
+
37
+ Added:
38
+ * Ruby-2.5 support by Windows binary gems. Fixes #598
39
+ * Add missing win64 types.
40
+ * Added support for Bitmask. (#573)
41
+ * Add support for MSYS2 (#572) and Sparc64 Linux. (#574)
42
+
43
+ Changed:
44
+ * Fix read_string to not throw an error on length 0.
45
+ * Don't use absolute paths for sh and env. Fixes usage on Adroid #528
46
+ * Use Ruby implementation for `which` for better compat with Windows. Fixes #315
47
+ * Fix compatibility with PPC64LE platform. (#577)
48
+ * Normalize sparc64 to sparcv9. (#575)
49
+
50
+ Removed:
51
+ * Drop Ruby 1.8.7 support (#480)
52
+
53
+
54
+ 1.9.18 / 2017-03-03
55
+ -------------------
56
+
57
+ Added:
58
+ * Add compatibility with Ruby-2.4.
59
+
60
+ Changed:
61
+ * Add missing shlwapi.h include to fix Windows build.
62
+ * Avoid undefined behaviour of LoadLibrary() on Windows. #553
63
+
64
+
65
+ 1.9.17 / 2017-01-13
66
+ -------------------
data/Rakefile CHANGED
@@ -161,7 +161,7 @@ namespace 'java' do
161
161
  s.homepage = gem_spec.homepage
162
162
  s.summary = gem_spec.summary
163
163
  s.description = gem_spec.description
164
- s.files = %w(LICENSE COPYING README.md Rakefile)
164
+ s.files = %w(LICENSE COPYING README.md CHANGELOG.md Rakefile)
165
165
  s.has_rdoc = false
166
166
  s.license = gem_spec.license
167
167
  s.platform = 'java'
@@ -43,6 +43,9 @@
43
43
  #endif
44
44
  #include <errno.h>
45
45
  #include <ruby.h>
46
+ #if defined(HAVE_RUBY_THREAD_H)
47
+ #include <ruby/thread.h>
48
+ #endif
46
49
  #if defined(HAVE_NATIVETHREAD) && (defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)) && !defined(_WIN32)
47
50
  # include <signal.h>
48
51
  # include <pthread.h>
@@ -317,7 +320,7 @@ rbffi_SetupCallParams(int argc, VALUE* argv, int paramCount, Type** paramTypes,
317
320
  }
318
321
  }
319
322
 
320
- static VALUE
323
+ static void *
321
324
  call_blocking_function(void* data)
322
325
  {
323
326
  rbffi_blocking_call_t* b = (rbffi_blocking_call_t *) data;
@@ -325,7 +328,7 @@ call_blocking_function(void* data)
325
328
  ffi_call(&b->cif, FFI_FN(b->function), b->retval, b->ffiValues);
326
329
  b->frame->has_gvl = true;
327
330
 
328
- return Qnil;
331
+ return NULL;
329
332
  }
330
333
 
331
334
  VALUE
@@ -47,6 +47,9 @@
47
47
  # endif
48
48
  #endif
49
49
  #include <ruby.h>
50
+ #if defined(HAVE_RUBY_THREAD_H)
51
+ #include <ruby/thread.h>
52
+ #endif
50
53
 
51
54
  #include <ffi.h>
52
55
  #if defined(HAVE_NATIVETHREAD) && !defined(_WIN32)
@@ -554,7 +557,7 @@ struct async_wait {
554
557
  bool stop;
555
558
  };
556
559
 
557
- static VALUE async_cb_wait(void *);
560
+ static void * async_cb_wait(void *);
558
561
  static void async_cb_stop(void *);
559
562
 
560
563
  #if defined(HAVE_RB_THREAD_BLOCKING_REGION) || defined(HAVE_RB_THREAD_CALL_WITHOUT_GVL)
@@ -643,7 +646,7 @@ async_cb_event(void* unused)
643
646
  #endif
644
647
 
645
648
  #ifdef _WIN32
646
- static VALUE
649
+ static void *
647
650
  async_cb_wait(void *data)
648
651
  {
649
652
  struct async_wait* w = (struct async_wait *) data;
@@ -665,7 +668,7 @@ async_cb_wait(void *data)
665
668
 
666
669
  LeaveCriticalSection(&async_cb_lock);
667
670
 
668
- return Qnil;
671
+ return NULL;
669
672
  }
670
673
 
671
674
  static void
@@ -680,7 +683,7 @@ async_cb_stop(void *data)
680
683
  }
681
684
 
682
685
  #else
683
- static VALUE
686
+ static void *
684
687
  async_cb_wait(void *data)
685
688
  {
686
689
  struct async_wait* w = (struct async_wait *) data;
@@ -700,7 +703,7 @@ async_cb_wait(void *data)
700
703
 
701
704
  pthread_mutex_unlock(&async_cb_mutex);
702
705
 
703
- return Qnil;
706
+ return NULL;
704
707
  }
705
708
 
706
709
  static void
@@ -27,6 +27,7 @@
27
27
  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28
28
  */
29
29
 
30
+ #include <stddef.h>
30
31
  #ifndef _MSC_VER
31
32
  #include <stdbool.h>
32
33
  #else
@@ -26,6 +26,7 @@ if !defined?(RUBY_ENGINE) || RUBY_ENGINE == 'ruby' || RUBY_ENGINE == 'rbx'
26
26
  end
27
27
 
28
28
  have_header('shlwapi.h')
29
+ have_header('ruby/thread.h') # for compat with ruby < 2.0
29
30
  have_func('rb_thread_blocking_region')
30
31
  have_func('rb_thread_call_with_gvl')
31
32
  have_func('rb_thread_call_without_gvl')
@@ -28,10 +28,10 @@ install:
28
28
  $env:HOST="x86-pc-windows"
29
29
  } Else {
30
30
  $env:VCVARS_PLATFORM="amd64"
31
- $env:BUILD="x86_64-pc-cygwin"
32
- $env:HOST="x86_64-pc-winnt"
31
+ $env:BUILD="x86_64-w64-cygwin"
32
+ $env:HOST="x86_64-w64-cygwin"
33
33
  }
34
- - 'appveyor DownloadFile http://cygwin.com/setup-x86.exe -FileName setup.exe'
34
+ - 'appveyor DownloadFile https://cygwin.com/setup-x86.exe -FileName setup.exe'
35
35
  - 'setup.exe -qnNdO -R "%CYG_ROOT%" -s "%CYG_MIRROR%" -l "%CYG_CACHE%" -P dejagnu >NUL'
36
36
  - '%CYG_ROOT%/bin/bash -lc "cygcheck -dc cygwin"'
37
37
  - ps: $env:VSCOMNTOOLS=(Get-Content ("env:VS" + "$env:VSVER" + "0COMNTOOLS"))
@@ -40,7 +40,9 @@ install:
40
40
 
41
41
  build_script:
42
42
  - c:\cygwin\bin\sh -lc "(cd $OLDPWD; ./autogen.sh;)"
43
- - 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' --build=$BUILD --host=$HOST; cp src/x86/ffitarget.h include; make;)"
43
+ - 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;)"
44
+ - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp src/x86/ffitarget.h include; make; find .;)"
45
+ - c:\cygwin\bin\sh -lc "(cd $OLDPWD; cp `find . -name 'libffi-?.dll'` $HOST/testsuite/; make check; cat `find ./ -name libffi.log`)"
44
46
 
45
47
  # FIXME: "make check" currently fails. It just looks like msvcc needs
46
48
  # to learn about -L and -l options. If you add "make check; cat `find
@@ -0,0 +1,10 @@
1
+ ## System Details
2
+
3
+ <!--- What platform are you working with? eg. the output of config.guess -->
4
+ <!--- Provide any toolchain details here. eg. compiler version -->
5
+
6
+ ## Problems Description
7
+
8
+ <!--- Provide a description of the problem here -->
9
+ <!--- If this is a configure-time problem, attach config.log -->
10
+ <!--- If this is a testsuite problem, attach the relevant log output -->
@@ -5,9 +5,11 @@
5
5
  .dirstamp
6
6
  *.la
7
7
  Makefile
8
+ !testsuite/libffi.bhaible/Makefile
8
9
  Makefile.in
9
10
  aclocal.m4
10
11
  compile
12
+ !.travis/compile
11
13
  configure
12
14
  depcomp
13
15
  doc/libffi.info
@@ -3,28 +3,32 @@ sudo: required
3
3
 
4
4
  language: cpp
5
5
 
6
- os:
7
- - linux
8
- compiler:
9
- - gcc
10
- - clang
11
- env:
12
- - CONFIGURE_OPTIONS=--disable-shared
13
- - CONFIGURE_OPTIONS=
14
6
  matrix:
15
7
  include:
8
+ - os: osx
9
+ env: HOST=arm-apple-darwin
16
10
  - os: linux
17
11
  compiler: gcc
18
- env: HOST=i386-pc-linux-gnu
12
+ env: HOST=i386-pc-linux-gnu MEVAL='export CC="$CC -m32" && CXX="$CXX -m32"'
13
+ - os: linux
14
+ compiler: gcc
15
+ - os: linux
16
+ compiler: gcc
17
+ env: CONFIGURE_OPTIONS=--disable-shared
18
+ - os: linux
19
+ compiler: clang
20
+ - os: linux
21
+ compiler: clang
22
+ env: CONFIGURE_OPTIONS=--disable-shared
23
+ - os: linux
24
+ 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"
25
+
26
+ before_install:
27
+ - if test x"$MEVAL" != x; then eval ${MEVAL}; fi
19
28
 
20
29
  install:
21
30
  - ./.travis/install.sh
22
31
 
23
32
  script:
24
- - ./autogen.sh
25
- - if test x"$HOST" = x"i386-pc-linux-gnu"; then CC="$CC -m32"; CXX="$CXX -m32"; fi
26
- - ./configure ${HOST+--host=$HOST} ${CONFIGURE_OPTIONS}
27
- - make
28
- - make dist
29
- - make check
30
- - cat */testsuite/libffi.log
33
+ - if ! test x"$MEVAL" = x; then eval ${MEVAL}; fi
34
+ - ./.travis/build.sh
@@ -0,0 +1,270 @@
1
+ #! /bin/sh
2
+ # Wrapper for Microsoft lib.exe
3
+
4
+ me=ar-lib
5
+ scriptversion=2012-03-01.08; # UTC
6
+
7
+ # Copyright (C) 2010-2018 Free Software Foundation, Inc.
8
+ # Written by Peter Rosin <peda@lysator.liu.se>.
9
+ #
10
+ # This program is free software; you can redistribute it and/or modify
11
+ # it under the terms of the GNU General Public License as published by
12
+ # the Free Software Foundation; either version 2, or (at your option)
13
+ # any later version.
14
+ #
15
+ # This program is distributed in the hope that it will be useful,
16
+ # but WITHOUT ANY WARRANTY; without even the implied warranty of
17
+ # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18
+ # GNU General Public License for more details.
19
+ #
20
+ # You should have received a copy of the GNU General Public License
21
+ # along with this program. If not, see <https://www.gnu.org/licenses/>.
22
+
23
+ # As a special exception to the GNU General Public License, if you
24
+ # distribute this file as part of a program that contains a
25
+ # configuration script generated by Autoconf, you may include it under
26
+ # the same distribution terms that you use for the rest of that program.
27
+
28
+ # This file is maintained in Automake, please report
29
+ # bugs to <bug-automake@gnu.org> or send patches to
30
+ # <automake-patches@gnu.org>.
31
+
32
+
33
+ # func_error message
34
+ func_error ()
35
+ {
36
+ echo "$me: $1" 1>&2
37
+ exit 1
38
+ }
39
+
40
+ file_conv=
41
+
42
+ # func_file_conv build_file
43
+ # Convert a $build file to $host form and store it in $file
44
+ # Currently only supports Windows hosts.
45
+ func_file_conv ()
46
+ {
47
+ file=$1
48
+ case $file in
49
+ / | /[!/]*) # absolute file, and not a UNC file
50
+ if test -z "$file_conv"; then
51
+ # lazily determine how to convert abs files
52
+ case `uname -s` in
53
+ MINGW*)
54
+ file_conv=mingw
55
+ ;;
56
+ CYGWIN*)
57
+ file_conv=cygwin
58
+ ;;
59
+ *)
60
+ file_conv=wine
61
+ ;;
62
+ esac
63
+ fi
64
+ case $file_conv in
65
+ mingw)
66
+ file=`cmd //C echo "$file " | sed -e 's/"\(.*\) " *$/\1/'`
67
+ ;;
68
+ cygwin)
69
+ file=`cygpath -m "$file" || echo "$file"`
70
+ ;;
71
+ wine)
72
+ file=`winepath -w "$file" || echo "$file"`
73
+ ;;
74
+ esac
75
+ ;;
76
+ esac
77
+ }
78
+
79
+ # func_at_file at_file operation archive
80
+ # Iterate over all members in AT_FILE performing OPERATION on ARCHIVE
81
+ # for each of them.
82
+ # When interpreting the content of the @FILE, do NOT use func_file_conv,
83
+ # since the user would need to supply preconverted file names to
84
+ # binutils ar, at least for MinGW.
85
+ func_at_file ()
86
+ {
87
+ operation=$2
88
+ archive=$3
89
+ at_file_contents=`cat "$1"`
90
+ eval set x "$at_file_contents"
91
+ shift
92
+
93
+ for member
94
+ do
95
+ $AR -NOLOGO $operation:"$member" "$archive" || exit $?
96
+ done
97
+ }
98
+
99
+ case $1 in
100
+ '')
101
+ func_error "no command. Try '$0 --help' for more information."
102
+ ;;
103
+ -h | --h*)
104
+ cat <<EOF
105
+ Usage: $me [--help] [--version] PROGRAM ACTION ARCHIVE [MEMBER...]
106
+
107
+ Members may be specified in a file named with @FILE.
108
+ EOF
109
+ exit $?
110
+ ;;
111
+ -v | --v*)
112
+ echo "$me, version $scriptversion"
113
+ exit $?
114
+ ;;
115
+ esac
116
+
117
+ if test $# -lt 3; then
118
+ func_error "you must specify a program, an action and an archive"
119
+ fi
120
+
121
+ AR=$1
122
+ shift
123
+ while :
124
+ do
125
+ if test $# -lt 2; then
126
+ func_error "you must specify a program, an action and an archive"
127
+ fi
128
+ case $1 in
129
+ -lib | -LIB \
130
+ | -ltcg | -LTCG \
131
+ | -machine* | -MACHINE* \
132
+ | -subsystem* | -SUBSYSTEM* \
133
+ | -verbose | -VERBOSE \
134
+ | -wx* | -WX* )
135
+ AR="$AR $1"
136
+ shift
137
+ ;;
138
+ *)
139
+ action=$1
140
+ shift
141
+ break
142
+ ;;
143
+ esac
144
+ done
145
+ orig_archive=$1
146
+ shift
147
+ func_file_conv "$orig_archive"
148
+ archive=$file
149
+
150
+ # strip leading dash in $action
151
+ action=${action#-}
152
+
153
+ delete=
154
+ extract=
155
+ list=
156
+ quick=
157
+ replace=
158
+ index=
159
+ create=
160
+
161
+ while test -n "$action"
162
+ do
163
+ case $action in
164
+ d*) delete=yes ;;
165
+ x*) extract=yes ;;
166
+ t*) list=yes ;;
167
+ q*) quick=yes ;;
168
+ r*) replace=yes ;;
169
+ s*) index=yes ;;
170
+ S*) ;; # the index is always updated implicitly
171
+ c*) create=yes ;;
172
+ u*) ;; # TODO: don't ignore the update modifier
173
+ v*) ;; # TODO: don't ignore the verbose modifier
174
+ *)
175
+ func_error "unknown action specified"
176
+ ;;
177
+ esac
178
+ action=${action#?}
179
+ done
180
+
181
+ case $delete$extract$list$quick$replace,$index in
182
+ yes,* | ,yes)
183
+ ;;
184
+ yesyes*)
185
+ func_error "more than one action specified"
186
+ ;;
187
+ *)
188
+ func_error "no action specified"
189
+ ;;
190
+ esac
191
+
192
+ if test -n "$delete"; then
193
+ if test ! -f "$orig_archive"; then
194
+ func_error "archive not found"
195
+ fi
196
+ for member
197
+ do
198
+ case $1 in
199
+ @*)
200
+ func_at_file "${1#@}" -REMOVE "$archive"
201
+ ;;
202
+ *)
203
+ func_file_conv "$1"
204
+ $AR -NOLOGO -REMOVE:"$file" "$archive" || exit $?
205
+ ;;
206
+ esac
207
+ done
208
+
209
+ elif test -n "$extract"; then
210
+ if test ! -f "$orig_archive"; then
211
+ func_error "archive not found"
212
+ fi
213
+ if test $# -gt 0; then
214
+ for member
215
+ do
216
+ case $1 in
217
+ @*)
218
+ func_at_file "${1#@}" -EXTRACT "$archive"
219
+ ;;
220
+ *)
221
+ func_file_conv "$1"
222
+ $AR -NOLOGO -EXTRACT:"$file" "$archive" || exit $?
223
+ ;;
224
+ esac
225
+ done
226
+ else
227
+ $AR -NOLOGO -LIST "$archive" | sed -e 's/\\/\\\\/g' | while read member
228
+ do
229
+ $AR -NOLOGO -EXTRACT:"$member" "$archive" || exit $?
230
+ done
231
+ fi
232
+
233
+ elif test -n "$quick$replace"; then
234
+ if test ! -f "$orig_archive"; then
235
+ if test -z "$create"; then
236
+ echo "$me: creating $orig_archive"
237
+ fi
238
+ orig_archive=
239
+ else
240
+ orig_archive=$archive
241
+ fi
242
+
243
+ for member
244
+ do
245
+ case $1 in
246
+ @*)
247
+ func_file_conv "${1#@}"
248
+ set x "$@" "@$file"
249
+ ;;
250
+ *)
251
+ func_file_conv "$1"
252
+ set x "$@" "$file"
253
+ ;;
254
+ esac
255
+ shift
256
+ shift
257
+ done
258
+
259
+ if test -n "$orig_archive"; then
260
+ $AR -NOLOGO -OUT:"$archive" "$orig_archive" "$@" || exit $?
261
+ else
262
+ $AR -NOLOGO -OUT:"$archive" "$@" || exit $?
263
+ fi
264
+
265
+ elif test -n "$list"; then
266
+ if test ! -f "$orig_archive"; then
267
+ func_error "archive not found"
268
+ fi
269
+ $AR -NOLOGO -LIST "$archive" || exit $?
270
+ fi