From 8f6fef7a3343f1447ec429dc052278bfec924862 Mon Sep 17 00:00:00 2001 From: Allen Byrne <50328838+byrnHDF@users.noreply.github.com> Date: Tue, 19 Mar 2024 15:11:15 -0500 Subject: [PATCH] Filter plugins updates for registration URL (#4180) * Update filter plugin URL to new location * Adjust test array size --- .github/workflows/release-files.yml | 2 -- HDF5Examples/C/H5FLT/h5ex_d_blosc.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_bshuf.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_bzip2.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_jpeg.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_lz4.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_lzf.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_mafisc.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_zfp.c | 2 +- HDF5Examples/C/H5FLT/h5ex_d_zstd.c | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.ddl | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.tst | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.ddl | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.tst | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.ddl | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.tst | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.ddl | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.tst | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.ddl | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.tst | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.ddl | 2 +- HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.tst | 2 +- doc/parallel-compression.md | 2 +- doxygen/examples/H5.format.1.1.html | 4 ++-- doxygen/examples/H5.format.2.0.html | 4 ++-- doxygen/examples/H5.format.html | 4 ++-- src/H5PLmodule.h | 10 ++++++---- 27 files changed, 34 insertions(+), 34 deletions(-) diff --git a/.github/workflows/release-files.yml b/.github/workflows/release-files.yml index d79ac3c1f10..960f24d0749 100644 --- a/.github/workflows/release-files.yml +++ b/.github/workflows/release-files.yml @@ -175,8 +175,6 @@ jobs: - name: Create description file run: | cat ${{ github.workspace }}/NEWSLETTER.txt > description.txt - echo "SHA256 sums:" >> description.txt - cat sha256sums.txt >> description.txt - name: PreRelease tag id: create_prerelease diff --git a/HDF5Examples/C/H5FLT/h5ex_d_blosc.c b/HDF5Examples/C/H5FLT/h5ex_d_blosc.c index 883b459373f..3fc13654c15 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_blosc.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_blosc.c @@ -42,7 +42,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; size_t nelmts = 7; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c b/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c index a5f3ed724be..7b666da094c 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_bshuf.c @@ -42,7 +42,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; size_t nelmts = 3; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c b/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c index 0c02b1daf99..421a1bf954e 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_bzip2.c @@ -42,7 +42,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; size_t nelmts = 1; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c b/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c index 78a42528a0a..a3931bb32e0 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_jpeg.c @@ -45,7 +45,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[3] = {NUM_IMAGES, DIM0, DIM1}, chunk[3] = {CHUNK0, CHUNK1, CHUNK2}; size_t nelmts = 4; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_lz4.c b/HDF5Examples/C/H5FLT/h5ex_d_lz4.c index 9900b512c55..0bcfc876cf3 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_lz4.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_lz4.c @@ -42,7 +42,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; size_t nelmts = 1; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_lzf.c b/HDF5Examples/C/H5FLT/h5ex_d_lzf.c index 0e74e790683..a860d67e16c 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_lzf.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_lzf.c @@ -42,7 +42,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; size_t nelmts = 3; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c b/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c index b04a5b5583d..5cee4a07ce0 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_mafisc.c @@ -42,7 +42,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; size_t nelmts = 8; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_zfp.c b/HDF5Examples/C/H5FLT/h5ex_d_zfp.c index cb7d24d7f97..dd0a9366da9 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_zfp.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_zfp.c @@ -42,7 +42,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[2] = {DIM0, DIM1}, chunk[2] = {CHUNK0, CHUNK1}; size_t nelmts = 3; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/h5ex_d_zstd.c b/HDF5Examples/C/H5FLT/h5ex_d_zstd.c index 6891a71024e..28f084d90dd 100644 --- a/HDF5Examples/C/H5FLT/h5ex_d_zstd.c +++ b/HDF5Examples/C/H5FLT/h5ex_d_zstd.c @@ -44,7 +44,7 @@ main(void) herr_t status; htri_t avail; H5Z_filter_t filter_id = 0; - char filter_name[80]; + char filter_name[128]; hsize_t dims[3] = {NUM_IMAGES, DIM0, DIM1}, chunk[3] = {CHUNK0, CHUNK1, CHUNK2}; size_t nelmts = 1; /* number of elements in cd_values */ unsigned int flags; diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.ddl b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.ddl index 324fa1df26f..c14881d623c 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.ddl +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.ddl @@ -10,7 +10,7 @@ GROUP "/" { FILTERS { USER_DEFINED_FILTER { FILTER_ID 32001 - COMMENT HDF5 blosc filter; see http://www.hdfgroup.org/services/contributions.html + COMMENT HDF5 blosc filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md PARAMS { 2 2 4 128 4 1 2 } } } diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.tst b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.tst index ace1975ef9e..4a349b3dee0 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.tst +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_blosc.tst @@ -5,7 +5,7 @@ blosc filter is available for encoding and decoding. Filter info is available from the dataset creation property Filter identifier is 32001 Number of parameters is 7 with the value 4 1 2 - To find more about the filter check HDF5 blosc filter; see http://www.hdfgroup.org/services/contributions.html + To find more about the filter check HDF5 blosc filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md ....Reading blosc compressed data ................ Maximum value in DS1 is 1890 blosc filter is available now since H5Dread triggered loading of the filter. diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.ddl b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.ddl index 5cf633893e7..32c55eb8ddb 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.ddl +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.ddl @@ -10,7 +10,7 @@ GROUP "/" { FILTERS { USER_DEFINED_FILTER { FILTER_ID 307 - COMMENT HDF5 bzip2 filter; see http://www.hdfgroup.org/services/contributions.html + COMMENT HDF5 bzip2 filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md PARAMS { 2 } } } diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.tst b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.tst index a628ae1da5f..9f71cce3024 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.tst +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_bzip2.tst @@ -5,7 +5,7 @@ bzip2 filter is available for encoding and decoding. Filter info is available from the dataset creation property Filter identifier is 307 Number of parameters is 1 with the value 2 - To find more about the filter check HDF5 bzip2 filter; see http://www.hdfgroup.org/services/contributions.html + To find more about the filter check HDF5 bzip2 filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md ....Reading bzip2 compressed data ................ Maximum value in DS1 is 1890 bzip2 filter is available now since H5Dread triggered loading of the filter. diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.ddl b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.ddl index 1dc8928dcd8..1cc2ec38ffc 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.ddl +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.ddl @@ -10,7 +10,7 @@ GROUP "/" { FILTERS { USER_DEFINED_FILTER { FILTER_ID 32019 - COMMENT HDF5 jpeg filter; see http://www.hdfgroup.org/services/contributions.html + COMMENT HDF5 jpeg filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md PARAMS { 100 1024 512 0 } } } diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.tst b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.tst index d3f3bf87f4f..188aa5c2f57 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.tst +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_jpeg.tst @@ -5,7 +5,7 @@ jpeg filter is available for encoding and decoding. Filter info is available from the dataset creation property Filter identifier is 32019 Number of parameters is 4 with the value 100 - To find more about the filter check HDF5 jpeg filter; see http://www.hdfgroup.org/services/contributions.html + To find more about the filter check HDF5 jpeg filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md ....Reading jpeg compressed data ................ JPEG quality=100, percent of differing array elements=0.000000 jpeg filter is available now since H5Dread triggered loading of the filter. diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.ddl b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.ddl index f13c950f55b..a1fd1533046 100755 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.ddl +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.ddl @@ -10,7 +10,7 @@ GROUP "/" { FILTERS { USER_DEFINED_FILTER { FILTER_ID 32004 - COMMENT HDF5 lz4 filter; see http://www.hdfgroup.org/services/contributions.html + COMMENT HDF5 lz4 filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md PARAMS { 3 } } } diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.tst b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.tst index 5e5e9d74684..077e9dfc59d 100755 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.tst +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lz4.tst @@ -5,7 +5,7 @@ lz4 filter is available for encoding and decoding. Filter info is available from the dataset creation property Filter identifier is 32004 Number of parameters is 1 with the value 3 - To find more about the filter check HDF5 lz4 filter; see http://www.hdfgroup.org/services/contributions.html + To find more about the filter check HDF5 lz4 filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md ....Reading lz4 compressed data ................ Maximum value in DS1 is 1890 lz4 filter is available now since H5Dread triggered loading of the filter. diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.ddl b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.ddl index 089a82aa8be..c565245e65a 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.ddl +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.ddl @@ -10,7 +10,7 @@ GROUP "/" { FILTERS { USER_DEFINED_FILTER { FILTER_ID 32000 - COMMENT HDF5 lzf filter; see http://www.hdfgroup.org/services/contributions.html + COMMENT HDF5 lzf filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md PARAMS { 4 261 128 } } } diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.tst b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.tst index 96aca413b8d..0eeff2fd930 100755 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.tst +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_lzf.tst @@ -5,7 +5,7 @@ lzf filter is available for encoding and decoding. Filter info is available from the dataset creation property Filter identifier is 32000 Number of parameters is 3 with the value 4 - To find more about the filter check HDF5 lzf filter; see http://www.hdfgroup.org/services/contributions.html + To find more about the filter check HDF5 lzf filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md ....Reading lzf compressed data ................ Maximum value in DS1 is 1890 lzf filter is available now since H5Dread triggered loading of the filter. diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.ddl b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.ddl index c9513569f3f..a53b1bceef6 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.ddl +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.ddl @@ -10,7 +10,7 @@ GROUP "/" { FILTERS { USER_DEFINED_FILTER { FILTER_ID 32015 - COMMENT HDF5 zstd filter; see http://www.hdfgroup.org/services/contributions.html + COMMENT HDF5 zstd filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md PARAMS { 0 } } } diff --git a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.tst b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.tst index 3789a3eb202..c66aef97deb 100644 --- a/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.tst +++ b/HDF5Examples/C/H5FLT/tfiles/h5ex_d_zstd.tst @@ -5,7 +5,7 @@ zstd filter is available for encoding and decoding. Filter info is available from the dataset creation property Filter identifier is 32015 Number of parameters is 1 with the value 0 - To find more about the filter check HDF5 zstd filter; see http://www.hdfgroup.org/services/contributions.html + To find more about the filter check HDF5 zstd filter; see https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md ....Reading zstd compressed data ................ ZSTD number of differing array elements=0 zstd filter is available now since H5Dread triggered loading of the filter. diff --git a/doc/parallel-compression.md b/doc/parallel-compression.md index 484f5010ab0..25d491164cf 100644 --- a/doc/parallel-compression.md +++ b/doc/parallel-compression.md @@ -166,7 +166,7 @@ chosen chunk size becomes a very important factor when compression is involved, as data chunks have to be completely read and re-written to perform partial writes to the chunk. -[Improving I/O performance with HDF5 compressed datasets](http://portal.hdfgroup.org/display/HDF5/Improving+IO+Performance+When+Working+with+HDF5+Compressed+Datasets) +[Improving I/O performance with HDF5 compressed datasets](https://portal.hdfgroup.org/display/HDF5/Improving+IO+Performance+When+Working+with+HDF5+Compressed+Datasets) is a useful reference for more information on getting good performance when using a chunked dataset layout. diff --git a/doxygen/examples/H5.format.1.1.html b/doxygen/examples/H5.format.1.1.html index f437d9be970..88f92481f1a 100644 --- a/doxygen/examples/H5.format.1.1.html +++ b/doxygen/examples/H5.format.1.1.html @@ -5436,8 +5436,8 @@
https://portal.hdfgroup.org/documentation/hdf5-docs/registered_filter_plugins.html
.
+
+ https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md
.
1
To request a filter identifier, please contact diff --git a/doxygen/examples/H5.format.2.0.html b/doxygen/examples/H5.format.2.0.html index 37cb7282eb1..2ad32c85f56 100644 --- a/doxygen/examples/H5.format.2.0.html +++ b/doxygen/examples/H5.format.2.0.html @@ -12598,7 +12598,7 @@
@@ -14488,7 +14488,7 @@
diff --git a/src/H5PLmodule.h b/src/H5PLmodule.h index 436e8bdfa0a..e107fb470fe 100644 --- a/src/H5PLmodule.h +++ b/src/H5PLmodule.h @@ -47,7 +47,7 @@ * function, as a user would do in the past. The identification number and the filter parameters should be * available to the application. For example, if the application intends to apply the HDF5 bzip2 compression * filter that was registered with The HDF Group and has an identification number 307 - * (Registered + * (Registered * Filters) then the application would follow the steps as outlined below: \code dcpl = H5Pcreate * (H5P_DATASET_CREATE); status = H5Pset_filter (dcpl, (H5Z_filter_t)307, H5Z_FLAG_MANDATORY, (size_t)6, * cd_values); dset = H5Dcreate (file, DATASET, H5T_STD_I32LE, space, H5P_DEFAULT, dcpl, status = H5Dwrite @@ -73,7 +73,8 @@ * FILTERS { * USER_DEFINED_FILTER { * FILTER_ID 307 - * COMMENT HDF5 bzip2 filter; see http://www.hdfgroup.org/services/contributions.html + * COMMENT HDF5 bzip2 filter; see + * https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md * PARAMS { 2 } * } * } @@ -182,7 +183,7 @@ * \subsubsection subsubsec_filter_plugins_prog_reg Registering a Filter with The HDF Group * If you are writing a filter that will be used by others, it would be a good idea to request a filter * identification number and register it with The HDF Group. Please follow the procedure described at - * Registered + * Registered * Filters. * * The HDF Group anticipates that developers of HDF5 filter plugins will not only register new filters, but @@ -196,7 +197,8 @@ * (H5Z_filter_t)H5Z_FILTER_BZIP2, // Filter id number * 1, // encoder_present flag (set to true) * 1, // decoder_present flag (set to true) - * "HDF5 bzip2 filter; see http://www.hdfgroup.org/services/contributions.html", + * "HDF5 bzip2 filter; see + * https://github.com/HDFGroup/hdf5_plugins/blob/master/docs/RegisteredFilterPlugins.md", * // Filter name for debugging * NULL, // The "can apply" callback * NULL, // The "set local" callback