Mercurial > vim
comparison src/eval.c @ 842:a209672376fd v7.0f
updated for version 7.0f
author | vimboss |
---|---|
date | Mon, 24 Apr 2006 19:47:27 +0000 |
parents | c2cae213194d |
children | d3bbb5dd3913 |
comparison
equal
deleted
inserted
replaced
841:c2cae213194d | 842:a209672376fd |
---|---|
493 static void f_eventhandler __ARGS((typval_T *argvars, typval_T *rettv)); | 493 static void f_eventhandler __ARGS((typval_T *argvars, typval_T *rettv)); |
494 static void f_executable __ARGS((typval_T *argvars, typval_T *rettv)); | 494 static void f_executable __ARGS((typval_T *argvars, typval_T *rettv)); |
495 static void f_exists __ARGS((typval_T *argvars, typval_T *rettv)); | 495 static void f_exists __ARGS((typval_T *argvars, typval_T *rettv)); |
496 static void f_expand __ARGS((typval_T *argvars, typval_T *rettv)); | 496 static void f_expand __ARGS((typval_T *argvars, typval_T *rettv)); |
497 static void f_extend __ARGS((typval_T *argvars, typval_T *rettv)); | 497 static void f_extend __ARGS((typval_T *argvars, typval_T *rettv)); |
498 static void f_feedkeys __ARGS((typval_T *argvars, typval_T *rettv)); | |
498 static void f_filereadable __ARGS((typval_T *argvars, typval_T *rettv)); | 499 static void f_filereadable __ARGS((typval_T *argvars, typval_T *rettv)); |
499 static void f_filewritable __ARGS((typval_T *argvars, typval_T *rettv)); | 500 static void f_filewritable __ARGS((typval_T *argvars, typval_T *rettv)); |
500 static void f_filter __ARGS((typval_T *argvars, typval_T *rettv)); | 501 static void f_filter __ARGS((typval_T *argvars, typval_T *rettv)); |
501 static void f_finddir __ARGS((typval_T *argvars, typval_T *rettv)); | 502 static void f_finddir __ARGS((typval_T *argvars, typval_T *rettv)); |
502 static void f_findfile __ARGS((typval_T *argvars, typval_T *rettv)); | 503 static void f_findfile __ARGS((typval_T *argvars, typval_T *rettv)); |
585 static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv)); | 586 static void f_nr2char __ARGS((typval_T *argvars, typval_T *rettv)); |
586 static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv)); | 587 static void f_pathshorten __ARGS((typval_T *argvars, typval_T *rettv)); |
587 static void f_prevnonblank __ARGS((typval_T *argvars, typval_T *rettv)); | 588 static void f_prevnonblank __ARGS((typval_T *argvars, typval_T *rettv)); |
588 static void f_printf __ARGS((typval_T *argvars, typval_T *rettv)); | 589 static void f_printf __ARGS((typval_T *argvars, typval_T *rettv)); |
589 static void f_pumvisible __ARGS((typval_T *argvars, typval_T *rettv)); | 590 static void f_pumvisible __ARGS((typval_T *argvars, typval_T *rettv)); |
590 static void f_pushkeys __ARGS((typval_T *argvars, typval_T *rettv)); | |
591 static void f_range __ARGS((typval_T *argvars, typval_T *rettv)); | 591 static void f_range __ARGS((typval_T *argvars, typval_T *rettv)); |
592 static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv)); | 592 static void f_readfile __ARGS((typval_T *argvars, typval_T *rettv)); |
593 static void f_reltime __ARGS((typval_T *argvars, typval_T *rettv)); | 593 static void f_reltime __ARGS((typval_T *argvars, typval_T *rettv)); |
594 static void f_reltimestr __ARGS((typval_T *argvars, typval_T *rettv)); | 594 static void f_reltimestr __ARGS((typval_T *argvars, typval_T *rettv)); |
595 static void f_remote_expr __ARGS((typval_T *argvars, typval_T *rettv)); | 595 static void f_remote_expr __ARGS((typval_T *argvars, typval_T *rettv)); |
2579 lp->ll_dict = NULL; | 2579 lp->ll_dict = NULL; |
2580 lp->ll_list = lp->ll_tv->vval.v_list; | 2580 lp->ll_list = lp->ll_tv->vval.v_list; |
2581 lp->ll_li = list_find(lp->ll_list, lp->ll_n1); | 2581 lp->ll_li = list_find(lp->ll_list, lp->ll_n1); |
2582 if (lp->ll_li == NULL) | 2582 if (lp->ll_li == NULL) |
2583 { | 2583 { |
2584 if (!quiet) | 2584 if (lp->ll_n1 < 0) |
2585 EMSGN(_(e_listidx), lp->ll_n1); | 2585 { |
2586 lp->ll_n1 = 0; | |
2587 lp->ll_li = list_find(lp->ll_list, lp->ll_n1); | |
2588 } | |
2589 } | |
2590 if (lp->ll_li == NULL) | |
2591 { | |
2586 if (lp->ll_range && !lp->ll_empty2) | 2592 if (lp->ll_range && !lp->ll_empty2) |
2587 clear_tv(&var2); | 2593 clear_tv(&var2); |
2588 return NULL; | 2594 return NULL; |
2589 } | 2595 } |
2590 | 2596 |
2600 clear_tv(&var2); | 2606 clear_tv(&var2); |
2601 if (lp->ll_n2 < 0) | 2607 if (lp->ll_n2 < 0) |
2602 { | 2608 { |
2603 ni = list_find(lp->ll_list, lp->ll_n2); | 2609 ni = list_find(lp->ll_list, lp->ll_n2); |
2604 if (ni == NULL) | 2610 if (ni == NULL) |
2605 { | |
2606 if (!quiet) | |
2607 EMSGN(_(e_listidx), lp->ll_n2); | |
2608 return NULL; | 2611 return NULL; |
2609 } | |
2610 lp->ll_n2 = list_idx_of_item(lp->ll_list, ni); | 2612 lp->ll_n2 = list_idx_of_item(lp->ll_list, ni); |
2611 } | 2613 } |
2612 | 2614 |
2613 /* Check that lp->ll_n2 isn't before lp->ll_n1. */ | 2615 /* Check that lp->ll_n2 isn't before lp->ll_n1. */ |
2614 if (lp->ll_n1 < 0) | 2616 if (lp->ll_n1 < 0) |
2615 lp->ll_n1 = list_idx_of_item(lp->ll_list, lp->ll_li); | 2617 lp->ll_n1 = list_idx_of_item(lp->ll_list, lp->ll_li); |
2616 if (lp->ll_n2 < lp->ll_n1) | 2618 if (lp->ll_n2 < lp->ll_n1) |
2617 { | |
2618 if (!quiet) | |
2619 EMSGN(_(e_listidx), lp->ll_n2); | |
2620 return NULL; | 2619 return NULL; |
2621 } | |
2622 } | 2620 } |
2623 | 2621 |
2624 lp->ll_tv = &lp->ll_li->li_tv; | 2622 lp->ll_tv = &lp->ll_li->li_tv; |
2625 } | 2623 } |
2626 } | 2624 } |
4859 len = list_len(rettv->vval.v_list); | 4857 len = list_len(rettv->vval.v_list); |
4860 if (n1 < 0) | 4858 if (n1 < 0) |
4861 n1 = len + n1; | 4859 n1 = len + n1; |
4862 if (!empty1 && (n1 < 0 || n1 >= len)) | 4860 if (!empty1 && (n1 < 0 || n1 >= len)) |
4863 { | 4861 { |
4864 if (verbose) | 4862 /* For a range we allow invalid values and return an empty |
4865 EMSGN(_(e_listidx), n1); | 4863 * list. A list index out of range is an error. */ |
4866 return FAIL; | 4864 if (!range) |
4865 { | |
4866 if (verbose) | |
4867 EMSGN(_(e_listidx), n1); | |
4868 return FAIL; | |
4869 } | |
4870 n1 = len; | |
4867 } | 4871 } |
4868 if (range) | 4872 if (range) |
4869 { | 4873 { |
4870 list_T *l; | 4874 list_T *l; |
4871 listitem_T *item; | 4875 listitem_T *item; |
4873 if (n2 < 0) | 4877 if (n2 < 0) |
4874 n2 = len + n2; | 4878 n2 = len + n2; |
4875 else if (n2 >= len) | 4879 else if (n2 >= len) |
4876 n2 = len - 1; | 4880 n2 = len - 1; |
4877 if (!empty2 && (n2 < 0 || n2 + 1 < n1)) | 4881 if (!empty2 && (n2 < 0 || n2 + 1 < n1)) |
4878 { | 4882 n2 = -1; |
4879 if (verbose) | |
4880 EMSGN(_(e_listidx), n2); | |
4881 return FAIL; | |
4882 } | |
4883 l = list_alloc(); | 4883 l = list_alloc(); |
4884 if (l == NULL) | 4884 if (l == NULL) |
4885 return FAIL; | 4885 return FAIL; |
4886 for (item = list_find(rettv->vval.v_list, n1); | 4886 for (item = list_find(rettv->vval.v_list, n1); |
4887 n1 <= n2; ++n1) | 4887 n1 <= n2; ++n1) |
4898 rettv->vval.v_list = l; | 4898 rettv->vval.v_list = l; |
4899 ++l->lv_refcount; | 4899 ++l->lv_refcount; |
4900 } | 4900 } |
4901 else | 4901 else |
4902 { | 4902 { |
4903 copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv, | 4903 copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv, &var1); |
4904 &var1); | |
4905 clear_tv(rettv); | 4904 clear_tv(rettv); |
4906 *rettv = var1; | 4905 *rettv = var1; |
4907 } | 4906 } |
4908 break; | 4907 break; |
4909 | 4908 |
7004 {"eventhandler", 0, 0, f_eventhandler}, | 7003 {"eventhandler", 0, 0, f_eventhandler}, |
7005 {"executable", 1, 1, f_executable}, | 7004 {"executable", 1, 1, f_executable}, |
7006 {"exists", 1, 1, f_exists}, | 7005 {"exists", 1, 1, f_exists}, |
7007 {"expand", 1, 2, f_expand}, | 7006 {"expand", 1, 2, f_expand}, |
7008 {"extend", 2, 3, f_extend}, | 7007 {"extend", 2, 3, f_extend}, |
7008 {"feedkeys", 1, 2, f_feedkeys}, | |
7009 {"file_readable", 1, 1, f_filereadable}, /* obsolete */ | 7009 {"file_readable", 1, 1, f_filereadable}, /* obsolete */ |
7010 {"filereadable", 1, 1, f_filereadable}, | 7010 {"filereadable", 1, 1, f_filereadable}, |
7011 {"filewritable", 1, 1, f_filewritable}, | 7011 {"filewritable", 1, 1, f_filewritable}, |
7012 {"filter", 2, 2, f_filter}, | 7012 {"filter", 2, 2, f_filter}, |
7013 {"finddir", 1, 3, f_finddir}, | 7013 {"finddir", 1, 3, f_finddir}, |
7100 {"nr2char", 1, 1, f_nr2char}, | 7100 {"nr2char", 1, 1, f_nr2char}, |
7101 {"pathshorten", 1, 1, f_pathshorten}, | 7101 {"pathshorten", 1, 1, f_pathshorten}, |
7102 {"prevnonblank", 1, 1, f_prevnonblank}, | 7102 {"prevnonblank", 1, 1, f_prevnonblank}, |
7103 {"printf", 2, 19, f_printf}, | 7103 {"printf", 2, 19, f_printf}, |
7104 {"pumvisible", 0, 0, f_pumvisible}, | 7104 {"pumvisible", 0, 0, f_pumvisible}, |
7105 {"pushkeys", 1, 2, f_pushkeys}, | |
7106 {"range", 1, 3, f_range}, | 7105 {"range", 1, 3, f_range}, |
7107 {"readfile", 1, 3, f_readfile}, | 7106 {"readfile", 1, 3, f_readfile}, |
7108 {"reltime", 0, 2, f_reltime}, | 7107 {"reltime", 0, 2, f_reltime}, |
7109 {"reltimestr", 1, 1, f_reltimestr}, | 7108 {"reltimestr", 1, 1, f_reltimestr}, |
7110 {"remote_expr", 2, 3, f_remote_expr}, | 7109 {"remote_expr", 2, 3, f_remote_expr}, |
8987 else | 8986 else |
8988 EMSG2(_(e_listdictarg), "extend()"); | 8987 EMSG2(_(e_listdictarg), "extend()"); |
8989 } | 8988 } |
8990 | 8989 |
8991 /* | 8990 /* |
8991 * "feedkeys()" function | |
8992 */ | |
8993 /*ARGSUSED*/ | |
8994 static void | |
8995 f_feedkeys(argvars, rettv) | |
8996 typval_T *argvars; | |
8997 typval_T *rettv; | |
8998 { | |
8999 int remap = TRUE; | |
9000 char_u *keys, *flags; | |
9001 char_u nbuf[NUMBUFLEN]; | |
9002 int typed = FALSE; | |
9003 | |
9004 rettv->vval.v_number = 0; | |
9005 keys = get_tv_string(&argvars[0]); | |
9006 if (*keys != NUL) | |
9007 { | |
9008 if (argvars[1].v_type != VAR_UNKNOWN) | |
9009 { | |
9010 flags = get_tv_string_buf(&argvars[1], nbuf); | |
9011 for ( ; *flags != NUL; ++flags) | |
9012 { | |
9013 switch (*flags) | |
9014 { | |
9015 case 'n': remap = FALSE; break; | |
9016 case 'm': remap = TRUE; break; | |
9017 case 't': typed = TRUE; break; | |
9018 } | |
9019 } | |
9020 } | |
9021 | |
9022 ins_typebuf(keys, (remap ? REMAP_YES : REMAP_NONE), | |
9023 typebuf.tb_len, !typed, FALSE); | |
9024 typebuf_was_filled = TRUE; | |
9025 } | |
9026 } | |
9027 | |
9028 /* | |
8992 * "filereadable()" function | 9029 * "filereadable()" function |
8993 */ | 9030 */ |
8994 static void | 9031 static void |
8995 f_filereadable(argvars, rettv) | 9032 f_filereadable(argvars, rettv) |
8996 typval_T *argvars; | 9033 typval_T *argvars; |
12171 | 12208 |
12172 /* return list with matched string and submatches */ | 12209 /* return list with matched string and submatches */ |
12173 for (i = 0; i < NSUBEXP; ++i) | 12210 for (i = 0; i < NSUBEXP; ++i) |
12174 { | 12211 { |
12175 if (regmatch.endp[i] == NULL) | 12212 if (regmatch.endp[i] == NULL) |
12176 break; | 12213 { |
12177 if (list_append_string(rettv->vval.v_list, | 12214 if (list_append_string(rettv->vval.v_list, |
12215 (char_u *)"", 0) == FAIL) | |
12216 break; | |
12217 } | |
12218 else if (list_append_string(rettv->vval.v_list, | |
12178 regmatch.startp[i], | 12219 regmatch.startp[i], |
12179 (int)(regmatch.endp[i] - regmatch.startp[i])) | 12220 (int)(regmatch.endp[i] - regmatch.startp[i])) |
12180 == FAIL) | 12221 == FAIL) |
12181 break; | 12222 break; |
12182 } | 12223 } |
12616 rettv->vval.v_number = 0; | 12657 rettv->vval.v_number = 0; |
12617 #ifdef FEAT_INS_EXPAND | 12658 #ifdef FEAT_INS_EXPAND |
12618 if (pum_visible()) | 12659 if (pum_visible()) |
12619 rettv->vval.v_number = 1; | 12660 rettv->vval.v_number = 1; |
12620 #endif | 12661 #endif |
12621 } | |
12622 | |
12623 /* | |
12624 * "pushkeys()" function | |
12625 */ | |
12626 /*ARGSUSED*/ | |
12627 static void | |
12628 f_pushkeys(argvars, rettv) | |
12629 typval_T *argvars; | |
12630 typval_T *rettv; | |
12631 { | |
12632 int remap = TRUE; | |
12633 char_u *keys, *flags; | |
12634 char_u nbuf[NUMBUFLEN]; | |
12635 | |
12636 rettv->vval.v_number = 0; | |
12637 keys = get_tv_string(&argvars[0]); | |
12638 if (*keys != NUL) | |
12639 { | |
12640 if (argvars[1].v_type != VAR_UNKNOWN) | |
12641 { | |
12642 flags = get_tv_string_buf(&argvars[1], nbuf); | |
12643 for ( ; *flags != NUL; ++flags) | |
12644 { | |
12645 switch (*flags) | |
12646 { | |
12647 case 'n': remap = FALSE; break; | |
12648 case 'm': remap = TRUE; break; | |
12649 } | |
12650 } | |
12651 } | |
12652 | |
12653 ins_typebuf(keys, (remap ? REMAP_YES : REMAP_NONE), | |
12654 typebuf.tb_len, TRUE, FALSE); | |
12655 typebuf_was_filled = TRUE; | |
12656 } | |
12657 } | 12662 } |
12658 | 12663 |
12659 /* | 12664 /* |
12660 * "range()" function | 12665 * "range()" function |
12661 */ | 12666 */ |