diff options
Diffstat (limited to 'data/vim/patches/8.1.0736')
-rw-r--r-- | data/vim/patches/8.1.0736 | 735 |
1 files changed, 0 insertions, 735 deletions
diff --git a/data/vim/patches/8.1.0736 b/data/vim/patches/8.1.0736 deleted file mode 100644 index 33f3eae24..000000000 --- a/data/vim/patches/8.1.0736 +++ /dev/null @@ -1,735 +0,0 @@ -To: vim_dev@googlegroups.com -Subject: Patch 8.1.0736 -Fcc: outbox -From: Bram Moolenaar <Bram@moolenaar.net> -Mime-Version: 1.0 -Content-Type: text/plain; charset=UTF-8 -Content-Transfer-Encoding: 8bit ------------- - -Patch 8.1.0736 -Problem: Code for Blob not sufficiently tested. -Solution: Add more tests. Fix uncovered crash. Add test_null_blob(). -Files: src/testdir/test_blob.vim, src/testdir/test_assign.vim, src/eval.c, - src/testdir/test_eval_stuff.vim, src/testdir/test_lambda.vim, - runtime/doc/eval.txt, src/evalfunc.c, src/blob.c, - src/testdir/test49.vim - - -*** ../vim-8.1.0735/src/testdir/test_blob.vim 2019-01-12 22:47:01.264088074 +0100 ---- src/testdir/test_blob.vim 2019-01-13 15:05:51.133009938 +0100 -*************** -*** 21,26 **** ---- 21,32 ---- - call assert_equal(0xDE, get(b, 0)) - call assert_equal(0xEF, get(b, 3)) - call assert_fails('let x = get(b, 4)') -+ -+ call assert_fails('let b = 0z1', 'E973:') -+ call assert_fails('let b = 0z1x', 'E973:') -+ call assert_fails('let b = 0z12345', 'E973:') -+ -+ call assert_equal(0z, test_null_blob()) - endfunc - - " assignment to a blob -*************** -*** 32,37 **** ---- 38,82 ---- - let bcopy = b[:] - call assert_equal(b, bcopy) - call assert_false(b is bcopy) -+ -+ let b = 0zDEADBEEF -+ let b2 = b -+ call assert_true(b is b2) -+ let b[:] = 0z11223344 -+ call assert_equal(0z11223344, b) -+ call assert_equal(0z11223344, b2) -+ call assert_true(b is b2) -+ -+ let b = 0zDEADBEEF -+ let b[3:] = 0z66 -+ call assert_equal(0zDEADBE66, b) -+ let b[:1] = 0z8899 -+ call assert_equal(0z8899BE66, b) -+ -+ call assert_fails('let b[2:3] = 0z112233', 'E972:') -+ call assert_fails('let b[2:3] = 0z11', 'E972:') -+ call assert_fails('let b[3:2] = 0z', 'E979:') -+ -+ let b = 0zDEADBEEF -+ let b += 0z99 -+ call assert_equal(0zDEADBEEF99, b) -+ -+ call assert_fails('let b .= 0z33', 'E734:') -+ call assert_fails('let b .= "xx"', 'E734:') -+ call assert_fails('let b += "xx"', 'E734:') -+ call assert_fails('let b[1:1] .= 0z55', 'E734:') -+ endfunc -+ -+ func Test_blob_get_range() -+ let b = 0z0011223344 -+ call assert_equal(0z2233, b[2:3]) -+ call assert_equal(0z223344, b[2:-1]) -+ call assert_equal(0z00, b[0:-5]) -+ call assert_equal(0z, b[0:-11]) -+ call assert_equal(0z44, b[-1:]) -+ call assert_equal(0z0011223344, b[:]) -+ call assert_equal(0z0011223344, b[:-1]) -+ call assert_equal(0z, b[5:6]) - endfunc - - func Test_blob_to_string() -*************** -*** 44,51 **** ---- 89,100 ---- - func Test_blob_compare() - let b1 = 0z0011 - let b2 = 0z1100 -+ let b3 = 0z001122 -+ call assert_true(b1 == b1) - call assert_false(b1 == b2) -+ call assert_false(b1 == b3) - call assert_true(b1 != b2) -+ call assert_true(b1 != b3) - call assert_true(b1 == 0z0011) - - call assert_false(b1 is b2) -*************** -*** 65,71 **** - let b[1] = 0x11 - let b[2] = 0x22 - call assert_equal(0z001122, b) -! call assert_fails('let b[4] = 0x33') - endfunc - - func Test_blob_for_loop() ---- 114,120 ---- - let b[1] = 0x11 - let b[2] = 0x22 - call assert_equal(0z001122, b) -! call assert_fails('let b[4] = 0x33', 'E979:') - endfunc - - func Test_blob_for_loop() -*************** -*** 177,179 **** ---- 226,240 ---- - call assert_equal('[222,173,190,239]', json_encode(0zDEADBEEF)) - call assert_equal('[]', json_encode(0z)) - endfunc -+ -+ func Test_blob_lock() -+ let b = 0z112233 -+ lockvar b -+ call assert_fails('let b = 0z44', 'E741:') -+ unlockvar b -+ let b = 0z44 -+ endfunc -+ -+ func Test_blob_sort() -+ call assert_fails('call sort([1.0, 0z11], "f")', 'E975:') -+ endfunc -*** ../vim-8.1.0735/src/testdir/test_assign.vim 2017-10-02 19:28:43.000000000 +0200 ---- src/testdir/test_assign.vim 2019-01-13 14:41:55.754889476 +0100 -*************** -*** 23,33 **** - let &t_k1 = old_t_k1 - endif - -! call assert_fails('let x = &t_xx', 'E15') - let &t_xx = "yes" - call assert_equal("yes", &t_xx) - let &t_xx = "" -! call assert_fails('let x = &t_xx', 'E15') - endfunc - - func Test_let_option_error() ---- 23,33 ---- - let &t_k1 = old_t_k1 - endif - -! call assert_fails('let x = &t_xx', 'E113') - let &t_xx = "yes" - call assert_equal("yes", &t_xx) - let &t_xx = "" -! call assert_fails('let x = &t_xx', 'E113') - endfunc - - func Test_let_option_error() -*************** -*** 43,45 **** ---- 43,53 ---- - call assert_equal("vert:|", &fillchars) - let &fillchars = _w - endfunc -+ -+ func Test_let_errors() -+ let s = 'abcd' -+ call assert_fails('let s[1] = 5', 'E689:') -+ -+ let l = [1, 2, 3] -+ call assert_fails('let l[:] = 5', 'E709:') -+ endfunc -*** ../vim-8.1.0735/src/eval.c 2019-01-12 22:47:01.260088089 +0100 ---- src/eval.c 2019-01-13 14:43:52.298118934 +0100 -*************** -*** 1983,1991 **** - } - if (rettv != NULL - && !(rettv->v_type == VAR_LIST -! || rettv->vval.v_list != NULL) - && !(rettv->v_type == VAR_BLOB -! || rettv->vval.v_blob != NULL)) - { - if (!quiet) - EMSG(_("E709: [:] requires a List or Blob value")); ---- 1983,1991 ---- - } - if (rettv != NULL - && !(rettv->v_type == VAR_LIST -! && rettv->vval.v_list != NULL) - && !(rettv->v_type == VAR_BLOB -! && rettv->vval.v_blob != NULL)) - { - if (!quiet) - EMSG(_("E709: [:] requires a List or Blob value")); -*************** -*** 2109,2114 **** ---- 2109,2116 ---- - } - else if (lp->ll_tv->v_type == VAR_BLOB) - { -+ long bloblen = blob_len(lp->ll_tv->vval.v_blob); -+ - /* - * Get the number and item for the only or first index of the List. - */ -*************** -*** 2120,2135 **** - clear_tv(&var1); - - if (lp->ll_n1 < 0 -! || lp->ll_n1 > blob_len(lp->ll_tv->vval.v_blob)) - { - if (!quiet) -! EMSGN(_(e_listidx), lp->ll_n1); - return NULL; - } - if (lp->ll_range && !lp->ll_empty2) - { - lp->ll_n2 = (long)tv_get_number(&var2); - clear_tv(&var2); - } - lp->ll_blob = lp->ll_tv->vval.v_blob; - lp->ll_tv = NULL; ---- 2122,2147 ---- - clear_tv(&var1); - - if (lp->ll_n1 < 0 -! || lp->ll_n1 > bloblen -! || (lp->ll_range && lp->ll_n1 == bloblen)) - { - if (!quiet) -! EMSGN(_(e_blobidx), lp->ll_n1); -! clear_tv(&var2); - return NULL; - } - if (lp->ll_range && !lp->ll_empty2) - { - lp->ll_n2 = (long)tv_get_number(&var2); - clear_tv(&var2); -+ if (lp->ll_n2 < 0 -+ || lp->ll_n2 >= bloblen -+ || lp->ll_n2 < lp->ll_n1) -+ { -+ if (!quiet) -+ EMSGN(_(e_blobidx), lp->ll_n2); -+ return NULL; -+ } - } - lp->ll_blob = lp->ll_tv->vval.v_blob; - lp->ll_tv = NULL; -*************** -*** 2241,2246 **** ---- 2253,2259 ---- - if (lp->ll_blob != NULL) - { - int error = FALSE, val; -+ - if (op != NULL && *op != '=') - { - EMSG2(_(e_letwrong), op); -*************** -*** 2249,2265 **** - - if (lp->ll_range && rettv->v_type == VAR_BLOB) - { -! int i; - -! if (blob_len(rettv->vval.v_blob) != blob_len(lp->ll_blob)) - { -! EMSG(_("E972: Blob value has more items than target")); - return; - } - -! for (i = lp->ll_n1; i <= lp->ll_n2; i++) -! blob_set(lp->ll_blob, i, -! blob_get(rettv->vval.v_blob, i)); - } - else - { ---- 2262,2284 ---- - - if (lp->ll_range && rettv->v_type == VAR_BLOB) - { -! int il, ir; - -! if (lp->ll_empty2) -! lp->ll_n2 = blob_len(lp->ll_blob) - 1; -! -! if (lp->ll_n2 - lp->ll_n1 + 1 != blob_len(rettv->vval.v_blob)) - { -! EMSG(_("E972: Blob value does not have the right number of bytes")); - return; - } -+ if (lp->ll_empty2) -+ lp->ll_n2 = blob_len(lp->ll_blob); - -! ir = 0; -! for (il = lp->ll_n1; il <= lp->ll_n2; il++) -! blob_set(lp->ll_blob, il, -! blob_get(rettv->vval.v_blob, ir++)); - } - else - { -*************** -*** 2278,2285 **** - if (lp->ll_n1 == gap->ga_len) - ++gap->ga_len; - } -! else -! EMSG(_(e_invrange)); - } - } - } ---- 2297,2303 ---- - if (lp->ll_n1 == gap->ga_len) - ++gap->ga_len; - } -! // error for invalid range was already given in get_lval() - } - } - } -*************** -*** 2312,2318 **** - else if (lp->ll_range) - { - listitem_T *ll_li = lp->ll_li; -! int ll_n1 = lp->ll_n1; - - /* - * Check whether any of the list items is locked ---- 2330,2336 ---- - else if (lp->ll_range) - { - listitem_T *ll_li = lp->ll_li; -! int ll_n1 = lp->ll_n1; - - /* - * Check whether any of the list items is locked -*************** -*** 3354,3359 **** ---- 3372,3379 ---- - { - int ret; - char_u *p; -+ int did_emsg_before = did_emsg; -+ int called_emsg_before = called_emsg; - - p = skipwhite(arg); - ret = eval1(&p, rettv, evaluate); -*************** -*** 3364,3372 **** - /* - * Report the invalid expression unless the expression evaluation has - * been cancelled due to an aborting error, an interrupt, or an -! * exception. - */ -! if (!aborting()) - EMSG2(_(e_invexpr2), arg); - ret = FAIL; - } ---- 3384,3394 ---- - /* - * Report the invalid expression unless the expression evaluation has - * been cancelled due to an aborting error, an interrupt, or an -! * exception, or we already gave a more specific error. -! * Also check called_emsg for when using assert_fails(). - */ -! if (!aborting() && did_emsg == did_emsg_before -! && called_emsg == called_emsg_before) - EMSG2(_(e_invexpr2), arg); - ret = FAIL; - } -*************** -*** 4195,4201 **** - { - if (!vim_isxdigit(bp[1])) - { -! EMSG(_("E973: Blob literal should have an even number of hex characters'")); - vim_free(blob); - ret = FAIL; - break; ---- 4217,4223 ---- - { - if (!vim_isxdigit(bp[1])) - { -! EMSG(_("E973: Blob literal should have an even number of hex characters")); - vim_free(blob); - ret = FAIL; - break; -*************** -*** 4632,4638 **** - len = blob_len(rettv->vval.v_blob); - if (range) - { -! // The resulting variable is a substring. If the indexes - // are out of range the result is empty. - if (n1 < 0) - { ---- 4654,4660 ---- - len = blob_len(rettv->vval.v_blob); - if (range) - { -! // The resulting variable is a sub-blob. If the indexes - // are out of range the result is empty. - if (n1 < 0) - { -*************** -*** 8336,8341 **** ---- 8358,8364 ---- - int atstart = TRUE; - char_u numbuf[NUMBUFLEN]; - int did_emsg_before = did_emsg; -+ int called_emsg_before = called_emsg; - - if (eap->skip) - ++emsg_skip; -*************** -*** 8353,8359 **** - * has been cancelled due to an aborting error, an interrupt, or an - * exception. - */ -! if (!aborting() && did_emsg == did_emsg_before) - EMSG2(_(e_invexpr2), p); - need_clr_eos = FALSE; - break; ---- 8376,8383 ---- - * has been cancelled due to an aborting error, an interrupt, or an - * exception. - */ -! if (!aborting() && did_emsg == did_emsg_before -! && called_emsg == called_emsg_before) - EMSG2(_(e_invexpr2), p); - need_clr_eos = FALSE; - break; -*** ../vim-8.1.0735/src/testdir/test_eval_stuff.vim 2018-12-05 18:43:24.489493117 +0100 ---- src/testdir/test_eval_stuff.vim 2019-01-13 14:14:28.258162292 +0100 -*************** -*** 63,65 **** ---- 63,71 ---- - call assert_fails("let v:oldfiles=''", 'E963:') - call assert_equal(v_o, v:oldfiles) - endfunc -+ -+ func Test_for_invalid() -+ call assert_fails("for x in 99", 'E714:') -+ call assert_fails("for x in 'asdf'", 'E714:') -+ call assert_fails("for x in {'a': 9}", 'E714:') -+ endfunc -*** ../vim-8.1.0735/src/testdir/test_lambda.vim 2019-01-09 23:00:57.997176121 +0100 ---- src/testdir/test_lambda.vim 2019-01-13 14:40:58.051266393 +0100 -*************** -*** 49,55 **** - - function Test_lambda_fails() - call assert_equal(3, {a, b -> a + b}(1, 2)) -! call assert_fails('echo {a, a -> a + a}(1, 2)', 'E15:') - call assert_fails('echo {a, b -> a + b)}(1, 2)', 'E15:') - endfunc - ---- 49,55 ---- - - function Test_lambda_fails() - call assert_equal(3, {a, b -> a + b}(1, 2)) -! call assert_fails('echo {a, a -> a + a}(1, 2)', 'E853:') - call assert_fails('echo {a, b -> a + b)}(1, 2)', 'E15:') - endfunc - -*************** -*** 169,175 **** - let l:D = s:NewCounter2() - - call assert_equal(1, l:C()) -! call assert_fails(':call l:D()', 'E15:') " E121: then E15: - call assert_equal(2, l:C()) - endfunc - ---- 169,175 ---- - let l:D = s:NewCounter2() - - call assert_equal(1, l:C()) -! call assert_fails(':call l:D()', 'E121:') - call assert_equal(2, l:C()) - endfunc - -*** ../vim-8.1.0735/runtime/doc/eval.txt 2019-01-12 22:47:01.256088105 +0100 ---- runtime/doc/eval.txt 2019-01-13 14:49:35.755795777 +0100 -*************** -*** 2507,2528 **** - term_setrestore({buf}, {command}) none set command to restore terminal - term_setsize({buf}, {rows}, {cols}) - none set the size of a terminal -! term_start({cmd}, {options}) Job open a terminal window and run a job - term_wait({buf} [, {time}]) Number wait for screen to be updated - test_alloc_fail({id}, {countdown}, {repeat}) - none make memory allocation fail - test_autochdir() none enable 'autochdir' during startup -! test_feedinput() none add key sequence to input buffer - test_garbagecollect_now() none free memory right now for testing - test_ignore_error({expr}) none ignore a specific error - test_null_channel() Channel null value for testing - test_null_dict() Dict null value for testing - test_null_job() Job null value for testing - test_null_list() List null value for testing - test_null_partial() Funcref null value for testing - test_null_string() String null value for testing -! test_option_not_set({name}) none reset flag indicating option was set -! test_override({expr}, {val}) none test with Vim internal overrides - test_scrollbar({which}, {value}, {dragging}) - none scroll in the GUI for testing - test_settime({expr}) none set current time for testing ---- 2520,2542 ---- - term_setrestore({buf}, {command}) none set command to restore terminal - term_setsize({buf}, {rows}, {cols}) - none set the size of a terminal -! term_start({cmd}, {options}) Number open a terminal window and run a job - term_wait({buf} [, {time}]) Number wait for screen to be updated - test_alloc_fail({id}, {countdown}, {repeat}) - none make memory allocation fail - test_autochdir() none enable 'autochdir' during startup -! test_feedinput({string}) none add key sequence to input buffer - test_garbagecollect_now() none free memory right now for testing - test_ignore_error({expr}) none ignore a specific error -+ test_null_blob() Blob null value for testing - test_null_channel() Channel null value for testing - test_null_dict() Dict null value for testing - test_null_job() Job null value for testing - test_null_list() List null value for testing - test_null_partial() Funcref null value for testing - test_null_string() String null value for testing -! test_option_not_set({name}) none reset flag indicating option was set -! test_override({expr}, {val}) none test with Vim internal overrides - test_scrollbar({which}, {value}, {dragging}) - none scroll in the GUI for testing - test_settime({expr}) none set current time for testing -*************** -*** 9310,9334 **** - When the {expr} is the string "RESET" then the list of ignored - errors is made empty. - - test_null_channel() *test_null_channel()* -! Return a Channel that is null. Only useful for testing. - {only available when compiled with the +channel feature} - - test_null_dict() *test_null_dict()* -! Return a Dict that is null. Only useful for testing. - - test_null_job() *test_null_job()* -! Return a Job that is null. Only useful for testing. - {only available when compiled with the +job feature} - - test_null_list() *test_null_list()* -! Return a List that is null. Only useful for testing. - - test_null_partial() *test_null_partial()* -! Return a Partial that is null. Only useful for testing. - - test_null_string() *test_null_string()* -! Return a String that is null. Only useful for testing. - - test_option_not_set({name}) *test_option_not_set()* - Reset the flag that indicates option {name} was set. Thus it ---- 9339,9366 ---- - When the {expr} is the string "RESET" then the list of ignored - errors is made empty. - -+ test_null_blob() *test_null_blob()* -+ Return a |Blob| that is null. Only useful for testing. -+ - test_null_channel() *test_null_channel()* -! Return a |Channel| that is null. Only useful for testing. - {only available when compiled with the +channel feature} - - test_null_dict() *test_null_dict()* -! Return a |Dict| that is null. Only useful for testing. - - test_null_job() *test_null_job()* -! Return a |Job| that is null. Only useful for testing. - {only available when compiled with the +job feature} - - test_null_list() *test_null_list()* -! Return a |List| that is null. Only useful for testing. - - test_null_partial() *test_null_partial()* -! Return a |Partial| that is null. Only useful for testing. - - test_null_string() *test_null_string()* -! Return a |String| that is null. Only useful for testing. - - test_option_not_set({name}) *test_option_not_set()* - Reset the flag that indicates option {name} was set. Thus it -*** ../vim-8.1.0735/src/evalfunc.c 2019-01-12 22:47:01.260088089 +0100 ---- src/evalfunc.c 2019-01-13 14:51:50.650868801 +0100 -*************** -*** 429,434 **** ---- 429,435 ---- - static void f_test_override(typval_T *argvars, typval_T *rettv); - static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv); - static void f_test_ignore_error(typval_T *argvars, typval_T *rettv); -+ static void f_test_null_blob(typval_T *argvars, typval_T *rettv); - #ifdef FEAT_JOB_CHANNEL - static void f_test_null_channel(typval_T *argvars, typval_T *rettv); - #endif -*************** -*** 950,955 **** ---- 951,957 ---- - {"test_feedinput", 1, 1, f_test_feedinput}, - {"test_garbagecollect_now", 0, 0, f_test_garbagecollect_now}, - {"test_ignore_error", 1, 1, f_test_ignore_error}, -+ {"test_null_blob", 0, 0, f_test_null_blob}, - #ifdef FEAT_JOB_CHANNEL - {"test_null_channel", 0, 0, f_test_null_channel}, - #endif -*************** -*** 13902,13907 **** ---- 13904,13916 ---- - ignore_error_for_testing(tv_get_string(&argvars[0])); - } - -+ static void -+ f_test_null_blob(typval_T *argvars UNUSED, typval_T *rettv) -+ { -+ rettv->v_type = VAR_BLOB; -+ rettv->vval.v_blob = NULL; -+ } -+ - #ifdef FEAT_JOB_CHANNEL - static void - f_test_null_channel(typval_T *argvars UNUSED, typval_T *rettv) -*** ../vim-8.1.0735/src/blob.c 2019-01-12 22:47:01.256088105 +0100 ---- src/blob.c 2019-01-13 14:55:40.973274231 +0100 -*************** -*** 114,126 **** - blob_T *b1, - blob_T *b2) - { -! int i; - -! if (b1 == NULL || b2 == NULL) -! return FALSE; - if (b1 == b2) - return TRUE; -! if (blob_len(b1) != blob_len(b2)) - return FALSE; - - for (i = 0; i < b1->bv_ga.ga_len; i++) ---- 114,129 ---- - blob_T *b1, - blob_T *b2) - { -! int i; -! int len1 = blob_len(b1); -! int len2 = blob_len(b2); - -! // empty and NULL are considered the same -! if (len1 == 0 && len2 == 0) -! return TRUE; - if (b1 == b2) - return TRUE; -! if (len1 != len2) - return FALSE; - - for (i = 0; i < b1->bv_ga.ga_len; i++) -*** ../vim-8.1.0735/src/testdir/test49.vim 2019-01-09 23:00:57.997176121 +0100 ---- src/testdir/test49.vim 2019-01-13 15:11:40.054554337 +0100 -*************** -*** 1,6 **** - " Vim script language tests - " Author: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com> -! " Last Change: 2019 Jan 09 - - "------------------------------------------------------------------------------- - " Test environment {{{1 ---- 1,6 ---- - " Vim script language tests - " Author: Servatius Brandt <Servatius.Brandt@fujitsu-siemens.com> -! " Last Change: 2019 Jan 13 - - "------------------------------------------------------------------------------- - " Test environment {{{1 -*************** -*** 3694,3700 **** - if ExtraVim(msgfile) - try - Xpath 4194304 " X: 4194304 -! let x = novar " error E121/E15; exception: E121 - catch /E15:/ " should not catch - Xpath 8388608 " X: 0 - endtry ---- 3694,3700 ---- - if ExtraVim(msgfile) - try - Xpath 4194304 " X: 4194304 -! let x = novar " error E121; exception: E121 - catch /E15:/ " should not catch - Xpath 8388608 " X: 0 - endtry -*************** -*** 3702,3708 **** - endif - - Xpath 33554432 " X: 33554432 -! if !MESSAGES('E121', "Undefined variable", 'E15', "Invalid expression") - Xpath 67108864 " X: 0 - endif - ---- 3702,3708 ---- - endif - - Xpath 33554432 " X: 33554432 -! if !MESSAGES('E121', "Undefined variable") - Xpath 67108864 " X: 0 - endif - -*** ../vim-8.1.0735/src/version.c 2019-01-12 22:47:01.264088074 +0100 ---- src/version.c 2019-01-13 14:14:53.593982643 +0100 -*************** -*** 797,798 **** ---- 797,800 ---- - { /* Add new patch number below this line */ -+ /**/ -+ 736, - /**/ - --- -hundred-and-one symptoms of being an internet addict: -182. You may not know what is happening in the world, but you know - every bit of net-gossip there is. - - /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net \\\ -/// sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\ -\\\ an exciting new programming language -- http://www.Zimbu.org /// - \\\ help me help AIDS victims -- http://ICCF-Holland.org /// |