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 */