diff options
Diffstat (limited to 'data/vim/patches/8.1.0736')
-rw-r--r-- | data/vim/patches/8.1.0736 | 735 |
1 files changed, 735 insertions, 0 deletions
diff --git a/data/vim/patches/8.1.0736 b/data/vim/patches/8.1.0736 new file mode 100644 index 000000000..33f3eae24 --- /dev/null +++ b/data/vim/patches/8.1.0736 @@ -0,0 +1,735 @@ +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 /// |