1 /* vi:set ts=8 sts=4 sw=4 noet: 2 * 3 * VIM - Vi IMproved by Bram Moolenaar 4 * 5 * Do ":help uganda" in Vim to read copying and usage conditions. 6 * Do ":help credits" in Vim to see a list of people who contributed. 7 * See README.txt for an overview of the Vim source code. 8 */ 9 10 /* 11 * eval.c: Expression evaluation. 12 */ 13 #define USING_FLOAT_STUFF 14 15 #include "vim.h" 16 17 #if defined(FEAT_EVAL) || defined(PROTO) 18 19 #ifdef VMS 20 # include <float.h> 21 #endif 22 23 static char *e_missbrac = N_("E111: Missing ']'"); 24 static char *e_dictrange = N_("E719: Cannot use [:] with a Dictionary"); 25 #ifdef FEAT_FLOAT 26 static char *e_float_as_string = N_("E806: using Float as a String"); 27 #endif 28 static char *e_nowhitespace = N_("E274: No white space allowed before parenthesis"); 29 30 #define NAMESPACE_CHAR (char_u *)"abglstvw" 31 32 /* 33 * When recursively copying lists and dicts we need to remember which ones we 34 * have done to avoid endless recursiveness. This unique ID is used for that. 35 * The last bit is used for previous_funccal, ignored when comparing. 36 */ 37 static int current_copyID = 0; 38 39 static int echo_attr = 0; /* attributes used for ":echo" */ 40 41 /* 42 * Info used by a ":for" loop. 43 */ 44 typedef struct 45 { 46 int fi_semicolon; /* TRUE if ending in '; var]' */ 47 int fi_varcount; /* nr of variables in the list */ 48 listwatch_T fi_lw; /* keep an eye on the item used. */ 49 list_T *fi_list; /* list being used */ 50 int fi_bi; /* index of blob */ 51 blob_T *fi_blob; /* blob being used */ 52 } forinfo_T; 53 54 static int tv_op(typval_T *tv1, typval_T *tv2, char_u *op); 55 static int eval2(char_u **arg, typval_T *rettv, int evaluate); 56 static int eval3(char_u **arg, typval_T *rettv, int evaluate); 57 static int eval4(char_u **arg, typval_T *rettv, int evaluate); 58 static int eval5(char_u **arg, typval_T *rettv, int evaluate); 59 static int eval6(char_u **arg, typval_T *rettv, int evaluate, int want_string); 60 static int eval7(char_u **arg, typval_T *rettv, int evaluate, int want_string); 61 static int eval7_leader(typval_T *rettv, char_u *start_leader, char_u **end_leaderp); 62 63 static int get_string_tv(char_u **arg, typval_T *rettv, int evaluate); 64 static int get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate); 65 static int free_unref_items(int copyID); 66 static int get_env_tv(char_u **arg, typval_T *rettv, int evaluate); 67 static char_u *make_expanded_name(char_u *in_start, char_u *expr_start, char_u *expr_end, char_u *in_end); 68 static int tv_check_lock(typval_T *tv, char_u *name, int use_gettext); 69 70 /* 71 * Return "n1" divided by "n2", taking care of dividing by zero. 72 */ 73 varnumber_T 74 num_divide(varnumber_T n1, varnumber_T n2) 75 { 76 varnumber_T result; 77 78 if (n2 == 0) // give an error message? 79 { 80 if (n1 == 0) 81 result = VARNUM_MIN; // similar to NaN 82 else if (n1 < 0) 83 result = -VARNUM_MAX; 84 else 85 result = VARNUM_MAX; 86 } 87 else 88 result = n1 / n2; 89 90 return result; 91 } 92 93 /* 94 * Return "n1" modulus "n2", taking care of dividing by zero. 95 */ 96 varnumber_T 97 num_modulus(varnumber_T n1, varnumber_T n2) 98 { 99 // Give an error when n2 is 0? 100 return (n2 == 0) ? 0 : (n1 % n2); 101 } 102 103 #if defined(EBCDIC) || defined(PROTO) 104 /* 105 * Compare struct fst by function name. 106 */ 107 static int 108 compare_func_name(const void *s1, const void *s2) 109 { 110 struct fst *p1 = (struct fst *)s1; 111 struct fst *p2 = (struct fst *)s2; 112 113 return STRCMP(p1->f_name, p2->f_name); 114 } 115 116 /* 117 * Sort the function table by function name. 118 * The sorting of the table above is ASCII dependent. 119 * On machines using EBCDIC we have to sort it. 120 */ 121 static void 122 sortFunctions(void) 123 { 124 int funcCnt = (int)(sizeof(functions) / sizeof(struct fst)) - 1; 125 126 qsort(functions, (size_t)funcCnt, sizeof(struct fst), compare_func_name); 127 } 128 #endif 129 130 /* 131 * Initialize the global and v: variables. 132 */ 133 void 134 eval_init(void) 135 { 136 evalvars_init(); 137 func_init(); 138 139 #ifdef EBCDIC 140 /* 141 * Sort the function table, to enable binary search. 142 */ 143 sortFunctions(); 144 #endif 145 } 146 147 #if defined(EXITFREE) || defined(PROTO) 148 void 149 eval_clear(void) 150 { 151 evalvars_clear(); 152 153 free_scriptnames(); 154 free_locales(); 155 156 // autoloaded script names 157 free_autoload_scriptnames(); 158 159 // unreferenced lists and dicts 160 (void)garbage_collect(FALSE); 161 162 // functions not garbage collected 163 free_all_functions(); 164 } 165 #endif 166 167 /* 168 * Top level evaluation function, returning a boolean. 169 * Sets "error" to TRUE if there was an error. 170 * Return TRUE or FALSE. 171 */ 172 int 173 eval_to_bool( 174 char_u *arg, 175 int *error, 176 char_u **nextcmd, 177 int skip) /* only parse, don't execute */ 178 { 179 typval_T tv; 180 varnumber_T retval = FALSE; 181 182 if (skip) 183 ++emsg_skip; 184 if (eval0(arg, &tv, nextcmd, !skip) == FAIL) 185 *error = TRUE; 186 else 187 { 188 *error = FALSE; 189 if (!skip) 190 { 191 retval = (tv_get_number_chk(&tv, error) != 0); 192 clear_tv(&tv); 193 } 194 } 195 if (skip) 196 --emsg_skip; 197 198 return (int)retval; 199 } 200 201 /* 202 * Call eval1() and give an error message if not done at a lower level. 203 */ 204 static int 205 eval1_emsg(char_u **arg, typval_T *rettv, int evaluate) 206 { 207 char_u *start = *arg; 208 int ret; 209 int did_emsg_before = did_emsg; 210 int called_emsg_before = called_emsg; 211 212 ret = eval1(arg, rettv, evaluate); 213 if (ret == FAIL) 214 { 215 // Report the invalid expression unless the expression evaluation has 216 // been cancelled due to an aborting error, an interrupt, or an 217 // exception, or we already gave a more specific error. 218 // Also check called_emsg for when using assert_fails(). 219 if (!aborting() && did_emsg == did_emsg_before 220 && called_emsg == called_emsg_before) 221 semsg(_(e_invexpr2), start); 222 } 223 return ret; 224 } 225 226 int 227 eval_expr_typval(typval_T *expr, typval_T *argv, int argc, typval_T *rettv) 228 { 229 char_u *s; 230 char_u buf[NUMBUFLEN]; 231 funcexe_T funcexe; 232 233 if (expr->v_type == VAR_FUNC) 234 { 235 s = expr->vval.v_string; 236 if (s == NULL || *s == NUL) 237 return FAIL; 238 vim_memset(&funcexe, 0, sizeof(funcexe)); 239 funcexe.evaluate = TRUE; 240 if (call_func(s, -1, rettv, argc, argv, &funcexe) == FAIL) 241 return FAIL; 242 } 243 else if (expr->v_type == VAR_PARTIAL) 244 { 245 partial_T *partial = expr->vval.v_partial; 246 247 s = partial_name(partial); 248 if (s == NULL || *s == NUL) 249 return FAIL; 250 vim_memset(&funcexe, 0, sizeof(funcexe)); 251 funcexe.evaluate = TRUE; 252 funcexe.partial = partial; 253 if (call_func(s, -1, rettv, argc, argv, &funcexe) == FAIL) 254 return FAIL; 255 } 256 else 257 { 258 s = tv_get_string_buf_chk(expr, buf); 259 if (s == NULL) 260 return FAIL; 261 s = skipwhite(s); 262 if (eval1_emsg(&s, rettv, TRUE) == FAIL) 263 return FAIL; 264 if (*s != NUL) /* check for trailing chars after expr */ 265 { 266 clear_tv(rettv); 267 semsg(_(e_invexpr2), s); 268 return FAIL; 269 } 270 } 271 return OK; 272 } 273 274 /* 275 * Like eval_to_bool() but using a typval_T instead of a string. 276 * Works for string, funcref and partial. 277 */ 278 int 279 eval_expr_to_bool(typval_T *expr, int *error) 280 { 281 typval_T rettv; 282 int res; 283 284 if (eval_expr_typval(expr, NULL, 0, &rettv) == FAIL) 285 { 286 *error = TRUE; 287 return FALSE; 288 } 289 res = (tv_get_number_chk(&rettv, error) != 0); 290 clear_tv(&rettv); 291 return res; 292 } 293 294 /* 295 * Top level evaluation function, returning a string. If "skip" is TRUE, 296 * only parsing to "nextcmd" is done, without reporting errors. Return 297 * pointer to allocated memory, or NULL for failure or when "skip" is TRUE. 298 */ 299 char_u * 300 eval_to_string_skip( 301 char_u *arg, 302 char_u **nextcmd, 303 int skip) /* only parse, don't execute */ 304 { 305 typval_T tv; 306 char_u *retval; 307 308 if (skip) 309 ++emsg_skip; 310 if (eval0(arg, &tv, nextcmd, !skip) == FAIL || skip) 311 retval = NULL; 312 else 313 { 314 retval = vim_strsave(tv_get_string(&tv)); 315 clear_tv(&tv); 316 } 317 if (skip) 318 --emsg_skip; 319 320 return retval; 321 } 322 323 /* 324 * Skip over an expression at "*pp". 325 * Return FAIL for an error, OK otherwise. 326 */ 327 int 328 skip_expr(char_u **pp) 329 { 330 typval_T rettv; 331 332 *pp = skipwhite(*pp); 333 return eval1(pp, &rettv, FALSE); 334 } 335 336 /* 337 * Top level evaluation function, returning a string. 338 * When "convert" is TRUE convert a List into a sequence of lines and convert 339 * a Float to a String. 340 * Return pointer to allocated memory, or NULL for failure. 341 */ 342 char_u * 343 eval_to_string( 344 char_u *arg, 345 char_u **nextcmd, 346 int convert) 347 { 348 typval_T tv; 349 char_u *retval; 350 garray_T ga; 351 #ifdef FEAT_FLOAT 352 char_u numbuf[NUMBUFLEN]; 353 #endif 354 355 if (eval0(arg, &tv, nextcmd, TRUE) == FAIL) 356 retval = NULL; 357 else 358 { 359 if (convert && tv.v_type == VAR_LIST) 360 { 361 ga_init2(&ga, (int)sizeof(char), 80); 362 if (tv.vval.v_list != NULL) 363 { 364 list_join(&ga, tv.vval.v_list, (char_u *)"\n", TRUE, FALSE, 0); 365 if (tv.vval.v_list->lv_len > 0) 366 ga_append(&ga, NL); 367 } 368 ga_append(&ga, NUL); 369 retval = (char_u *)ga.ga_data; 370 } 371 #ifdef FEAT_FLOAT 372 else if (convert && tv.v_type == VAR_FLOAT) 373 { 374 vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv.vval.v_float); 375 retval = vim_strsave(numbuf); 376 } 377 #endif 378 else 379 retval = vim_strsave(tv_get_string(&tv)); 380 clear_tv(&tv); 381 } 382 383 return retval; 384 } 385 386 /* 387 * Call eval_to_string() without using current local variables and using 388 * textlock. When "use_sandbox" is TRUE use the sandbox. 389 */ 390 char_u * 391 eval_to_string_safe( 392 char_u *arg, 393 char_u **nextcmd, 394 int use_sandbox) 395 { 396 char_u *retval; 397 funccal_entry_T funccal_entry; 398 399 save_funccal(&funccal_entry); 400 if (use_sandbox) 401 ++sandbox; 402 ++textlock; 403 retval = eval_to_string(arg, nextcmd, FALSE); 404 if (use_sandbox) 405 --sandbox; 406 --textlock; 407 restore_funccal(); 408 return retval; 409 } 410 411 /* 412 * Top level evaluation function, returning a number. 413 * Evaluates "expr" silently. 414 * Returns -1 for an error. 415 */ 416 varnumber_T 417 eval_to_number(char_u *expr) 418 { 419 typval_T rettv; 420 varnumber_T retval; 421 char_u *p = skipwhite(expr); 422 423 ++emsg_off; 424 425 if (eval1(&p, &rettv, TRUE) == FAIL) 426 retval = -1; 427 else 428 { 429 retval = tv_get_number_chk(&rettv, NULL); 430 clear_tv(&rettv); 431 } 432 --emsg_off; 433 434 return retval; 435 } 436 437 /* 438 * Top level evaluation function. 439 * Returns an allocated typval_T with the result. 440 * Returns NULL when there is an error. 441 */ 442 typval_T * 443 eval_expr(char_u *arg, char_u **nextcmd) 444 { 445 typval_T *tv; 446 447 tv = ALLOC_ONE(typval_T); 448 if (tv != NULL && eval0(arg, tv, nextcmd, TRUE) == FAIL) 449 VIM_CLEAR(tv); 450 451 return tv; 452 } 453 454 /* 455 * Call some Vim script function and return the result in "*rettv". 456 * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] 457 * should have type VAR_UNKNOWN. 458 * Returns OK or FAIL. 459 */ 460 int 461 call_vim_function( 462 char_u *func, 463 int argc, 464 typval_T *argv, 465 typval_T *rettv) 466 { 467 int ret; 468 funcexe_T funcexe; 469 470 rettv->v_type = VAR_UNKNOWN; /* clear_tv() uses this */ 471 vim_memset(&funcexe, 0, sizeof(funcexe)); 472 funcexe.firstline = curwin->w_cursor.lnum; 473 funcexe.lastline = curwin->w_cursor.lnum; 474 funcexe.evaluate = TRUE; 475 ret = call_func(func, -1, rettv, argc, argv, &funcexe); 476 if (ret == FAIL) 477 clear_tv(rettv); 478 479 return ret; 480 } 481 482 /* 483 * Call Vim script function "func" and return the result as a number. 484 * Returns -1 when calling the function fails. 485 * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should 486 * have type VAR_UNKNOWN. 487 */ 488 varnumber_T 489 call_func_retnr( 490 char_u *func, 491 int argc, 492 typval_T *argv) 493 { 494 typval_T rettv; 495 varnumber_T retval; 496 497 if (call_vim_function(func, argc, argv, &rettv) == FAIL) 498 return -1; 499 500 retval = tv_get_number_chk(&rettv, NULL); 501 clear_tv(&rettv); 502 return retval; 503 } 504 505 /* 506 * Call Vim script function "func" and return the result as a string. 507 * Returns NULL when calling the function fails. 508 * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should 509 * have type VAR_UNKNOWN. 510 */ 511 void * 512 call_func_retstr( 513 char_u *func, 514 int argc, 515 typval_T *argv) 516 { 517 typval_T rettv; 518 char_u *retval; 519 520 if (call_vim_function(func, argc, argv, &rettv) == FAIL) 521 return NULL; 522 523 retval = vim_strsave(tv_get_string(&rettv)); 524 clear_tv(&rettv); 525 return retval; 526 } 527 528 /* 529 * Call Vim script function "func" and return the result as a List. 530 * Uses argv[0] to argv[argc - 1] for the function arguments. argv[argc] should 531 * have type VAR_UNKNOWN. 532 * Returns NULL when there is something wrong. 533 */ 534 void * 535 call_func_retlist( 536 char_u *func, 537 int argc, 538 typval_T *argv) 539 { 540 typval_T rettv; 541 542 if (call_vim_function(func, argc, argv, &rettv) == FAIL) 543 return NULL; 544 545 if (rettv.v_type != VAR_LIST) 546 { 547 clear_tv(&rettv); 548 return NULL; 549 } 550 551 return rettv.vval.v_list; 552 } 553 554 #ifdef FEAT_FOLDING 555 /* 556 * Evaluate 'foldexpr'. Returns the foldlevel, and any character preceding 557 * it in "*cp". Doesn't give error messages. 558 */ 559 int 560 eval_foldexpr(char_u *arg, int *cp) 561 { 562 typval_T tv; 563 varnumber_T retval; 564 char_u *s; 565 int use_sandbox = was_set_insecurely((char_u *)"foldexpr", 566 OPT_LOCAL); 567 568 ++emsg_off; 569 if (use_sandbox) 570 ++sandbox; 571 ++textlock; 572 *cp = NUL; 573 if (eval0(arg, &tv, NULL, TRUE) == FAIL) 574 retval = 0; 575 else 576 { 577 /* If the result is a number, just return the number. */ 578 if (tv.v_type == VAR_NUMBER) 579 retval = tv.vval.v_number; 580 else if (tv.v_type != VAR_STRING || tv.vval.v_string == NULL) 581 retval = 0; 582 else 583 { 584 /* If the result is a string, check if there is a non-digit before 585 * the number. */ 586 s = tv.vval.v_string; 587 if (!VIM_ISDIGIT(*s) && *s != '-') 588 *cp = *s++; 589 retval = atol((char *)s); 590 } 591 clear_tv(&tv); 592 } 593 --emsg_off; 594 if (use_sandbox) 595 --sandbox; 596 --textlock; 597 598 return (int)retval; 599 } 600 #endif 601 602 /* 603 * Get an lval: variable, Dict item or List item that can be assigned a value 604 * to: "name", "na{me}", "name[expr]", "name[expr:expr]", "name[expr][expr]", 605 * "name.key", "name.key[expr]" etc. 606 * Indexing only works if "name" is an existing List or Dictionary. 607 * "name" points to the start of the name. 608 * If "rettv" is not NULL it points to the value to be assigned. 609 * "unlet" is TRUE for ":unlet": slightly different behavior when something is 610 * wrong; must end in space or cmd separator. 611 * 612 * flags: 613 * GLV_QUIET: do not give error messages 614 * GLV_READ_ONLY: will not change the variable 615 * GLV_NO_AUTOLOAD: do not use script autoloading 616 * 617 * Returns a pointer to just after the name, including indexes. 618 * When an evaluation error occurs "lp->ll_name" is NULL; 619 * Returns NULL for a parsing error. Still need to free items in "lp"! 620 */ 621 char_u * 622 get_lval( 623 char_u *name, 624 typval_T *rettv, 625 lval_T *lp, 626 int unlet, 627 int skip, 628 int flags, /* GLV_ values */ 629 int fne_flags) /* flags for find_name_end() */ 630 { 631 char_u *p; 632 char_u *expr_start, *expr_end; 633 int cc; 634 dictitem_T *v; 635 typval_T var1; 636 typval_T var2; 637 int empty1 = FALSE; 638 listitem_T *ni; 639 char_u *key = NULL; 640 int len; 641 hashtab_T *ht; 642 int quiet = flags & GLV_QUIET; 643 644 /* Clear everything in "lp". */ 645 vim_memset(lp, 0, sizeof(lval_T)); 646 647 if (skip) 648 { 649 /* When skipping just find the end of the name. */ 650 lp->ll_name = name; 651 return find_name_end(name, NULL, NULL, FNE_INCL_BR | fne_flags); 652 } 653 654 /* Find the end of the name. */ 655 p = find_name_end(name, &expr_start, &expr_end, fne_flags); 656 if (expr_start != NULL) 657 { 658 /* Don't expand the name when we already know there is an error. */ 659 if (unlet && !VIM_ISWHITE(*p) && !ends_excmd(*p) 660 && *p != '[' && *p != '.') 661 { 662 emsg(_(e_trailing)); 663 return NULL; 664 } 665 666 lp->ll_exp_name = make_expanded_name(name, expr_start, expr_end, p); 667 if (lp->ll_exp_name == NULL) 668 { 669 /* Report an invalid expression in braces, unless the 670 * expression evaluation has been cancelled due to an 671 * aborting error, an interrupt, or an exception. */ 672 if (!aborting() && !quiet) 673 { 674 emsg_severe = TRUE; 675 semsg(_(e_invarg2), name); 676 return NULL; 677 } 678 } 679 lp->ll_name = lp->ll_exp_name; 680 } 681 else 682 lp->ll_name = name; 683 684 /* Without [idx] or .key we are done. */ 685 if ((*p != '[' && *p != '.') || lp->ll_name == NULL) 686 return p; 687 688 cc = *p; 689 *p = NUL; 690 /* Only pass &ht when we would write to the variable, it prevents autoload 691 * as well. */ 692 v = find_var(lp->ll_name, (flags & GLV_READ_ONLY) ? NULL : &ht, 693 flags & GLV_NO_AUTOLOAD); 694 if (v == NULL && !quiet) 695 semsg(_(e_undefvar), lp->ll_name); 696 *p = cc; 697 if (v == NULL) 698 return NULL; 699 700 /* 701 * Loop until no more [idx] or .key is following. 702 */ 703 lp->ll_tv = &v->di_tv; 704 var1.v_type = VAR_UNKNOWN; 705 var2.v_type = VAR_UNKNOWN; 706 while (*p == '[' || (*p == '.' && lp->ll_tv->v_type == VAR_DICT)) 707 { 708 if (!(lp->ll_tv->v_type == VAR_LIST && lp->ll_tv->vval.v_list != NULL) 709 && !(lp->ll_tv->v_type == VAR_DICT 710 && lp->ll_tv->vval.v_dict != NULL) 711 && !(lp->ll_tv->v_type == VAR_BLOB 712 && lp->ll_tv->vval.v_blob != NULL)) 713 { 714 if (!quiet) 715 emsg(_("E689: Can only index a List, Dictionary or Blob")); 716 return NULL; 717 } 718 if (lp->ll_range) 719 { 720 if (!quiet) 721 emsg(_("E708: [:] must come last")); 722 return NULL; 723 } 724 725 len = -1; 726 if (*p == '.') 727 { 728 key = p + 1; 729 for (len = 0; ASCII_ISALNUM(key[len]) || key[len] == '_'; ++len) 730 ; 731 if (len == 0) 732 { 733 if (!quiet) 734 emsg(_(e_emptykey)); 735 return NULL; 736 } 737 p = key + len; 738 } 739 else 740 { 741 /* Get the index [expr] or the first index [expr: ]. */ 742 p = skipwhite(p + 1); 743 if (*p == ':') 744 empty1 = TRUE; 745 else 746 { 747 empty1 = FALSE; 748 if (eval1(&p, &var1, TRUE) == FAIL) /* recursive! */ 749 return NULL; 750 if (tv_get_string_chk(&var1) == NULL) 751 { 752 /* not a number or string */ 753 clear_tv(&var1); 754 return NULL; 755 } 756 } 757 758 /* Optionally get the second index [ :expr]. */ 759 if (*p == ':') 760 { 761 if (lp->ll_tv->v_type == VAR_DICT) 762 { 763 if (!quiet) 764 emsg(_(e_dictrange)); 765 clear_tv(&var1); 766 return NULL; 767 } 768 if (rettv != NULL 769 && !(rettv->v_type == VAR_LIST 770 && rettv->vval.v_list != NULL) 771 && !(rettv->v_type == VAR_BLOB 772 && rettv->vval.v_blob != NULL)) 773 { 774 if (!quiet) 775 emsg(_("E709: [:] requires a List or Blob value")); 776 clear_tv(&var1); 777 return NULL; 778 } 779 p = skipwhite(p + 1); 780 if (*p == ']') 781 lp->ll_empty2 = TRUE; 782 else 783 { 784 lp->ll_empty2 = FALSE; 785 if (eval1(&p, &var2, TRUE) == FAIL) /* recursive! */ 786 { 787 clear_tv(&var1); 788 return NULL; 789 } 790 if (tv_get_string_chk(&var2) == NULL) 791 { 792 /* not a number or string */ 793 clear_tv(&var1); 794 clear_tv(&var2); 795 return NULL; 796 } 797 } 798 lp->ll_range = TRUE; 799 } 800 else 801 lp->ll_range = FALSE; 802 803 if (*p != ']') 804 { 805 if (!quiet) 806 emsg(_(e_missbrac)); 807 clear_tv(&var1); 808 clear_tv(&var2); 809 return NULL; 810 } 811 812 /* Skip to past ']'. */ 813 ++p; 814 } 815 816 if (lp->ll_tv->v_type == VAR_DICT) 817 { 818 if (len == -1) 819 { 820 /* "[key]": get key from "var1" */ 821 key = tv_get_string_chk(&var1); /* is number or string */ 822 if (key == NULL) 823 { 824 clear_tv(&var1); 825 return NULL; 826 } 827 } 828 lp->ll_list = NULL; 829 lp->ll_dict = lp->ll_tv->vval.v_dict; 830 lp->ll_di = dict_find(lp->ll_dict, key, len); 831 832 /* When assigning to a scope dictionary check that a function and 833 * variable name is valid (only variable name unless it is l: or 834 * g: dictionary). Disallow overwriting a builtin function. */ 835 if (rettv != NULL && lp->ll_dict->dv_scope != 0) 836 { 837 int prevval; 838 int wrong; 839 840 if (len != -1) 841 { 842 prevval = key[len]; 843 key[len] = NUL; 844 } 845 else 846 prevval = 0; /* avoid compiler warning */ 847 wrong = (lp->ll_dict->dv_scope == VAR_DEF_SCOPE 848 && rettv->v_type == VAR_FUNC 849 && var_check_func_name(key, lp->ll_di == NULL)) 850 || !valid_varname(key); 851 if (len != -1) 852 key[len] = prevval; 853 if (wrong) 854 return NULL; 855 } 856 857 if (lp->ll_di == NULL) 858 { 859 // Can't add "v:" or "a:" variable. 860 if (lp->ll_dict == get_vimvar_dict() 861 || &lp->ll_dict->dv_hashtab == get_funccal_args_ht()) 862 { 863 semsg(_(e_illvar), name); 864 clear_tv(&var1); 865 return NULL; 866 } 867 868 // Key does not exist in dict: may need to add it. 869 if (*p == '[' || *p == '.' || unlet) 870 { 871 if (!quiet) 872 semsg(_(e_dictkey), key); 873 clear_tv(&var1); 874 return NULL; 875 } 876 if (len == -1) 877 lp->ll_newkey = vim_strsave(key); 878 else 879 lp->ll_newkey = vim_strnsave(key, len); 880 clear_tv(&var1); 881 if (lp->ll_newkey == NULL) 882 p = NULL; 883 break; 884 } 885 /* existing variable, need to check if it can be changed */ 886 else if ((flags & GLV_READ_ONLY) == 0 887 && var_check_ro(lp->ll_di->di_flags, name, FALSE)) 888 { 889 clear_tv(&var1); 890 return NULL; 891 } 892 893 clear_tv(&var1); 894 lp->ll_tv = &lp->ll_di->di_tv; 895 } 896 else if (lp->ll_tv->v_type == VAR_BLOB) 897 { 898 long bloblen = blob_len(lp->ll_tv->vval.v_blob); 899 900 /* 901 * Get the number and item for the only or first index of the List. 902 */ 903 if (empty1) 904 lp->ll_n1 = 0; 905 else 906 // is number or string 907 lp->ll_n1 = (long)tv_get_number(&var1); 908 clear_tv(&var1); 909 910 if (lp->ll_n1 < 0 911 || lp->ll_n1 > bloblen 912 || (lp->ll_range && lp->ll_n1 == bloblen)) 913 { 914 if (!quiet) 915 semsg(_(e_blobidx), lp->ll_n1); 916 clear_tv(&var2); 917 return NULL; 918 } 919 if (lp->ll_range && !lp->ll_empty2) 920 { 921 lp->ll_n2 = (long)tv_get_number(&var2); 922 clear_tv(&var2); 923 if (lp->ll_n2 < 0 924 || lp->ll_n2 >= bloblen 925 || lp->ll_n2 < lp->ll_n1) 926 { 927 if (!quiet) 928 semsg(_(e_blobidx), lp->ll_n2); 929 return NULL; 930 } 931 } 932 lp->ll_blob = lp->ll_tv->vval.v_blob; 933 lp->ll_tv = NULL; 934 break; 935 } 936 else 937 { 938 /* 939 * Get the number and item for the only or first index of the List. 940 */ 941 if (empty1) 942 lp->ll_n1 = 0; 943 else 944 /* is number or string */ 945 lp->ll_n1 = (long)tv_get_number(&var1); 946 clear_tv(&var1); 947 948 lp->ll_dict = NULL; 949 lp->ll_list = lp->ll_tv->vval.v_list; 950 lp->ll_li = list_find(lp->ll_list, lp->ll_n1); 951 if (lp->ll_li == NULL) 952 { 953 if (lp->ll_n1 < 0) 954 { 955 lp->ll_n1 = 0; 956 lp->ll_li = list_find(lp->ll_list, lp->ll_n1); 957 } 958 } 959 if (lp->ll_li == NULL) 960 { 961 clear_tv(&var2); 962 if (!quiet) 963 semsg(_(e_listidx), lp->ll_n1); 964 return NULL; 965 } 966 967 /* 968 * May need to find the item or absolute index for the second 969 * index of a range. 970 * When no index given: "lp->ll_empty2" is TRUE. 971 * Otherwise "lp->ll_n2" is set to the second index. 972 */ 973 if (lp->ll_range && !lp->ll_empty2) 974 { 975 lp->ll_n2 = (long)tv_get_number(&var2); 976 /* is number or string */ 977 clear_tv(&var2); 978 if (lp->ll_n2 < 0) 979 { 980 ni = list_find(lp->ll_list, lp->ll_n2); 981 if (ni == NULL) 982 { 983 if (!quiet) 984 semsg(_(e_listidx), lp->ll_n2); 985 return NULL; 986 } 987 lp->ll_n2 = list_idx_of_item(lp->ll_list, ni); 988 } 989 990 /* Check that lp->ll_n2 isn't before lp->ll_n1. */ 991 if (lp->ll_n1 < 0) 992 lp->ll_n1 = list_idx_of_item(lp->ll_list, lp->ll_li); 993 if (lp->ll_n2 < lp->ll_n1) 994 { 995 if (!quiet) 996 semsg(_(e_listidx), lp->ll_n2); 997 return NULL; 998 } 999 } 1000 1001 lp->ll_tv = &lp->ll_li->li_tv; 1002 } 1003 } 1004 1005 clear_tv(&var1); 1006 return p; 1007 } 1008 1009 /* 1010 * Clear lval "lp" that was filled by get_lval(). 1011 */ 1012 void 1013 clear_lval(lval_T *lp) 1014 { 1015 vim_free(lp->ll_exp_name); 1016 vim_free(lp->ll_newkey); 1017 } 1018 1019 /* 1020 * Set a variable that was parsed by get_lval() to "rettv". 1021 * "endp" points to just after the parsed name. 1022 * "op" is NULL, "+" for "+=", "-" for "-=", "*" for "*=", "/" for "/=", 1023 * "%" for "%=", "." for ".=" or "=" for "=". 1024 */ 1025 void 1026 set_var_lval( 1027 lval_T *lp, 1028 char_u *endp, 1029 typval_T *rettv, 1030 int copy, 1031 int is_const, // Disallow to modify existing variable for :const 1032 char_u *op) 1033 { 1034 int cc; 1035 listitem_T *ri; 1036 dictitem_T *di; 1037 1038 if (lp->ll_tv == NULL) 1039 { 1040 cc = *endp; 1041 *endp = NUL; 1042 if (lp->ll_blob != NULL) 1043 { 1044 int error = FALSE, val; 1045 1046 if (op != NULL && *op != '=') 1047 { 1048 semsg(_(e_letwrong), op); 1049 return; 1050 } 1051 1052 if (lp->ll_range && rettv->v_type == VAR_BLOB) 1053 { 1054 int il, ir; 1055 1056 if (lp->ll_empty2) 1057 lp->ll_n2 = blob_len(lp->ll_blob) - 1; 1058 1059 if (lp->ll_n2 - lp->ll_n1 + 1 != blob_len(rettv->vval.v_blob)) 1060 { 1061 emsg(_("E972: Blob value does not have the right number of bytes")); 1062 return; 1063 } 1064 if (lp->ll_empty2) 1065 lp->ll_n2 = blob_len(lp->ll_blob); 1066 1067 ir = 0; 1068 for (il = lp->ll_n1; il <= lp->ll_n2; il++) 1069 blob_set(lp->ll_blob, il, 1070 blob_get(rettv->vval.v_blob, ir++)); 1071 } 1072 else 1073 { 1074 val = (int)tv_get_number_chk(rettv, &error); 1075 if (!error) 1076 { 1077 garray_T *gap = &lp->ll_blob->bv_ga; 1078 1079 // Allow for appending a byte. Setting a byte beyond 1080 // the end is an error otherwise. 1081 if (lp->ll_n1 < gap->ga_len 1082 || (lp->ll_n1 == gap->ga_len 1083 && ga_grow(&lp->ll_blob->bv_ga, 1) == OK)) 1084 { 1085 blob_set(lp->ll_blob, lp->ll_n1, val); 1086 if (lp->ll_n1 == gap->ga_len) 1087 ++gap->ga_len; 1088 } 1089 // error for invalid range was already given in get_lval() 1090 } 1091 } 1092 } 1093 else if (op != NULL && *op != '=') 1094 { 1095 typval_T tv; 1096 1097 if (is_const) 1098 { 1099 emsg(_(e_cannot_mod)); 1100 *endp = cc; 1101 return; 1102 } 1103 1104 // handle +=, -=, *=, /=, %= and .= 1105 di = NULL; 1106 if (get_var_tv(lp->ll_name, (int)STRLEN(lp->ll_name), 1107 &tv, &di, TRUE, FALSE) == OK) 1108 { 1109 if ((di == NULL 1110 || (!var_check_ro(di->di_flags, lp->ll_name, FALSE) 1111 && !tv_check_lock(&di->di_tv, lp->ll_name, FALSE))) 1112 && tv_op(&tv, rettv, op) == OK) 1113 set_var(lp->ll_name, &tv, FALSE); 1114 clear_tv(&tv); 1115 } 1116 } 1117 else 1118 set_var_const(lp->ll_name, rettv, copy, is_const); 1119 *endp = cc; 1120 } 1121 else if (var_check_lock(lp->ll_newkey == NULL 1122 ? lp->ll_tv->v_lock 1123 : lp->ll_tv->vval.v_dict->dv_lock, lp->ll_name, FALSE)) 1124 ; 1125 else if (lp->ll_range) 1126 { 1127 listitem_T *ll_li = lp->ll_li; 1128 int ll_n1 = lp->ll_n1; 1129 1130 if (is_const) 1131 { 1132 emsg(_("E996: Cannot lock a range")); 1133 return; 1134 } 1135 1136 /* 1137 * Check whether any of the list items is locked 1138 */ 1139 for (ri = rettv->vval.v_list->lv_first; ri != NULL && ll_li != NULL; ) 1140 { 1141 if (var_check_lock(ll_li->li_tv.v_lock, lp->ll_name, FALSE)) 1142 return; 1143 ri = ri->li_next; 1144 if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == ll_n1)) 1145 break; 1146 ll_li = ll_li->li_next; 1147 ++ll_n1; 1148 } 1149 1150 /* 1151 * Assign the List values to the list items. 1152 */ 1153 for (ri = rettv->vval.v_list->lv_first; ri != NULL; ) 1154 { 1155 if (op != NULL && *op != '=') 1156 tv_op(&lp->ll_li->li_tv, &ri->li_tv, op); 1157 else 1158 { 1159 clear_tv(&lp->ll_li->li_tv); 1160 copy_tv(&ri->li_tv, &lp->ll_li->li_tv); 1161 } 1162 ri = ri->li_next; 1163 if (ri == NULL || (!lp->ll_empty2 && lp->ll_n2 == lp->ll_n1)) 1164 break; 1165 if (lp->ll_li->li_next == NULL) 1166 { 1167 /* Need to add an empty item. */ 1168 if (list_append_number(lp->ll_list, 0) == FAIL) 1169 { 1170 ri = NULL; 1171 break; 1172 } 1173 } 1174 lp->ll_li = lp->ll_li->li_next; 1175 ++lp->ll_n1; 1176 } 1177 if (ri != NULL) 1178 emsg(_("E710: List value has more items than target")); 1179 else if (lp->ll_empty2 1180 ? (lp->ll_li != NULL && lp->ll_li->li_next != NULL) 1181 : lp->ll_n1 != lp->ll_n2) 1182 emsg(_("E711: List value has not enough items")); 1183 } 1184 else 1185 { 1186 /* 1187 * Assign to a List or Dictionary item. 1188 */ 1189 if (is_const) 1190 { 1191 emsg(_("E996: Cannot lock a list or dict")); 1192 return; 1193 } 1194 if (lp->ll_newkey != NULL) 1195 { 1196 if (op != NULL && *op != '=') 1197 { 1198 semsg(_(e_letwrong), op); 1199 return; 1200 } 1201 1202 /* Need to add an item to the Dictionary. */ 1203 di = dictitem_alloc(lp->ll_newkey); 1204 if (di == NULL) 1205 return; 1206 if (dict_add(lp->ll_tv->vval.v_dict, di) == FAIL) 1207 { 1208 vim_free(di); 1209 return; 1210 } 1211 lp->ll_tv = &di->di_tv; 1212 } 1213 else if (op != NULL && *op != '=') 1214 { 1215 tv_op(lp->ll_tv, rettv, op); 1216 return; 1217 } 1218 else 1219 clear_tv(lp->ll_tv); 1220 1221 /* 1222 * Assign the value to the variable or list item. 1223 */ 1224 if (copy) 1225 copy_tv(rettv, lp->ll_tv); 1226 else 1227 { 1228 *lp->ll_tv = *rettv; 1229 lp->ll_tv->v_lock = 0; 1230 init_tv(rettv); 1231 } 1232 } 1233 } 1234 1235 /* 1236 * Handle "tv1 += tv2", "tv1 -= tv2", "tv1 *= tv2", "tv1 /= tv2", "tv1 %= tv2" 1237 * and "tv1 .= tv2" 1238 * Returns OK or FAIL. 1239 */ 1240 static int 1241 tv_op(typval_T *tv1, typval_T *tv2, char_u *op) 1242 { 1243 varnumber_T n; 1244 char_u numbuf[NUMBUFLEN]; 1245 char_u *s; 1246 1247 /* Can't do anything with a Funcref, Dict, v:true on the right. */ 1248 if (tv2->v_type != VAR_FUNC && tv2->v_type != VAR_DICT 1249 && tv2->v_type != VAR_SPECIAL) 1250 { 1251 switch (tv1->v_type) 1252 { 1253 case VAR_UNKNOWN: 1254 case VAR_DICT: 1255 case VAR_FUNC: 1256 case VAR_PARTIAL: 1257 case VAR_SPECIAL: 1258 case VAR_JOB: 1259 case VAR_CHANNEL: 1260 break; 1261 1262 case VAR_BLOB: 1263 if (*op != '+' || tv2->v_type != VAR_BLOB) 1264 break; 1265 // BLOB += BLOB 1266 if (tv1->vval.v_blob != NULL && tv2->vval.v_blob != NULL) 1267 { 1268 blob_T *b1 = tv1->vval.v_blob; 1269 blob_T *b2 = tv2->vval.v_blob; 1270 int i, len = blob_len(b2); 1271 for (i = 0; i < len; i++) 1272 ga_append(&b1->bv_ga, blob_get(b2, i)); 1273 } 1274 return OK; 1275 1276 case VAR_LIST: 1277 if (*op != '+' || tv2->v_type != VAR_LIST) 1278 break; 1279 // List += List 1280 if (tv1->vval.v_list != NULL && tv2->vval.v_list != NULL) 1281 list_extend(tv1->vval.v_list, tv2->vval.v_list, NULL); 1282 return OK; 1283 1284 case VAR_NUMBER: 1285 case VAR_STRING: 1286 if (tv2->v_type == VAR_LIST) 1287 break; 1288 if (vim_strchr((char_u *)"+-*/%", *op) != NULL) 1289 { 1290 // nr += nr , nr -= nr , nr *=nr , nr /= nr , nr %= nr 1291 n = tv_get_number(tv1); 1292 #ifdef FEAT_FLOAT 1293 if (tv2->v_type == VAR_FLOAT) 1294 { 1295 float_T f = n; 1296 1297 if (*op == '%') 1298 break; 1299 switch (*op) 1300 { 1301 case '+': f += tv2->vval.v_float; break; 1302 case '-': f -= tv2->vval.v_float; break; 1303 case '*': f *= tv2->vval.v_float; break; 1304 case '/': f /= tv2->vval.v_float; break; 1305 } 1306 clear_tv(tv1); 1307 tv1->v_type = VAR_FLOAT; 1308 tv1->vval.v_float = f; 1309 } 1310 else 1311 #endif 1312 { 1313 switch (*op) 1314 { 1315 case '+': n += tv_get_number(tv2); break; 1316 case '-': n -= tv_get_number(tv2); break; 1317 case '*': n *= tv_get_number(tv2); break; 1318 case '/': n = num_divide(n, tv_get_number(tv2)); break; 1319 case '%': n = num_modulus(n, tv_get_number(tv2)); break; 1320 } 1321 clear_tv(tv1); 1322 tv1->v_type = VAR_NUMBER; 1323 tv1->vval.v_number = n; 1324 } 1325 } 1326 else 1327 { 1328 if (tv2->v_type == VAR_FLOAT) 1329 break; 1330 1331 // str .= str 1332 s = tv_get_string(tv1); 1333 s = concat_str(s, tv_get_string_buf(tv2, numbuf)); 1334 clear_tv(tv1); 1335 tv1->v_type = VAR_STRING; 1336 tv1->vval.v_string = s; 1337 } 1338 return OK; 1339 1340 case VAR_FLOAT: 1341 #ifdef FEAT_FLOAT 1342 { 1343 float_T f; 1344 1345 if (*op == '%' || *op == '.' 1346 || (tv2->v_type != VAR_FLOAT 1347 && tv2->v_type != VAR_NUMBER 1348 && tv2->v_type != VAR_STRING)) 1349 break; 1350 if (tv2->v_type == VAR_FLOAT) 1351 f = tv2->vval.v_float; 1352 else 1353 f = tv_get_number(tv2); 1354 switch (*op) 1355 { 1356 case '+': tv1->vval.v_float += f; break; 1357 case '-': tv1->vval.v_float -= f; break; 1358 case '*': tv1->vval.v_float *= f; break; 1359 case '/': tv1->vval.v_float /= f; break; 1360 } 1361 } 1362 #endif 1363 return OK; 1364 } 1365 } 1366 1367 semsg(_(e_letwrong), op); 1368 return FAIL; 1369 } 1370 1371 /* 1372 * Evaluate the expression used in a ":for var in expr" command. 1373 * "arg" points to "var". 1374 * Set "*errp" to TRUE for an error, FALSE otherwise; 1375 * Return a pointer that holds the info. Null when there is an error. 1376 */ 1377 void * 1378 eval_for_line( 1379 char_u *arg, 1380 int *errp, 1381 char_u **nextcmdp, 1382 int skip) 1383 { 1384 forinfo_T *fi; 1385 char_u *expr; 1386 typval_T tv; 1387 list_T *l; 1388 1389 *errp = TRUE; /* default: there is an error */ 1390 1391 fi = ALLOC_CLEAR_ONE(forinfo_T); 1392 if (fi == NULL) 1393 return NULL; 1394 1395 expr = skip_var_list(arg, &fi->fi_varcount, &fi->fi_semicolon); 1396 if (expr == NULL) 1397 return fi; 1398 1399 expr = skipwhite(expr); 1400 if (expr[0] != 'i' || expr[1] != 'n' || !VIM_ISWHITE(expr[2])) 1401 { 1402 emsg(_("E690: Missing \"in\" after :for")); 1403 return fi; 1404 } 1405 1406 if (skip) 1407 ++emsg_skip; 1408 if (eval0(skipwhite(expr + 2), &tv, nextcmdp, !skip) == OK) 1409 { 1410 *errp = FALSE; 1411 if (!skip) 1412 { 1413 if (tv.v_type == VAR_LIST) 1414 { 1415 l = tv.vval.v_list; 1416 if (l == NULL) 1417 { 1418 // a null list is like an empty list: do nothing 1419 clear_tv(&tv); 1420 } 1421 else 1422 { 1423 // No need to increment the refcount, it's already set for 1424 // the list being used in "tv". 1425 fi->fi_list = l; 1426 list_add_watch(l, &fi->fi_lw); 1427 fi->fi_lw.lw_item = l->lv_first; 1428 } 1429 } 1430 else if (tv.v_type == VAR_BLOB) 1431 { 1432 fi->fi_bi = 0; 1433 if (tv.vval.v_blob != NULL) 1434 { 1435 typval_T btv; 1436 1437 // Make a copy, so that the iteration still works when the 1438 // blob is changed. 1439 blob_copy(&tv, &btv); 1440 fi->fi_blob = btv.vval.v_blob; 1441 } 1442 clear_tv(&tv); 1443 } 1444 else 1445 { 1446 emsg(_(e_listreq)); 1447 clear_tv(&tv); 1448 } 1449 } 1450 } 1451 if (skip) 1452 --emsg_skip; 1453 1454 return fi; 1455 } 1456 1457 /* 1458 * Use the first item in a ":for" list. Advance to the next. 1459 * Assign the values to the variable (list). "arg" points to the first one. 1460 * Return TRUE when a valid item was found, FALSE when at end of list or 1461 * something wrong. 1462 */ 1463 int 1464 next_for_item(void *fi_void, char_u *arg) 1465 { 1466 forinfo_T *fi = (forinfo_T *)fi_void; 1467 int result; 1468 listitem_T *item; 1469 1470 if (fi->fi_blob != NULL) 1471 { 1472 typval_T tv; 1473 1474 if (fi->fi_bi >= blob_len(fi->fi_blob)) 1475 return FALSE; 1476 tv.v_type = VAR_NUMBER; 1477 tv.v_lock = VAR_FIXED; 1478 tv.vval.v_number = blob_get(fi->fi_blob, fi->fi_bi); 1479 ++fi->fi_bi; 1480 return ex_let_vars(arg, &tv, TRUE, fi->fi_semicolon, 1481 fi->fi_varcount, FALSE, NULL) == OK; 1482 } 1483 1484 item = fi->fi_lw.lw_item; 1485 if (item == NULL) 1486 result = FALSE; 1487 else 1488 { 1489 fi->fi_lw.lw_item = item->li_next; 1490 result = (ex_let_vars(arg, &item->li_tv, TRUE, fi->fi_semicolon, 1491 fi->fi_varcount, FALSE, NULL) == OK); 1492 } 1493 return result; 1494 } 1495 1496 /* 1497 * Free the structure used to store info used by ":for". 1498 */ 1499 void 1500 free_for_info(void *fi_void) 1501 { 1502 forinfo_T *fi = (forinfo_T *)fi_void; 1503 1504 if (fi != NULL && fi->fi_list != NULL) 1505 { 1506 list_rem_watch(fi->fi_list, &fi->fi_lw); 1507 list_unref(fi->fi_list); 1508 } 1509 if (fi != NULL && fi->fi_blob != NULL) 1510 blob_unref(fi->fi_blob); 1511 vim_free(fi); 1512 } 1513 1514 void 1515 set_context_for_expression( 1516 expand_T *xp, 1517 char_u *arg, 1518 cmdidx_T cmdidx) 1519 { 1520 int got_eq = FALSE; 1521 int c; 1522 char_u *p; 1523 1524 if (cmdidx == CMD_let) 1525 { 1526 xp->xp_context = EXPAND_USER_VARS; 1527 if (vim_strpbrk(arg, (char_u *)"\"'+-*/%.=!?~|&$([<>,#") == NULL) 1528 { 1529 /* ":let var1 var2 ...": find last space. */ 1530 for (p = arg + STRLEN(arg); p >= arg; ) 1531 { 1532 xp->xp_pattern = p; 1533 MB_PTR_BACK(arg, p); 1534 if (VIM_ISWHITE(*p)) 1535 break; 1536 } 1537 return; 1538 } 1539 } 1540 else 1541 xp->xp_context = cmdidx == CMD_call ? EXPAND_FUNCTIONS 1542 : EXPAND_EXPRESSION; 1543 while ((xp->xp_pattern = vim_strpbrk(arg, 1544 (char_u *)"\"'+-*/%.=!?~|&$([<>,#")) != NULL) 1545 { 1546 c = *xp->xp_pattern; 1547 if (c == '&') 1548 { 1549 c = xp->xp_pattern[1]; 1550 if (c == '&') 1551 { 1552 ++xp->xp_pattern; 1553 xp->xp_context = cmdidx != CMD_let || got_eq 1554 ? EXPAND_EXPRESSION : EXPAND_NOTHING; 1555 } 1556 else if (c != ' ') 1557 { 1558 xp->xp_context = EXPAND_SETTINGS; 1559 if ((c == 'l' || c == 'g') && xp->xp_pattern[2] == ':') 1560 xp->xp_pattern += 2; 1561 1562 } 1563 } 1564 else if (c == '$') 1565 { 1566 /* environment variable */ 1567 xp->xp_context = EXPAND_ENV_VARS; 1568 } 1569 else if (c == '=') 1570 { 1571 got_eq = TRUE; 1572 xp->xp_context = EXPAND_EXPRESSION; 1573 } 1574 else if (c == '#' 1575 && xp->xp_context == EXPAND_EXPRESSION) 1576 { 1577 /* Autoload function/variable contains '#'. */ 1578 break; 1579 } 1580 else if ((c == '<' || c == '#') 1581 && xp->xp_context == EXPAND_FUNCTIONS 1582 && vim_strchr(xp->xp_pattern, '(') == NULL) 1583 { 1584 /* Function name can start with "<SNR>" and contain '#'. */ 1585 break; 1586 } 1587 else if (cmdidx != CMD_let || got_eq) 1588 { 1589 if (c == '"') /* string */ 1590 { 1591 while ((c = *++xp->xp_pattern) != NUL && c != '"') 1592 if (c == '\\' && xp->xp_pattern[1] != NUL) 1593 ++xp->xp_pattern; 1594 xp->xp_context = EXPAND_NOTHING; 1595 } 1596 else if (c == '\'') /* literal string */ 1597 { 1598 /* Trick: '' is like stopping and starting a literal string. */ 1599 while ((c = *++xp->xp_pattern) != NUL && c != '\'') 1600 /* skip */ ; 1601 xp->xp_context = EXPAND_NOTHING; 1602 } 1603 else if (c == '|') 1604 { 1605 if (xp->xp_pattern[1] == '|') 1606 { 1607 ++xp->xp_pattern; 1608 xp->xp_context = EXPAND_EXPRESSION; 1609 } 1610 else 1611 xp->xp_context = EXPAND_COMMANDS; 1612 } 1613 else 1614 xp->xp_context = EXPAND_EXPRESSION; 1615 } 1616 else 1617 /* Doesn't look like something valid, expand as an expression 1618 * anyway. */ 1619 xp->xp_context = EXPAND_EXPRESSION; 1620 arg = xp->xp_pattern; 1621 if (*arg != NUL) 1622 while ((c = *++arg) != NUL && (c == ' ' || c == '\t')) 1623 /* skip */ ; 1624 } 1625 xp->xp_pattern = arg; 1626 } 1627 1628 /* 1629 * Return TRUE if "pat" matches "text". 1630 * Does not use 'cpo' and always uses 'magic'. 1631 */ 1632 int 1633 pattern_match(char_u *pat, char_u *text, int ic) 1634 { 1635 int matches = FALSE; 1636 char_u *save_cpo; 1637 regmatch_T regmatch; 1638 1639 /* avoid 'l' flag in 'cpoptions' */ 1640 save_cpo = p_cpo; 1641 p_cpo = (char_u *)""; 1642 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); 1643 if (regmatch.regprog != NULL) 1644 { 1645 regmatch.rm_ic = ic; 1646 matches = vim_regexec_nl(®match, text, (colnr_T)0); 1647 vim_regfree(regmatch.regprog); 1648 } 1649 p_cpo = save_cpo; 1650 return matches; 1651 } 1652 1653 /* 1654 * Handle a name followed by "(". Both for just "name(arg)" and for 1655 * "expr->name(arg)". 1656 * Returns OK or FAIL. 1657 */ 1658 static int 1659 eval_func( 1660 char_u **arg, // points to "(", will be advanced 1661 char_u *name, 1662 int name_len, 1663 typval_T *rettv, 1664 int evaluate, 1665 typval_T *basetv) // "expr" for "expr->name(arg)" 1666 { 1667 char_u *s = name; 1668 int len = name_len; 1669 partial_T *partial; 1670 int ret = OK; 1671 1672 if (!evaluate) 1673 check_vars(s, len); 1674 1675 /* If "s" is the name of a variable of type VAR_FUNC 1676 * use its contents. */ 1677 s = deref_func_name(s, &len, &partial, !evaluate); 1678 1679 /* Need to make a copy, in case evaluating the arguments makes 1680 * the name invalid. */ 1681 s = vim_strsave(s); 1682 if (s == NULL) 1683 ret = FAIL; 1684 else 1685 { 1686 funcexe_T funcexe; 1687 1688 // Invoke the function. 1689 vim_memset(&funcexe, 0, sizeof(funcexe)); 1690 funcexe.firstline = curwin->w_cursor.lnum; 1691 funcexe.lastline = curwin->w_cursor.lnum; 1692 funcexe.evaluate = evaluate; 1693 funcexe.partial = partial; 1694 funcexe.basetv = basetv; 1695 ret = get_func_tv(s, len, rettv, arg, &funcexe); 1696 } 1697 vim_free(s); 1698 1699 /* If evaluate is FALSE rettv->v_type was not set in 1700 * get_func_tv, but it's needed in handle_subscript() to parse 1701 * what follows. So set it here. */ 1702 if (rettv->v_type == VAR_UNKNOWN && !evaluate && **arg == '(') 1703 { 1704 rettv->vval.v_string = NULL; 1705 rettv->v_type = VAR_FUNC; 1706 } 1707 1708 /* Stop the expression evaluation when immediately 1709 * aborting on error, or when an interrupt occurred or 1710 * an exception was thrown but not caught. */ 1711 if (evaluate && aborting()) 1712 { 1713 if (ret == OK) 1714 clear_tv(rettv); 1715 ret = FAIL; 1716 } 1717 return ret; 1718 } 1719 1720 /* 1721 * The "evaluate" argument: When FALSE, the argument is only parsed but not 1722 * executed. The function may return OK, but the rettv will be of type 1723 * VAR_UNKNOWN. The function still returns FAIL for a syntax error. 1724 */ 1725 1726 /* 1727 * Handle zero level expression. 1728 * This calls eval1() and handles error message and nextcmd. 1729 * Put the result in "rettv" when returning OK and "evaluate" is TRUE. 1730 * Note: "rettv.v_lock" is not set. 1731 * Return OK or FAIL. 1732 */ 1733 int 1734 eval0( 1735 char_u *arg, 1736 typval_T *rettv, 1737 char_u **nextcmd, 1738 int evaluate) 1739 { 1740 int ret; 1741 char_u *p; 1742 int did_emsg_before = did_emsg; 1743 int called_emsg_before = called_emsg; 1744 1745 p = skipwhite(arg); 1746 ret = eval1(&p, rettv, evaluate); 1747 if (ret == FAIL || !ends_excmd(*p)) 1748 { 1749 if (ret != FAIL) 1750 clear_tv(rettv); 1751 /* 1752 * Report the invalid expression unless the expression evaluation has 1753 * been cancelled due to an aborting error, an interrupt, or an 1754 * exception, or we already gave a more specific error. 1755 * Also check called_emsg for when using assert_fails(). 1756 */ 1757 if (!aborting() && did_emsg == did_emsg_before 1758 && called_emsg == called_emsg_before) 1759 semsg(_(e_invexpr2), arg); 1760 ret = FAIL; 1761 } 1762 if (nextcmd != NULL) 1763 *nextcmd = check_nextcmd(p); 1764 1765 return ret; 1766 } 1767 1768 /* 1769 * Handle top level expression: 1770 * expr2 ? expr1 : expr1 1771 * 1772 * "arg" must point to the first non-white of the expression. 1773 * "arg" is advanced to the next non-white after the recognized expression. 1774 * 1775 * Note: "rettv.v_lock" is not set. 1776 * 1777 * Return OK or FAIL. 1778 */ 1779 int 1780 eval1(char_u **arg, typval_T *rettv, int evaluate) 1781 { 1782 int result; 1783 typval_T var2; 1784 1785 /* 1786 * Get the first variable. 1787 */ 1788 if (eval2(arg, rettv, evaluate) == FAIL) 1789 return FAIL; 1790 1791 if ((*arg)[0] == '?') 1792 { 1793 result = FALSE; 1794 if (evaluate) 1795 { 1796 int error = FALSE; 1797 1798 if (tv_get_number_chk(rettv, &error) != 0) 1799 result = TRUE; 1800 clear_tv(rettv); 1801 if (error) 1802 return FAIL; 1803 } 1804 1805 /* 1806 * Get the second variable. 1807 */ 1808 *arg = skipwhite(*arg + 1); 1809 if (eval1(arg, rettv, evaluate && result) == FAIL) /* recursive! */ 1810 return FAIL; 1811 1812 /* 1813 * Check for the ":". 1814 */ 1815 if ((*arg)[0] != ':') 1816 { 1817 emsg(_("E109: Missing ':' after '?'")); 1818 if (evaluate && result) 1819 clear_tv(rettv); 1820 return FAIL; 1821 } 1822 1823 /* 1824 * Get the third variable. 1825 */ 1826 *arg = skipwhite(*arg + 1); 1827 if (eval1(arg, &var2, evaluate && !result) == FAIL) /* recursive! */ 1828 { 1829 if (evaluate && result) 1830 clear_tv(rettv); 1831 return FAIL; 1832 } 1833 if (evaluate && !result) 1834 *rettv = var2; 1835 } 1836 1837 return OK; 1838 } 1839 1840 /* 1841 * Handle first level expression: 1842 * expr2 || expr2 || expr2 logical OR 1843 * 1844 * "arg" must point to the first non-white of the expression. 1845 * "arg" is advanced to the next non-white after the recognized expression. 1846 * 1847 * Return OK or FAIL. 1848 */ 1849 static int 1850 eval2(char_u **arg, typval_T *rettv, int evaluate) 1851 { 1852 typval_T var2; 1853 long result; 1854 int first; 1855 int error = FALSE; 1856 1857 /* 1858 * Get the first variable. 1859 */ 1860 if (eval3(arg, rettv, evaluate) == FAIL) 1861 return FAIL; 1862 1863 /* 1864 * Repeat until there is no following "||". 1865 */ 1866 first = TRUE; 1867 result = FALSE; 1868 while ((*arg)[0] == '|' && (*arg)[1] == '|') 1869 { 1870 if (evaluate && first) 1871 { 1872 if (tv_get_number_chk(rettv, &error) != 0) 1873 result = TRUE; 1874 clear_tv(rettv); 1875 if (error) 1876 return FAIL; 1877 first = FALSE; 1878 } 1879 1880 /* 1881 * Get the second variable. 1882 */ 1883 *arg = skipwhite(*arg + 2); 1884 if (eval3(arg, &var2, evaluate && !result) == FAIL) 1885 return FAIL; 1886 1887 /* 1888 * Compute the result. 1889 */ 1890 if (evaluate && !result) 1891 { 1892 if (tv_get_number_chk(&var2, &error) != 0) 1893 result = TRUE; 1894 clear_tv(&var2); 1895 if (error) 1896 return FAIL; 1897 } 1898 if (evaluate) 1899 { 1900 rettv->v_type = VAR_NUMBER; 1901 rettv->vval.v_number = result; 1902 } 1903 } 1904 1905 return OK; 1906 } 1907 1908 /* 1909 * Handle second level expression: 1910 * expr3 && expr3 && expr3 logical AND 1911 * 1912 * "arg" must point to the first non-white of the expression. 1913 * "arg" is advanced to the next non-white after the recognized expression. 1914 * 1915 * Return OK or FAIL. 1916 */ 1917 static int 1918 eval3(char_u **arg, typval_T *rettv, int evaluate) 1919 { 1920 typval_T var2; 1921 long result; 1922 int first; 1923 int error = FALSE; 1924 1925 /* 1926 * Get the first variable. 1927 */ 1928 if (eval4(arg, rettv, evaluate) == FAIL) 1929 return FAIL; 1930 1931 /* 1932 * Repeat until there is no following "&&". 1933 */ 1934 first = TRUE; 1935 result = TRUE; 1936 while ((*arg)[0] == '&' && (*arg)[1] == '&') 1937 { 1938 if (evaluate && first) 1939 { 1940 if (tv_get_number_chk(rettv, &error) == 0) 1941 result = FALSE; 1942 clear_tv(rettv); 1943 if (error) 1944 return FAIL; 1945 first = FALSE; 1946 } 1947 1948 /* 1949 * Get the second variable. 1950 */ 1951 *arg = skipwhite(*arg + 2); 1952 if (eval4(arg, &var2, evaluate && result) == FAIL) 1953 return FAIL; 1954 1955 /* 1956 * Compute the result. 1957 */ 1958 if (evaluate && result) 1959 { 1960 if (tv_get_number_chk(&var2, &error) == 0) 1961 result = FALSE; 1962 clear_tv(&var2); 1963 if (error) 1964 return FAIL; 1965 } 1966 if (evaluate) 1967 { 1968 rettv->v_type = VAR_NUMBER; 1969 rettv->vval.v_number = result; 1970 } 1971 } 1972 1973 return OK; 1974 } 1975 1976 /* 1977 * Handle third level expression: 1978 * var1 == var2 1979 * var1 =~ var2 1980 * var1 != var2 1981 * var1 !~ var2 1982 * var1 > var2 1983 * var1 >= var2 1984 * var1 < var2 1985 * var1 <= var2 1986 * var1 is var2 1987 * var1 isnot var2 1988 * 1989 * "arg" must point to the first non-white of the expression. 1990 * "arg" is advanced to the next non-white after the recognized expression. 1991 * 1992 * Return OK or FAIL. 1993 */ 1994 static int 1995 eval4(char_u **arg, typval_T *rettv, int evaluate) 1996 { 1997 typval_T var2; 1998 char_u *p; 1999 int i; 2000 exptype_T type = TYPE_UNKNOWN; 2001 int type_is = FALSE; /* TRUE for "is" and "isnot" */ 2002 int len = 2; 2003 int ic; 2004 2005 /* 2006 * Get the first variable. 2007 */ 2008 if (eval5(arg, rettv, evaluate) == FAIL) 2009 return FAIL; 2010 2011 p = *arg; 2012 switch (p[0]) 2013 { 2014 case '=': if (p[1] == '=') 2015 type = TYPE_EQUAL; 2016 else if (p[1] == '~') 2017 type = TYPE_MATCH; 2018 break; 2019 case '!': if (p[1] == '=') 2020 type = TYPE_NEQUAL; 2021 else if (p[1] == '~') 2022 type = TYPE_NOMATCH; 2023 break; 2024 case '>': if (p[1] != '=') 2025 { 2026 type = TYPE_GREATER; 2027 len = 1; 2028 } 2029 else 2030 type = TYPE_GEQUAL; 2031 break; 2032 case '<': if (p[1] != '=') 2033 { 2034 type = TYPE_SMALLER; 2035 len = 1; 2036 } 2037 else 2038 type = TYPE_SEQUAL; 2039 break; 2040 case 'i': if (p[1] == 's') 2041 { 2042 if (p[2] == 'n' && p[3] == 'o' && p[4] == 't') 2043 len = 5; 2044 i = p[len]; 2045 if (!isalnum(i) && i != '_') 2046 { 2047 type = len == 2 ? TYPE_EQUAL : TYPE_NEQUAL; 2048 type_is = TRUE; 2049 } 2050 } 2051 break; 2052 } 2053 2054 /* 2055 * If there is a comparative operator, use it. 2056 */ 2057 if (type != TYPE_UNKNOWN) 2058 { 2059 /* extra question mark appended: ignore case */ 2060 if (p[len] == '?') 2061 { 2062 ic = TRUE; 2063 ++len; 2064 } 2065 /* extra '#' appended: match case */ 2066 else if (p[len] == '#') 2067 { 2068 ic = FALSE; 2069 ++len; 2070 } 2071 /* nothing appended: use 'ignorecase' */ 2072 else 2073 ic = p_ic; 2074 2075 /* 2076 * Get the second variable. 2077 */ 2078 *arg = skipwhite(p + len); 2079 if (eval5(arg, &var2, evaluate) == FAIL) 2080 { 2081 clear_tv(rettv); 2082 return FAIL; 2083 } 2084 if (evaluate) 2085 { 2086 int ret = typval_compare(rettv, &var2, type, type_is, ic); 2087 2088 clear_tv(&var2); 2089 return ret; 2090 } 2091 } 2092 2093 return OK; 2094 } 2095 2096 /* 2097 * Handle fourth level expression: 2098 * + number addition 2099 * - number subtraction 2100 * . string concatenation (if script version is 1) 2101 * .. string concatenation 2102 * 2103 * "arg" must point to the first non-white of the expression. 2104 * "arg" is advanced to the next non-white after the recognized expression. 2105 * 2106 * Return OK or FAIL. 2107 */ 2108 static int 2109 eval5(char_u **arg, typval_T *rettv, int evaluate) 2110 { 2111 typval_T var2; 2112 typval_T var3; 2113 int op; 2114 varnumber_T n1, n2; 2115 #ifdef FEAT_FLOAT 2116 float_T f1 = 0, f2 = 0; 2117 #endif 2118 char_u *s1, *s2; 2119 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; 2120 char_u *p; 2121 int concat; 2122 2123 /* 2124 * Get the first variable. 2125 */ 2126 if (eval6(arg, rettv, evaluate, FALSE) == FAIL) 2127 return FAIL; 2128 2129 /* 2130 * Repeat computing, until no '+', '-' or '.' is following. 2131 */ 2132 for (;;) 2133 { 2134 // "." is only string concatenation when scriptversion is 1 2135 op = **arg; 2136 concat = op == '.' 2137 && (*(*arg + 1) == '.' || current_sctx.sc_version < 2); 2138 if (op != '+' && op != '-' && !concat) 2139 break; 2140 2141 if ((op != '+' || (rettv->v_type != VAR_LIST 2142 && rettv->v_type != VAR_BLOB)) 2143 #ifdef FEAT_FLOAT 2144 && (op == '.' || rettv->v_type != VAR_FLOAT) 2145 #endif 2146 ) 2147 { 2148 /* For "list + ...", an illegal use of the first operand as 2149 * a number cannot be determined before evaluating the 2nd 2150 * operand: if this is also a list, all is ok. 2151 * For "something . ...", "something - ..." or "non-list + ...", 2152 * we know that the first operand needs to be a string or number 2153 * without evaluating the 2nd operand. So check before to avoid 2154 * side effects after an error. */ 2155 if (evaluate && tv_get_string_chk(rettv) == NULL) 2156 { 2157 clear_tv(rettv); 2158 return FAIL; 2159 } 2160 } 2161 2162 /* 2163 * Get the second variable. 2164 */ 2165 if (op == '.' && *(*arg + 1) == '.') // .. string concatenation 2166 ++*arg; 2167 *arg = skipwhite(*arg + 1); 2168 if (eval6(arg, &var2, evaluate, op == '.') == FAIL) 2169 { 2170 clear_tv(rettv); 2171 return FAIL; 2172 } 2173 2174 if (evaluate) 2175 { 2176 /* 2177 * Compute the result. 2178 */ 2179 if (op == '.') 2180 { 2181 s1 = tv_get_string_buf(rettv, buf1); /* already checked */ 2182 s2 = tv_get_string_buf_chk(&var2, buf2); 2183 if (s2 == NULL) /* type error ? */ 2184 { 2185 clear_tv(rettv); 2186 clear_tv(&var2); 2187 return FAIL; 2188 } 2189 p = concat_str(s1, s2); 2190 clear_tv(rettv); 2191 rettv->v_type = VAR_STRING; 2192 rettv->vval.v_string = p; 2193 } 2194 else if (op == '+' && rettv->v_type == VAR_BLOB 2195 && var2.v_type == VAR_BLOB) 2196 { 2197 blob_T *b1 = rettv->vval.v_blob; 2198 blob_T *b2 = var2.vval.v_blob; 2199 blob_T *b = blob_alloc(); 2200 int i; 2201 2202 if (b != NULL) 2203 { 2204 for (i = 0; i < blob_len(b1); i++) 2205 ga_append(&b->bv_ga, blob_get(b1, i)); 2206 for (i = 0; i < blob_len(b2); i++) 2207 ga_append(&b->bv_ga, blob_get(b2, i)); 2208 2209 clear_tv(rettv); 2210 rettv_blob_set(rettv, b); 2211 } 2212 } 2213 else if (op == '+' && rettv->v_type == VAR_LIST 2214 && var2.v_type == VAR_LIST) 2215 { 2216 /* concatenate Lists */ 2217 if (list_concat(rettv->vval.v_list, var2.vval.v_list, 2218 &var3) == FAIL) 2219 { 2220 clear_tv(rettv); 2221 clear_tv(&var2); 2222 return FAIL; 2223 } 2224 clear_tv(rettv); 2225 *rettv = var3; 2226 } 2227 else 2228 { 2229 int error = FALSE; 2230 2231 #ifdef FEAT_FLOAT 2232 if (rettv->v_type == VAR_FLOAT) 2233 { 2234 f1 = rettv->vval.v_float; 2235 n1 = 0; 2236 } 2237 else 2238 #endif 2239 { 2240 n1 = tv_get_number_chk(rettv, &error); 2241 if (error) 2242 { 2243 /* This can only happen for "list + non-list". For 2244 * "non-list + ..." or "something - ...", we returned 2245 * before evaluating the 2nd operand. */ 2246 clear_tv(rettv); 2247 return FAIL; 2248 } 2249 #ifdef FEAT_FLOAT 2250 if (var2.v_type == VAR_FLOAT) 2251 f1 = n1; 2252 #endif 2253 } 2254 #ifdef FEAT_FLOAT 2255 if (var2.v_type == VAR_FLOAT) 2256 { 2257 f2 = var2.vval.v_float; 2258 n2 = 0; 2259 } 2260 else 2261 #endif 2262 { 2263 n2 = tv_get_number_chk(&var2, &error); 2264 if (error) 2265 { 2266 clear_tv(rettv); 2267 clear_tv(&var2); 2268 return FAIL; 2269 } 2270 #ifdef FEAT_FLOAT 2271 if (rettv->v_type == VAR_FLOAT) 2272 f2 = n2; 2273 #endif 2274 } 2275 clear_tv(rettv); 2276 2277 #ifdef FEAT_FLOAT 2278 /* If there is a float on either side the result is a float. */ 2279 if (rettv->v_type == VAR_FLOAT || var2.v_type == VAR_FLOAT) 2280 { 2281 if (op == '+') 2282 f1 = f1 + f2; 2283 else 2284 f1 = f1 - f2; 2285 rettv->v_type = VAR_FLOAT; 2286 rettv->vval.v_float = f1; 2287 } 2288 else 2289 #endif 2290 { 2291 if (op == '+') 2292 n1 = n1 + n2; 2293 else 2294 n1 = n1 - n2; 2295 rettv->v_type = VAR_NUMBER; 2296 rettv->vval.v_number = n1; 2297 } 2298 } 2299 clear_tv(&var2); 2300 } 2301 } 2302 return OK; 2303 } 2304 2305 /* 2306 * Handle fifth level expression: 2307 * * number multiplication 2308 * / number division 2309 * % number modulo 2310 * 2311 * "arg" must point to the first non-white of the expression. 2312 * "arg" is advanced to the next non-white after the recognized expression. 2313 * 2314 * Return OK or FAIL. 2315 */ 2316 static int 2317 eval6( 2318 char_u **arg, 2319 typval_T *rettv, 2320 int evaluate, 2321 int want_string) /* after "." operator */ 2322 { 2323 typval_T var2; 2324 int op; 2325 varnumber_T n1, n2; 2326 #ifdef FEAT_FLOAT 2327 int use_float = FALSE; 2328 float_T f1 = 0, f2 = 0; 2329 #endif 2330 int error = FALSE; 2331 2332 /* 2333 * Get the first variable. 2334 */ 2335 if (eval7(arg, rettv, evaluate, want_string) == FAIL) 2336 return FAIL; 2337 2338 /* 2339 * Repeat computing, until no '*', '/' or '%' is following. 2340 */ 2341 for (;;) 2342 { 2343 op = **arg; 2344 if (op != '*' && op != '/' && op != '%') 2345 break; 2346 2347 if (evaluate) 2348 { 2349 #ifdef FEAT_FLOAT 2350 if (rettv->v_type == VAR_FLOAT) 2351 { 2352 f1 = rettv->vval.v_float; 2353 use_float = TRUE; 2354 n1 = 0; 2355 } 2356 else 2357 #endif 2358 n1 = tv_get_number_chk(rettv, &error); 2359 clear_tv(rettv); 2360 if (error) 2361 return FAIL; 2362 } 2363 else 2364 n1 = 0; 2365 2366 /* 2367 * Get the second variable. 2368 */ 2369 *arg = skipwhite(*arg + 1); 2370 if (eval7(arg, &var2, evaluate, FALSE) == FAIL) 2371 return FAIL; 2372 2373 if (evaluate) 2374 { 2375 #ifdef FEAT_FLOAT 2376 if (var2.v_type == VAR_FLOAT) 2377 { 2378 if (!use_float) 2379 { 2380 f1 = n1; 2381 use_float = TRUE; 2382 } 2383 f2 = var2.vval.v_float; 2384 n2 = 0; 2385 } 2386 else 2387 #endif 2388 { 2389 n2 = tv_get_number_chk(&var2, &error); 2390 clear_tv(&var2); 2391 if (error) 2392 return FAIL; 2393 #ifdef FEAT_FLOAT 2394 if (use_float) 2395 f2 = n2; 2396 #endif 2397 } 2398 2399 /* 2400 * Compute the result. 2401 * When either side is a float the result is a float. 2402 */ 2403 #ifdef FEAT_FLOAT 2404 if (use_float) 2405 { 2406 if (op == '*') 2407 f1 = f1 * f2; 2408 else if (op == '/') 2409 { 2410 # ifdef VMS 2411 /* VMS crashes on divide by zero, work around it */ 2412 if (f2 == 0.0) 2413 { 2414 if (f1 == 0) 2415 f1 = -1 * __F_FLT_MAX - 1L; /* similar to NaN */ 2416 else if (f1 < 0) 2417 f1 = -1 * __F_FLT_MAX; 2418 else 2419 f1 = __F_FLT_MAX; 2420 } 2421 else 2422 f1 = f1 / f2; 2423 # else 2424 /* We rely on the floating point library to handle divide 2425 * by zero to result in "inf" and not a crash. */ 2426 f1 = f1 / f2; 2427 # endif 2428 } 2429 else 2430 { 2431 emsg(_("E804: Cannot use '%' with Float")); 2432 return FAIL; 2433 } 2434 rettv->v_type = VAR_FLOAT; 2435 rettv->vval.v_float = f1; 2436 } 2437 else 2438 #endif 2439 { 2440 if (op == '*') 2441 n1 = n1 * n2; 2442 else if (op == '/') 2443 n1 = num_divide(n1, n2); 2444 else 2445 n1 = num_modulus(n1, n2); 2446 2447 rettv->v_type = VAR_NUMBER; 2448 rettv->vval.v_number = n1; 2449 } 2450 } 2451 } 2452 2453 return OK; 2454 } 2455 2456 /* 2457 * Handle sixth level expression: 2458 * number number constant 2459 * 0zFFFFFFFF Blob constant 2460 * "string" string constant 2461 * 'string' literal string constant 2462 * &option-name option value 2463 * @r register contents 2464 * identifier variable value 2465 * function() function call 2466 * $VAR environment variable 2467 * (expression) nested expression 2468 * [expr, expr] List 2469 * {key: val, key: val} Dictionary 2470 * #{key: val, key: val} Dictionary with literal keys 2471 * 2472 * Also handle: 2473 * ! in front logical NOT 2474 * - in front unary minus 2475 * + in front unary plus (ignored) 2476 * trailing [] subscript in String or List 2477 * trailing .name entry in Dictionary 2478 * trailing ->name() method call 2479 * 2480 * "arg" must point to the first non-white of the expression. 2481 * "arg" is advanced to the next non-white after the recognized expression. 2482 * 2483 * Return OK or FAIL. 2484 */ 2485 static int 2486 eval7( 2487 char_u **arg, 2488 typval_T *rettv, 2489 int evaluate, 2490 int want_string UNUSED) /* after "." operator */ 2491 { 2492 varnumber_T n; 2493 int len; 2494 char_u *s; 2495 char_u *start_leader, *end_leader; 2496 int ret = OK; 2497 char_u *alias; 2498 2499 /* 2500 * Initialise variable so that clear_tv() can't mistake this for a 2501 * string and free a string that isn't there. 2502 */ 2503 rettv->v_type = VAR_UNKNOWN; 2504 2505 /* 2506 * Skip '!', '-' and '+' characters. They are handled later. 2507 */ 2508 start_leader = *arg; 2509 while (**arg == '!' || **arg == '-' || **arg == '+') 2510 *arg = skipwhite(*arg + 1); 2511 end_leader = *arg; 2512 2513 if (**arg == '.' && (!isdigit(*(*arg + 1)) 2514 #ifdef FEAT_FLOAT 2515 || current_sctx.sc_version < 2 2516 #endif 2517 )) 2518 { 2519 semsg(_(e_invexpr2), *arg); 2520 ++*arg; 2521 return FAIL; 2522 } 2523 2524 switch (**arg) 2525 { 2526 /* 2527 * Number constant. 2528 */ 2529 case '0': 2530 case '1': 2531 case '2': 2532 case '3': 2533 case '4': 2534 case '5': 2535 case '6': 2536 case '7': 2537 case '8': 2538 case '9': 2539 case '.': 2540 { 2541 #ifdef FEAT_FLOAT 2542 char_u *p; 2543 int get_float = FALSE; 2544 2545 /* We accept a float when the format matches 2546 * "[0-9]\+\.[0-9]\+\([eE][+-]\?[0-9]\+\)\?". This is very 2547 * strict to avoid backwards compatibility problems. 2548 * With script version 2 and later the leading digit can be 2549 * omitted. 2550 * Don't look for a float after the "." operator, so that 2551 * ":let vers = 1.2.3" doesn't fail. */ 2552 if (**arg == '.') 2553 p = *arg; 2554 else 2555 p = skipdigits(*arg + 1); 2556 if (!want_string && p[0] == '.' && vim_isdigit(p[1])) 2557 { 2558 get_float = TRUE; 2559 p = skipdigits(p + 2); 2560 if (*p == 'e' || *p == 'E') 2561 { 2562 ++p; 2563 if (*p == '-' || *p == '+') 2564 ++p; 2565 if (!vim_isdigit(*p)) 2566 get_float = FALSE; 2567 else 2568 p = skipdigits(p + 1); 2569 } 2570 if (ASCII_ISALPHA(*p) || *p == '.') 2571 get_float = FALSE; 2572 } 2573 if (get_float) 2574 { 2575 float_T f; 2576 2577 *arg += string2float(*arg, &f); 2578 if (evaluate) 2579 { 2580 rettv->v_type = VAR_FLOAT; 2581 rettv->vval.v_float = f; 2582 } 2583 } 2584 else 2585 #endif 2586 if (**arg == '0' && ((*arg)[1] == 'z' || (*arg)[1] == 'Z')) 2587 { 2588 char_u *bp; 2589 blob_T *blob = NULL; // init for gcc 2590 2591 // Blob constant: 0z0123456789abcdef 2592 if (evaluate) 2593 blob = blob_alloc(); 2594 for (bp = *arg + 2; vim_isxdigit(bp[0]); bp += 2) 2595 { 2596 if (!vim_isxdigit(bp[1])) 2597 { 2598 if (blob != NULL) 2599 { 2600 emsg(_("E973: Blob literal should have an even number of hex characters")); 2601 ga_clear(&blob->bv_ga); 2602 VIM_CLEAR(blob); 2603 } 2604 ret = FAIL; 2605 break; 2606 } 2607 if (blob != NULL) 2608 ga_append(&blob->bv_ga, 2609 (hex2nr(*bp) << 4) + hex2nr(*(bp+1))); 2610 if (bp[2] == '.' && vim_isxdigit(bp[3])) 2611 ++bp; 2612 } 2613 if (blob != NULL) 2614 rettv_blob_set(rettv, blob); 2615 *arg = bp; 2616 } 2617 else 2618 { 2619 // decimal, hex or octal number 2620 vim_str2nr(*arg, NULL, &len, STR2NR_ALL, &n, NULL, 0, TRUE); 2621 if (len == 0) 2622 { 2623 semsg(_(e_invexpr2), *arg); 2624 ret = FAIL; 2625 break; 2626 } 2627 *arg += len; 2628 if (evaluate) 2629 { 2630 rettv->v_type = VAR_NUMBER; 2631 rettv->vval.v_number = n; 2632 } 2633 } 2634 break; 2635 } 2636 2637 /* 2638 * String constant: "string". 2639 */ 2640 case '"': ret = get_string_tv(arg, rettv, evaluate); 2641 break; 2642 2643 /* 2644 * Literal string constant: 'str''ing'. 2645 */ 2646 case '\'': ret = get_lit_string_tv(arg, rettv, evaluate); 2647 break; 2648 2649 /* 2650 * List: [expr, expr] 2651 */ 2652 case '[': ret = get_list_tv(arg, rettv, evaluate); 2653 break; 2654 2655 /* 2656 * Dictionary: #{key: val, key: val} 2657 */ 2658 case '#': if ((*arg)[1] == '{') 2659 { 2660 ++*arg; 2661 ret = dict_get_tv(arg, rettv, evaluate, TRUE); 2662 } 2663 else 2664 ret = NOTDONE; 2665 break; 2666 2667 /* 2668 * Lambda: {arg, arg -> expr} 2669 * Dictionary: {'key': val, 'key': val} 2670 */ 2671 case '{': ret = get_lambda_tv(arg, rettv, evaluate); 2672 if (ret == NOTDONE) 2673 ret = dict_get_tv(arg, rettv, evaluate, FALSE); 2674 break; 2675 2676 /* 2677 * Option value: &name 2678 */ 2679 case '&': ret = get_option_tv(arg, rettv, evaluate); 2680 break; 2681 2682 /* 2683 * Environment variable: $VAR. 2684 */ 2685 case '$': ret = get_env_tv(arg, rettv, evaluate); 2686 break; 2687 2688 /* 2689 * Register contents: @r. 2690 */ 2691 case '@': ++*arg; 2692 if (evaluate) 2693 { 2694 rettv->v_type = VAR_STRING; 2695 rettv->vval.v_string = get_reg_contents(**arg, 2696 GREG_EXPR_SRC); 2697 } 2698 if (**arg != NUL) 2699 ++*arg; 2700 break; 2701 2702 /* 2703 * nested expression: (expression). 2704 */ 2705 case '(': *arg = skipwhite(*arg + 1); 2706 ret = eval1(arg, rettv, evaluate); /* recursive! */ 2707 if (**arg == ')') 2708 ++*arg; 2709 else if (ret == OK) 2710 { 2711 emsg(_("E110: Missing ')'")); 2712 clear_tv(rettv); 2713 ret = FAIL; 2714 } 2715 break; 2716 2717 default: ret = NOTDONE; 2718 break; 2719 } 2720 2721 if (ret == NOTDONE) 2722 { 2723 /* 2724 * Must be a variable or function name. 2725 * Can also be a curly-braces kind of name: {expr}. 2726 */ 2727 s = *arg; 2728 len = get_name_len(arg, &alias, evaluate, TRUE); 2729 if (alias != NULL) 2730 s = alias; 2731 2732 if (len <= 0) 2733 ret = FAIL; 2734 else 2735 { 2736 if (**arg == '(') /* recursive! */ 2737 ret = eval_func(arg, s, len, rettv, evaluate, NULL); 2738 else if (evaluate) 2739 ret = get_var_tv(s, len, rettv, NULL, TRUE, FALSE); 2740 else 2741 { 2742 check_vars(s, len); 2743 ret = OK; 2744 } 2745 } 2746 vim_free(alias); 2747 } 2748 2749 *arg = skipwhite(*arg); 2750 2751 /* Handle following '[', '(' and '.' for expr[expr], expr.name, 2752 * expr(expr), expr->name(expr) */ 2753 if (ret == OK) 2754 ret = handle_subscript(arg, rettv, evaluate, TRUE, 2755 start_leader, &end_leader); 2756 2757 /* 2758 * Apply logical NOT and unary '-', from right to left, ignore '+'. 2759 */ 2760 if (ret == OK && evaluate && end_leader > start_leader) 2761 ret = eval7_leader(rettv, start_leader, &end_leader); 2762 return ret; 2763 } 2764 2765 /* 2766 * Apply the leading "!" and "-" before an eval7 expression to "rettv". 2767 * Adjusts "end_leaderp" until it is at "start_leader". 2768 */ 2769 static int 2770 eval7_leader(typval_T *rettv, char_u *start_leader, char_u **end_leaderp) 2771 { 2772 char_u *end_leader = *end_leaderp; 2773 int ret = OK; 2774 int error = FALSE; 2775 varnumber_T val = 0; 2776 #ifdef FEAT_FLOAT 2777 float_T f = 0.0; 2778 2779 if (rettv->v_type == VAR_FLOAT) 2780 f = rettv->vval.v_float; 2781 else 2782 #endif 2783 val = tv_get_number_chk(rettv, &error); 2784 if (error) 2785 { 2786 clear_tv(rettv); 2787 ret = FAIL; 2788 } 2789 else 2790 { 2791 while (end_leader > start_leader) 2792 { 2793 --end_leader; 2794 if (*end_leader == '!') 2795 { 2796 #ifdef FEAT_FLOAT 2797 if (rettv->v_type == VAR_FLOAT) 2798 f = !f; 2799 else 2800 #endif 2801 val = !val; 2802 } 2803 else if (*end_leader == '-') 2804 { 2805 #ifdef FEAT_FLOAT 2806 if (rettv->v_type == VAR_FLOAT) 2807 f = -f; 2808 else 2809 #endif 2810 val = -val; 2811 } 2812 } 2813 #ifdef FEAT_FLOAT 2814 if (rettv->v_type == VAR_FLOAT) 2815 { 2816 clear_tv(rettv); 2817 rettv->vval.v_float = f; 2818 } 2819 else 2820 #endif 2821 { 2822 clear_tv(rettv); 2823 rettv->v_type = VAR_NUMBER; 2824 rettv->vval.v_number = val; 2825 } 2826 } 2827 *end_leaderp = end_leader; 2828 return ret; 2829 } 2830 2831 /* 2832 * Call the function referred to in "rettv". 2833 */ 2834 static int 2835 call_func_rettv( 2836 char_u **arg, 2837 typval_T *rettv, 2838 int evaluate, 2839 dict_T *selfdict, 2840 typval_T *basetv) 2841 { 2842 partial_T *pt = NULL; 2843 funcexe_T funcexe; 2844 typval_T functv; 2845 char_u *s; 2846 int ret; 2847 2848 // need to copy the funcref so that we can clear rettv 2849 if (evaluate) 2850 { 2851 functv = *rettv; 2852 rettv->v_type = VAR_UNKNOWN; 2853 2854 /* Invoke the function. Recursive! */ 2855 if (functv.v_type == VAR_PARTIAL) 2856 { 2857 pt = functv.vval.v_partial; 2858 s = partial_name(pt); 2859 } 2860 else 2861 s = functv.vval.v_string; 2862 } 2863 else 2864 s = (char_u *)""; 2865 2866 vim_memset(&funcexe, 0, sizeof(funcexe)); 2867 funcexe.firstline = curwin->w_cursor.lnum; 2868 funcexe.lastline = curwin->w_cursor.lnum; 2869 funcexe.evaluate = evaluate; 2870 funcexe.partial = pt; 2871 funcexe.selfdict = selfdict; 2872 funcexe.basetv = basetv; 2873 ret = get_func_tv(s, -1, rettv, arg, &funcexe); 2874 2875 /* Clear the funcref afterwards, so that deleting it while 2876 * evaluating the arguments is possible (see test55). */ 2877 if (evaluate) 2878 clear_tv(&functv); 2879 2880 return ret; 2881 } 2882 2883 /* 2884 * Evaluate "->method()". 2885 * "*arg" points to the '-'. 2886 * Returns FAIL or OK. "*arg" is advanced to after the ')'. 2887 */ 2888 static int 2889 eval_lambda( 2890 char_u **arg, 2891 typval_T *rettv, 2892 int evaluate, 2893 int verbose) /* give error messages */ 2894 { 2895 typval_T base = *rettv; 2896 int ret; 2897 2898 // Skip over the ->. 2899 *arg += 2; 2900 rettv->v_type = VAR_UNKNOWN; 2901 2902 ret = get_lambda_tv(arg, rettv, evaluate); 2903 if (ret == NOTDONE) 2904 return FAIL; 2905 else if (**arg != '(') 2906 { 2907 if (verbose) 2908 { 2909 if (*skipwhite(*arg) == '(') 2910 semsg(_(e_nowhitespace)); 2911 else 2912 semsg(_(e_missingparen), "lambda"); 2913 } 2914 clear_tv(rettv); 2915 return FAIL; 2916 } 2917 return call_func_rettv(arg, rettv, evaluate, NULL, &base); 2918 } 2919 2920 /* 2921 * Evaluate "->method()". 2922 * "*arg" points to the '-'. 2923 * Returns FAIL or OK. "*arg" is advanced to after the ')'. 2924 */ 2925 static int 2926 eval_method( 2927 char_u **arg, 2928 typval_T *rettv, 2929 int evaluate, 2930 int verbose) /* give error messages */ 2931 { 2932 char_u *name; 2933 long len; 2934 char_u *alias; 2935 typval_T base = *rettv; 2936 int ret; 2937 2938 // Skip over the ->. 2939 *arg += 2; 2940 rettv->v_type = VAR_UNKNOWN; 2941 2942 name = *arg; 2943 len = get_name_len(arg, &alias, evaluate, TRUE); 2944 if (alias != NULL) 2945 name = alias; 2946 2947 if (len <= 0) 2948 { 2949 if (verbose) 2950 emsg(_("E260: Missing name after ->")); 2951 ret = FAIL; 2952 } 2953 else 2954 { 2955 if (**arg != '(') 2956 { 2957 if (verbose) 2958 semsg(_(e_missingparen), name); 2959 ret = FAIL; 2960 } 2961 else if (VIM_ISWHITE((*arg)[-1])) 2962 { 2963 if (verbose) 2964 semsg(_(e_nowhitespace)); 2965 ret = FAIL; 2966 } 2967 else 2968 ret = eval_func(arg, name, len, rettv, evaluate, &base); 2969 } 2970 2971 // Clear the funcref afterwards, so that deleting it while 2972 // evaluating the arguments is possible (see test55). 2973 if (evaluate) 2974 clear_tv(&base); 2975 2976 return ret; 2977 } 2978 2979 /* 2980 * Evaluate an "[expr]" or "[expr:expr]" index. Also "dict.key". 2981 * "*arg" points to the '[' or '.'. 2982 * Returns FAIL or OK. "*arg" is advanced to after the ']'. 2983 */ 2984 static int 2985 eval_index( 2986 char_u **arg, 2987 typval_T *rettv, 2988 int evaluate, 2989 int verbose) /* give error messages */ 2990 { 2991 int empty1 = FALSE, empty2 = FALSE; 2992 typval_T var1, var2; 2993 long i; 2994 long n1, n2 = 0; 2995 long len = -1; 2996 int range = FALSE; 2997 char_u *s; 2998 char_u *key = NULL; 2999 3000 switch (rettv->v_type) 3001 { 3002 case VAR_FUNC: 3003 case VAR_PARTIAL: 3004 if (verbose) 3005 emsg(_("E695: Cannot index a Funcref")); 3006 return FAIL; 3007 case VAR_FLOAT: 3008 #ifdef FEAT_FLOAT 3009 if (verbose) 3010 emsg(_(e_float_as_string)); 3011 return FAIL; 3012 #endif 3013 case VAR_SPECIAL: 3014 case VAR_JOB: 3015 case VAR_CHANNEL: 3016 if (verbose) 3017 emsg(_("E909: Cannot index a special variable")); 3018 return FAIL; 3019 case VAR_UNKNOWN: 3020 if (evaluate) 3021 return FAIL; 3022 /* FALLTHROUGH */ 3023 3024 case VAR_STRING: 3025 case VAR_NUMBER: 3026 case VAR_LIST: 3027 case VAR_DICT: 3028 case VAR_BLOB: 3029 break; 3030 } 3031 3032 init_tv(&var1); 3033 init_tv(&var2); 3034 if (**arg == '.') 3035 { 3036 /* 3037 * dict.name 3038 */ 3039 key = *arg + 1; 3040 for (len = 0; ASCII_ISALNUM(key[len]) || key[len] == '_'; ++len) 3041 ; 3042 if (len == 0) 3043 return FAIL; 3044 *arg = skipwhite(key + len); 3045 } 3046 else 3047 { 3048 /* 3049 * something[idx] 3050 * 3051 * Get the (first) variable from inside the []. 3052 */ 3053 *arg = skipwhite(*arg + 1); 3054 if (**arg == ':') 3055 empty1 = TRUE; 3056 else if (eval1(arg, &var1, evaluate) == FAIL) /* recursive! */ 3057 return FAIL; 3058 else if (evaluate && tv_get_string_chk(&var1) == NULL) 3059 { 3060 /* not a number or string */ 3061 clear_tv(&var1); 3062 return FAIL; 3063 } 3064 3065 /* 3066 * Get the second variable from inside the [:]. 3067 */ 3068 if (**arg == ':') 3069 { 3070 range = TRUE; 3071 *arg = skipwhite(*arg + 1); 3072 if (**arg == ']') 3073 empty2 = TRUE; 3074 else if (eval1(arg, &var2, evaluate) == FAIL) /* recursive! */ 3075 { 3076 if (!empty1) 3077 clear_tv(&var1); 3078 return FAIL; 3079 } 3080 else if (evaluate && tv_get_string_chk(&var2) == NULL) 3081 { 3082 /* not a number or string */ 3083 if (!empty1) 3084 clear_tv(&var1); 3085 clear_tv(&var2); 3086 return FAIL; 3087 } 3088 } 3089 3090 /* Check for the ']'. */ 3091 if (**arg != ']') 3092 { 3093 if (verbose) 3094 emsg(_(e_missbrac)); 3095 clear_tv(&var1); 3096 if (range) 3097 clear_tv(&var2); 3098 return FAIL; 3099 } 3100 *arg = skipwhite(*arg + 1); /* skip the ']' */ 3101 } 3102 3103 if (evaluate) 3104 { 3105 n1 = 0; 3106 if (!empty1 && rettv->v_type != VAR_DICT) 3107 { 3108 n1 = tv_get_number(&var1); 3109 clear_tv(&var1); 3110 } 3111 if (range) 3112 { 3113 if (empty2) 3114 n2 = -1; 3115 else 3116 { 3117 n2 = tv_get_number(&var2); 3118 clear_tv(&var2); 3119 } 3120 } 3121 3122 switch (rettv->v_type) 3123 { 3124 case VAR_UNKNOWN: 3125 case VAR_FUNC: 3126 case VAR_PARTIAL: 3127 case VAR_FLOAT: 3128 case VAR_SPECIAL: 3129 case VAR_JOB: 3130 case VAR_CHANNEL: 3131 break; /* not evaluating, skipping over subscript */ 3132 3133 case VAR_NUMBER: 3134 case VAR_STRING: 3135 s = tv_get_string(rettv); 3136 len = (long)STRLEN(s); 3137 if (range) 3138 { 3139 /* The resulting variable is a substring. If the indexes 3140 * are out of range the result is empty. */ 3141 if (n1 < 0) 3142 { 3143 n1 = len + n1; 3144 if (n1 < 0) 3145 n1 = 0; 3146 } 3147 if (n2 < 0) 3148 n2 = len + n2; 3149 else if (n2 >= len) 3150 n2 = len; 3151 if (n1 >= len || n2 < 0 || n1 > n2) 3152 s = NULL; 3153 else 3154 s = vim_strnsave(s + n1, (int)(n2 - n1 + 1)); 3155 } 3156 else 3157 { 3158 /* The resulting variable is a string of a single 3159 * character. If the index is too big or negative the 3160 * result is empty. */ 3161 if (n1 >= len || n1 < 0) 3162 s = NULL; 3163 else 3164 s = vim_strnsave(s + n1, 1); 3165 } 3166 clear_tv(rettv); 3167 rettv->v_type = VAR_STRING; 3168 rettv->vval.v_string = s; 3169 break; 3170 3171 case VAR_BLOB: 3172 len = blob_len(rettv->vval.v_blob); 3173 if (range) 3174 { 3175 // The resulting variable is a sub-blob. If the indexes 3176 // are out of range the result is empty. 3177 if (n1 < 0) 3178 { 3179 n1 = len + n1; 3180 if (n1 < 0) 3181 n1 = 0; 3182 } 3183 if (n2 < 0) 3184 n2 = len + n2; 3185 else if (n2 >= len) 3186 n2 = len - 1; 3187 if (n1 >= len || n2 < 0 || n1 > n2) 3188 { 3189 clear_tv(rettv); 3190 rettv->v_type = VAR_BLOB; 3191 rettv->vval.v_blob = NULL; 3192 } 3193 else 3194 { 3195 blob_T *blob = blob_alloc(); 3196 3197 if (blob != NULL) 3198 { 3199 if (ga_grow(&blob->bv_ga, n2 - n1 + 1) == FAIL) 3200 { 3201 blob_free(blob); 3202 return FAIL; 3203 } 3204 blob->bv_ga.ga_len = n2 - n1 + 1; 3205 for (i = n1; i <= n2; i++) 3206 blob_set(blob, i - n1, 3207 blob_get(rettv->vval.v_blob, i)); 3208 3209 clear_tv(rettv); 3210 rettv_blob_set(rettv, blob); 3211 } 3212 } 3213 } 3214 else 3215 { 3216 // The resulting variable is a byte value. 3217 // If the index is too big or negative that is an error. 3218 if (n1 < 0) 3219 n1 = len + n1; 3220 if (n1 < len && n1 >= 0) 3221 { 3222 int v = blob_get(rettv->vval.v_blob, n1); 3223 3224 clear_tv(rettv); 3225 rettv->v_type = VAR_NUMBER; 3226 rettv->vval.v_number = v; 3227 } 3228 else 3229 semsg(_(e_blobidx), n1); 3230 } 3231 break; 3232 3233 case VAR_LIST: 3234 len = list_len(rettv->vval.v_list); 3235 if (n1 < 0) 3236 n1 = len + n1; 3237 if (!empty1 && (n1 < 0 || n1 >= len)) 3238 { 3239 /* For a range we allow invalid values and return an empty 3240 * list. A list index out of range is an error. */ 3241 if (!range) 3242 { 3243 if (verbose) 3244 semsg(_(e_listidx), n1); 3245 return FAIL; 3246 } 3247 n1 = len; 3248 } 3249 if (range) 3250 { 3251 list_T *l; 3252 listitem_T *item; 3253 3254 if (n2 < 0) 3255 n2 = len + n2; 3256 else if (n2 >= len) 3257 n2 = len - 1; 3258 if (!empty2 && (n2 < 0 || n2 + 1 < n1)) 3259 n2 = -1; 3260 l = list_alloc(); 3261 if (l == NULL) 3262 return FAIL; 3263 for (item = list_find(rettv->vval.v_list, n1); 3264 n1 <= n2; ++n1) 3265 { 3266 if (list_append_tv(l, &item->li_tv) == FAIL) 3267 { 3268 list_free(l); 3269 return FAIL; 3270 } 3271 item = item->li_next; 3272 } 3273 clear_tv(rettv); 3274 rettv_list_set(rettv, l); 3275 } 3276 else 3277 { 3278 copy_tv(&list_find(rettv->vval.v_list, n1)->li_tv, &var1); 3279 clear_tv(rettv); 3280 *rettv = var1; 3281 } 3282 break; 3283 3284 case VAR_DICT: 3285 if (range) 3286 { 3287 if (verbose) 3288 emsg(_(e_dictrange)); 3289 if (len == -1) 3290 clear_tv(&var1); 3291 return FAIL; 3292 } 3293 { 3294 dictitem_T *item; 3295 3296 if (len == -1) 3297 { 3298 key = tv_get_string_chk(&var1); 3299 if (key == NULL) 3300 { 3301 clear_tv(&var1); 3302 return FAIL; 3303 } 3304 } 3305 3306 item = dict_find(rettv->vval.v_dict, key, (int)len); 3307 3308 if (item == NULL && verbose) 3309 semsg(_(e_dictkey), key); 3310 if (len == -1) 3311 clear_tv(&var1); 3312 if (item == NULL) 3313 return FAIL; 3314 3315 copy_tv(&item->di_tv, &var1); 3316 clear_tv(rettv); 3317 *rettv = var1; 3318 } 3319 break; 3320 } 3321 } 3322 3323 return OK; 3324 } 3325 3326 /* 3327 * Get an option value. 3328 * "arg" points to the '&' or '+' before the option name. 3329 * "arg" is advanced to character after the option name. 3330 * Return OK or FAIL. 3331 */ 3332 int 3333 get_option_tv( 3334 char_u **arg, 3335 typval_T *rettv, /* when NULL, only check if option exists */ 3336 int evaluate) 3337 { 3338 char_u *option_end; 3339 long numval; 3340 char_u *stringval; 3341 int opt_type; 3342 int c; 3343 int working = (**arg == '+'); /* has("+option") */ 3344 int ret = OK; 3345 int opt_flags; 3346 3347 /* 3348 * Isolate the option name and find its value. 3349 */ 3350 option_end = find_option_end(arg, &opt_flags); 3351 if (option_end == NULL) 3352 { 3353 if (rettv != NULL) 3354 semsg(_("E112: Option name missing: %s"), *arg); 3355 return FAIL; 3356 } 3357 3358 if (!evaluate) 3359 { 3360 *arg = option_end; 3361 return OK; 3362 } 3363 3364 c = *option_end; 3365 *option_end = NUL; 3366 opt_type = get_option_value(*arg, &numval, 3367 rettv == NULL ? NULL : &stringval, opt_flags); 3368 3369 if (opt_type == -3) /* invalid name */ 3370 { 3371 if (rettv != NULL) 3372 semsg(_("E113: Unknown option: %s"), *arg); 3373 ret = FAIL; 3374 } 3375 else if (rettv != NULL) 3376 { 3377 if (opt_type == -2) /* hidden string option */ 3378 { 3379 rettv->v_type = VAR_STRING; 3380 rettv->vval.v_string = NULL; 3381 } 3382 else if (opt_type == -1) /* hidden number option */ 3383 { 3384 rettv->v_type = VAR_NUMBER; 3385 rettv->vval.v_number = 0; 3386 } 3387 else if (opt_type == 1) /* number option */ 3388 { 3389 rettv->v_type = VAR_NUMBER; 3390 rettv->vval.v_number = numval; 3391 } 3392 else /* string option */ 3393 { 3394 rettv->v_type = VAR_STRING; 3395 rettv->vval.v_string = stringval; 3396 } 3397 } 3398 else if (working && (opt_type == -2 || opt_type == -1)) 3399 ret = FAIL; 3400 3401 *option_end = c; /* put back for error messages */ 3402 *arg = option_end; 3403 3404 return ret; 3405 } 3406 3407 /* 3408 * Allocate a variable for a string constant. 3409 * Return OK or FAIL. 3410 */ 3411 static int 3412 get_string_tv(char_u **arg, typval_T *rettv, int evaluate) 3413 { 3414 char_u *p; 3415 char_u *name; 3416 int extra = 0; 3417 3418 /* 3419 * Find the end of the string, skipping backslashed characters. 3420 */ 3421 for (p = *arg + 1; *p != NUL && *p != '"'; MB_PTR_ADV(p)) 3422 { 3423 if (*p == '\\' && p[1] != NUL) 3424 { 3425 ++p; 3426 /* A "\<x>" form occupies at least 4 characters, and produces up 3427 * to 6 characters: reserve space for 2 extra */ 3428 if (*p == '<') 3429 extra += 2; 3430 } 3431 } 3432 3433 if (*p != '"') 3434 { 3435 semsg(_("E114: Missing quote: %s"), *arg); 3436 return FAIL; 3437 } 3438 3439 /* If only parsing, set *arg and return here */ 3440 if (!evaluate) 3441 { 3442 *arg = p + 1; 3443 return OK; 3444 } 3445 3446 /* 3447 * Copy the string into allocated memory, handling backslashed 3448 * characters. 3449 */ 3450 name = alloc(p - *arg + extra); 3451 if (name == NULL) 3452 return FAIL; 3453 rettv->v_type = VAR_STRING; 3454 rettv->vval.v_string = name; 3455 3456 for (p = *arg + 1; *p != NUL && *p != '"'; ) 3457 { 3458 if (*p == '\\') 3459 { 3460 switch (*++p) 3461 { 3462 case 'b': *name++ = BS; ++p; break; 3463 case 'e': *name++ = ESC; ++p; break; 3464 case 'f': *name++ = FF; ++p; break; 3465 case 'n': *name++ = NL; ++p; break; 3466 case 'r': *name++ = CAR; ++p; break; 3467 case 't': *name++ = TAB; ++p; break; 3468 3469 case 'X': /* hex: "\x1", "\x12" */ 3470 case 'x': 3471 case 'u': /* Unicode: "\u0023" */ 3472 case 'U': 3473 if (vim_isxdigit(p[1])) 3474 { 3475 int n, nr; 3476 int c = toupper(*p); 3477 3478 if (c == 'X') 3479 n = 2; 3480 else if (*p == 'u') 3481 n = 4; 3482 else 3483 n = 8; 3484 nr = 0; 3485 while (--n >= 0 && vim_isxdigit(p[1])) 3486 { 3487 ++p; 3488 nr = (nr << 4) + hex2nr(*p); 3489 } 3490 ++p; 3491 /* For "\u" store the number according to 3492 * 'encoding'. */ 3493 if (c != 'X') 3494 name += (*mb_char2bytes)(nr, name); 3495 else 3496 *name++ = nr; 3497 } 3498 break; 3499 3500 /* octal: "\1", "\12", "\123" */ 3501 case '0': 3502 case '1': 3503 case '2': 3504 case '3': 3505 case '4': 3506 case '5': 3507 case '6': 3508 case '7': *name = *p++ - '0'; 3509 if (*p >= '0' && *p <= '7') 3510 { 3511 *name = (*name << 3) + *p++ - '0'; 3512 if (*p >= '0' && *p <= '7') 3513 *name = (*name << 3) + *p++ - '0'; 3514 } 3515 ++name; 3516 break; 3517 3518 /* Special key, e.g.: "\<C-W>" */ 3519 case '<': extra = trans_special(&p, name, TRUE, TRUE); 3520 if (extra != 0) 3521 { 3522 name += extra; 3523 break; 3524 } 3525 /* FALLTHROUGH */ 3526 3527 default: MB_COPY_CHAR(p, name); 3528 break; 3529 } 3530 } 3531 else 3532 MB_COPY_CHAR(p, name); 3533 3534 } 3535 *name = NUL; 3536 if (*p != NUL) /* just in case */ 3537 ++p; 3538 *arg = p; 3539 3540 return OK; 3541 } 3542 3543 /* 3544 * Allocate a variable for a 'str''ing' constant. 3545 * Return OK or FAIL. 3546 */ 3547 static int 3548 get_lit_string_tv(char_u **arg, typval_T *rettv, int evaluate) 3549 { 3550 char_u *p; 3551 char_u *str; 3552 int reduce = 0; 3553 3554 /* 3555 * Find the end of the string, skipping ''. 3556 */ 3557 for (p = *arg + 1; *p != NUL; MB_PTR_ADV(p)) 3558 { 3559 if (*p == '\'') 3560 { 3561 if (p[1] != '\'') 3562 break; 3563 ++reduce; 3564 ++p; 3565 } 3566 } 3567 3568 if (*p != '\'') 3569 { 3570 semsg(_("E115: Missing quote: %s"), *arg); 3571 return FAIL; 3572 } 3573 3574 /* If only parsing return after setting "*arg" */ 3575 if (!evaluate) 3576 { 3577 *arg = p + 1; 3578 return OK; 3579 } 3580 3581 /* 3582 * Copy the string into allocated memory, handling '' to ' reduction. 3583 */ 3584 str = alloc((p - *arg) - reduce); 3585 if (str == NULL) 3586 return FAIL; 3587 rettv->v_type = VAR_STRING; 3588 rettv->vval.v_string = str; 3589 3590 for (p = *arg + 1; *p != NUL; ) 3591 { 3592 if (*p == '\'') 3593 { 3594 if (p[1] != '\'') 3595 break; 3596 ++p; 3597 } 3598 MB_COPY_CHAR(p, str); 3599 } 3600 *str = NUL; 3601 *arg = p + 1; 3602 3603 return OK; 3604 } 3605 3606 /* 3607 * Return the function name of the partial. 3608 */ 3609 char_u * 3610 partial_name(partial_T *pt) 3611 { 3612 if (pt->pt_name != NULL) 3613 return pt->pt_name; 3614 return pt->pt_func->uf_name; 3615 } 3616 3617 static void 3618 partial_free(partial_T *pt) 3619 { 3620 int i; 3621 3622 for (i = 0; i < pt->pt_argc; ++i) 3623 clear_tv(&pt->pt_argv[i]); 3624 vim_free(pt->pt_argv); 3625 dict_unref(pt->pt_dict); 3626 if (pt->pt_name != NULL) 3627 { 3628 func_unref(pt->pt_name); 3629 vim_free(pt->pt_name); 3630 } 3631 else 3632 func_ptr_unref(pt->pt_func); 3633 vim_free(pt); 3634 } 3635 3636 /* 3637 * Unreference a closure: decrement the reference count and free it when it 3638 * becomes zero. 3639 */ 3640 void 3641 partial_unref(partial_T *pt) 3642 { 3643 if (pt != NULL && --pt->pt_refcount <= 0) 3644 partial_free(pt); 3645 } 3646 3647 static int tv_equal_recurse_limit; 3648 3649 static int 3650 func_equal( 3651 typval_T *tv1, 3652 typval_T *tv2, 3653 int ic) /* ignore case */ 3654 { 3655 char_u *s1, *s2; 3656 dict_T *d1, *d2; 3657 int a1, a2; 3658 int i; 3659 3660 /* empty and NULL function name considered the same */ 3661 s1 = tv1->v_type == VAR_FUNC ? tv1->vval.v_string 3662 : partial_name(tv1->vval.v_partial); 3663 if (s1 != NULL && *s1 == NUL) 3664 s1 = NULL; 3665 s2 = tv2->v_type == VAR_FUNC ? tv2->vval.v_string 3666 : partial_name(tv2->vval.v_partial); 3667 if (s2 != NULL && *s2 == NUL) 3668 s2 = NULL; 3669 if (s1 == NULL || s2 == NULL) 3670 { 3671 if (s1 != s2) 3672 return FALSE; 3673 } 3674 else if (STRCMP(s1, s2) != 0) 3675 return FALSE; 3676 3677 /* empty dict and NULL dict is different */ 3678 d1 = tv1->v_type == VAR_FUNC ? NULL : tv1->vval.v_partial->pt_dict; 3679 d2 = tv2->v_type == VAR_FUNC ? NULL : tv2->vval.v_partial->pt_dict; 3680 if (d1 == NULL || d2 == NULL) 3681 { 3682 if (d1 != d2) 3683 return FALSE; 3684 } 3685 else if (!dict_equal(d1, d2, ic, TRUE)) 3686 return FALSE; 3687 3688 /* empty list and no list considered the same */ 3689 a1 = tv1->v_type == VAR_FUNC ? 0 : tv1->vval.v_partial->pt_argc; 3690 a2 = tv2->v_type == VAR_FUNC ? 0 : tv2->vval.v_partial->pt_argc; 3691 if (a1 != a2) 3692 return FALSE; 3693 for (i = 0; i < a1; ++i) 3694 if (!tv_equal(tv1->vval.v_partial->pt_argv + i, 3695 tv2->vval.v_partial->pt_argv + i, ic, TRUE)) 3696 return FALSE; 3697 3698 return TRUE; 3699 } 3700 3701 /* 3702 * Return TRUE if "tv1" and "tv2" have the same value. 3703 * Compares the items just like "==" would compare them, but strings and 3704 * numbers are different. Floats and numbers are also different. 3705 */ 3706 int 3707 tv_equal( 3708 typval_T *tv1, 3709 typval_T *tv2, 3710 int ic, /* ignore case */ 3711 int recursive) /* TRUE when used recursively */ 3712 { 3713 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; 3714 char_u *s1, *s2; 3715 static int recursive_cnt = 0; /* catch recursive loops */ 3716 int r; 3717 3718 /* Catch lists and dicts that have an endless loop by limiting 3719 * recursiveness to a limit. We guess they are equal then. 3720 * A fixed limit has the problem of still taking an awful long time. 3721 * Reduce the limit every time running into it. That should work fine for 3722 * deeply linked structures that are not recursively linked and catch 3723 * recursiveness quickly. */ 3724 if (!recursive) 3725 tv_equal_recurse_limit = 1000; 3726 if (recursive_cnt >= tv_equal_recurse_limit) 3727 { 3728 --tv_equal_recurse_limit; 3729 return TRUE; 3730 } 3731 3732 /* For VAR_FUNC and VAR_PARTIAL compare the function name, bound dict and 3733 * arguments. */ 3734 if ((tv1->v_type == VAR_FUNC 3735 || (tv1->v_type == VAR_PARTIAL && tv1->vval.v_partial != NULL)) 3736 && (tv2->v_type == VAR_FUNC 3737 || (tv2->v_type == VAR_PARTIAL && tv2->vval.v_partial != NULL))) 3738 { 3739 ++recursive_cnt; 3740 r = func_equal(tv1, tv2, ic); 3741 --recursive_cnt; 3742 return r; 3743 } 3744 3745 if (tv1->v_type != tv2->v_type) 3746 return FALSE; 3747 3748 switch (tv1->v_type) 3749 { 3750 case VAR_LIST: 3751 ++recursive_cnt; 3752 r = list_equal(tv1->vval.v_list, tv2->vval.v_list, ic, TRUE); 3753 --recursive_cnt; 3754 return r; 3755 3756 case VAR_DICT: 3757 ++recursive_cnt; 3758 r = dict_equal(tv1->vval.v_dict, tv2->vval.v_dict, ic, TRUE); 3759 --recursive_cnt; 3760 return r; 3761 3762 case VAR_BLOB: 3763 return blob_equal(tv1->vval.v_blob, tv2->vval.v_blob); 3764 3765 case VAR_NUMBER: 3766 return tv1->vval.v_number == tv2->vval.v_number; 3767 3768 case VAR_STRING: 3769 s1 = tv_get_string_buf(tv1, buf1); 3770 s2 = tv_get_string_buf(tv2, buf2); 3771 return ((ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2)) == 0); 3772 3773 case VAR_SPECIAL: 3774 return tv1->vval.v_number == tv2->vval.v_number; 3775 3776 case VAR_FLOAT: 3777 #ifdef FEAT_FLOAT 3778 return tv1->vval.v_float == tv2->vval.v_float; 3779 #endif 3780 case VAR_JOB: 3781 #ifdef FEAT_JOB_CHANNEL 3782 return tv1->vval.v_job == tv2->vval.v_job; 3783 #endif 3784 case VAR_CHANNEL: 3785 #ifdef FEAT_JOB_CHANNEL 3786 return tv1->vval.v_channel == tv2->vval.v_channel; 3787 #endif 3788 case VAR_FUNC: 3789 case VAR_PARTIAL: 3790 case VAR_UNKNOWN: 3791 break; 3792 } 3793 3794 /* VAR_UNKNOWN can be the result of a invalid expression, let's say it 3795 * does not equal anything, not even itself. */ 3796 return FALSE; 3797 } 3798 3799 /* 3800 * Return the next (unique) copy ID. 3801 * Used for serializing nested structures. 3802 */ 3803 int 3804 get_copyID(void) 3805 { 3806 current_copyID += COPYID_INC; 3807 return current_copyID; 3808 } 3809 3810 /* 3811 * Garbage collection for lists and dictionaries. 3812 * 3813 * We use reference counts to be able to free most items right away when they 3814 * are no longer used. But for composite items it's possible that it becomes 3815 * unused while the reference count is > 0: When there is a recursive 3816 * reference. Example: 3817 * :let l = [1, 2, 3] 3818 * :let d = {9: l} 3819 * :let l[1] = d 3820 * 3821 * Since this is quite unusual we handle this with garbage collection: every 3822 * once in a while find out which lists and dicts are not referenced from any 3823 * variable. 3824 * 3825 * Here is a good reference text about garbage collection (refers to Python 3826 * but it applies to all reference-counting mechanisms): 3827 * http://python.ca/nas/python/gc/ 3828 */ 3829 3830 /* 3831 * Do garbage collection for lists and dicts. 3832 * When "testing" is TRUE this is called from test_garbagecollect_now(). 3833 * Return TRUE if some memory was freed. 3834 */ 3835 int 3836 garbage_collect(int testing) 3837 { 3838 int copyID; 3839 int abort = FALSE; 3840 buf_T *buf; 3841 win_T *wp; 3842 int did_free = FALSE; 3843 tabpage_T *tp; 3844 3845 if (!testing) 3846 { 3847 /* Only do this once. */ 3848 want_garbage_collect = FALSE; 3849 may_garbage_collect = FALSE; 3850 garbage_collect_at_exit = FALSE; 3851 } 3852 3853 /* We advance by two because we add one for items referenced through 3854 * previous_funccal. */ 3855 copyID = get_copyID(); 3856 3857 /* 3858 * 1. Go through all accessible variables and mark all lists and dicts 3859 * with copyID. 3860 */ 3861 3862 /* Don't free variables in the previous_funccal list unless they are only 3863 * referenced through previous_funccal. This must be first, because if 3864 * the item is referenced elsewhere the funccal must not be freed. */ 3865 abort = abort || set_ref_in_previous_funccal(copyID); 3866 3867 /* script-local variables */ 3868 abort = abort || garbage_collect_scriptvars(copyID); 3869 3870 /* buffer-local variables */ 3871 FOR_ALL_BUFFERS(buf) 3872 abort = abort || set_ref_in_item(&buf->b_bufvar.di_tv, copyID, 3873 NULL, NULL); 3874 3875 /* window-local variables */ 3876 FOR_ALL_TAB_WINDOWS(tp, wp) 3877 abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID, 3878 NULL, NULL); 3879 if (aucmd_win != NULL) 3880 abort = abort || set_ref_in_item(&aucmd_win->w_winvar.di_tv, copyID, 3881 NULL, NULL); 3882 #ifdef FEAT_TEXT_PROP 3883 for (wp = first_popupwin; wp != NULL; wp = wp->w_next) 3884 abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID, 3885 NULL, NULL); 3886 FOR_ALL_TABPAGES(tp) 3887 for (wp = tp->tp_first_popupwin; wp != NULL; wp = wp->w_next) 3888 abort = abort || set_ref_in_item(&wp->w_winvar.di_tv, copyID, 3889 NULL, NULL); 3890 #endif 3891 3892 /* tabpage-local variables */ 3893 FOR_ALL_TABPAGES(tp) 3894 abort = abort || set_ref_in_item(&tp->tp_winvar.di_tv, copyID, 3895 NULL, NULL); 3896 /* global variables */ 3897 abort = abort || garbage_collect_globvars(copyID); 3898 3899 /* function-local variables */ 3900 abort = abort || set_ref_in_call_stack(copyID); 3901 3902 /* named functions (matters for closures) */ 3903 abort = abort || set_ref_in_functions(copyID); 3904 3905 /* function call arguments, if v:testing is set. */ 3906 abort = abort || set_ref_in_func_args(copyID); 3907 3908 /* v: vars */ 3909 abort = abort || garbage_collect_vimvars(copyID); 3910 3911 // callbacks in buffers 3912 abort = abort || set_ref_in_buffers(copyID); 3913 3914 #ifdef FEAT_LUA 3915 abort = abort || set_ref_in_lua(copyID); 3916 #endif 3917 3918 #ifdef FEAT_PYTHON 3919 abort = abort || set_ref_in_python(copyID); 3920 #endif 3921 3922 #ifdef FEAT_PYTHON3 3923 abort = abort || set_ref_in_python3(copyID); 3924 #endif 3925 3926 #ifdef FEAT_JOB_CHANNEL 3927 abort = abort || set_ref_in_channel(copyID); 3928 abort = abort || set_ref_in_job(copyID); 3929 #endif 3930 #ifdef FEAT_NETBEANS_INTG 3931 abort = abort || set_ref_in_nb_channel(copyID); 3932 #endif 3933 3934 #ifdef FEAT_TIMERS 3935 abort = abort || set_ref_in_timer(copyID); 3936 #endif 3937 3938 #ifdef FEAT_QUICKFIX 3939 abort = abort || set_ref_in_quickfix(copyID); 3940 #endif 3941 3942 #ifdef FEAT_TERMINAL 3943 abort = abort || set_ref_in_term(copyID); 3944 #endif 3945 3946 #ifdef FEAT_TEXT_PROP 3947 abort = abort || set_ref_in_popups(copyID); 3948 #endif 3949 3950 if (!abort) 3951 { 3952 /* 3953 * 2. Free lists and dictionaries that are not referenced. 3954 */ 3955 did_free = free_unref_items(copyID); 3956 3957 /* 3958 * 3. Check if any funccal can be freed now. 3959 * This may call us back recursively. 3960 */ 3961 free_unref_funccal(copyID, testing); 3962 } 3963 else if (p_verbose > 0) 3964 { 3965 verb_msg(_("Not enough memory to set references, garbage collection aborted!")); 3966 } 3967 3968 return did_free; 3969 } 3970 3971 /* 3972 * Free lists, dictionaries, channels and jobs that are no longer referenced. 3973 */ 3974 static int 3975 free_unref_items(int copyID) 3976 { 3977 int did_free = FALSE; 3978 3979 /* Let all "free" functions know that we are here. This means no 3980 * dictionaries, lists, channels or jobs are to be freed, because we will 3981 * do that here. */ 3982 in_free_unref_items = TRUE; 3983 3984 /* 3985 * PASS 1: free the contents of the items. We don't free the items 3986 * themselves yet, so that it is possible to decrement refcount counters 3987 */ 3988 3989 /* Go through the list of dicts and free items without the copyID. */ 3990 did_free |= dict_free_nonref(copyID); 3991 3992 /* Go through the list of lists and free items without the copyID. */ 3993 did_free |= list_free_nonref(copyID); 3994 3995 #ifdef FEAT_JOB_CHANNEL 3996 /* Go through the list of jobs and free items without the copyID. This 3997 * must happen before doing channels, because jobs refer to channels, but 3998 * the reference from the channel to the job isn't tracked. */ 3999 did_free |= free_unused_jobs_contents(copyID, COPYID_MASK); 4000 4001 /* Go through the list of channels and free items without the copyID. */ 4002 did_free |= free_unused_channels_contents(copyID, COPYID_MASK); 4003 #endif 4004 4005 /* 4006 * PASS 2: free the items themselves. 4007 */ 4008 dict_free_items(copyID); 4009 list_free_items(copyID); 4010 4011 #ifdef FEAT_JOB_CHANNEL 4012 /* Go through the list of jobs and free items without the copyID. This 4013 * must happen before doing channels, because jobs refer to channels, but 4014 * the reference from the channel to the job isn't tracked. */ 4015 free_unused_jobs(copyID, COPYID_MASK); 4016 4017 /* Go through the list of channels and free items without the copyID. */ 4018 free_unused_channels(copyID, COPYID_MASK); 4019 #endif 4020 4021 in_free_unref_items = FALSE; 4022 4023 return did_free; 4024 } 4025 4026 /* 4027 * Mark all lists and dicts referenced through hashtab "ht" with "copyID". 4028 * "list_stack" is used to add lists to be marked. Can be NULL. 4029 * 4030 * Returns TRUE if setting references failed somehow. 4031 */ 4032 int 4033 set_ref_in_ht(hashtab_T *ht, int copyID, list_stack_T **list_stack) 4034 { 4035 int todo; 4036 int abort = FALSE; 4037 hashitem_T *hi; 4038 hashtab_T *cur_ht; 4039 ht_stack_T *ht_stack = NULL; 4040 ht_stack_T *tempitem; 4041 4042 cur_ht = ht; 4043 for (;;) 4044 { 4045 if (!abort) 4046 { 4047 /* Mark each item in the hashtab. If the item contains a hashtab 4048 * it is added to ht_stack, if it contains a list it is added to 4049 * list_stack. */ 4050 todo = (int)cur_ht->ht_used; 4051 for (hi = cur_ht->ht_array; todo > 0; ++hi) 4052 if (!HASHITEM_EMPTY(hi)) 4053 { 4054 --todo; 4055 abort = abort || set_ref_in_item(&HI2DI(hi)->di_tv, copyID, 4056 &ht_stack, list_stack); 4057 } 4058 } 4059 4060 if (ht_stack == NULL) 4061 break; 4062 4063 /* take an item from the stack */ 4064 cur_ht = ht_stack->ht; 4065 tempitem = ht_stack; 4066 ht_stack = ht_stack->prev; 4067 free(tempitem); 4068 } 4069 4070 return abort; 4071 } 4072 4073 /* 4074 * Mark a dict and its items with "copyID". 4075 * Returns TRUE if setting references failed somehow. 4076 */ 4077 int 4078 set_ref_in_dict(dict_T *d, int copyID) 4079 { 4080 if (d != NULL && d->dv_copyID != copyID) 4081 { 4082 d->dv_copyID = copyID; 4083 return set_ref_in_ht(&d->dv_hashtab, copyID, NULL); 4084 } 4085 return FALSE; 4086 } 4087 4088 /* 4089 * Mark a list and its items with "copyID". 4090 * Returns TRUE if setting references failed somehow. 4091 */ 4092 int 4093 set_ref_in_list(list_T *ll, int copyID) 4094 { 4095 if (ll != NULL && ll->lv_copyID != copyID) 4096 { 4097 ll->lv_copyID = copyID; 4098 return set_ref_in_list_items(ll, copyID, NULL); 4099 } 4100 return FALSE; 4101 } 4102 4103 /* 4104 * Mark all lists and dicts referenced through list "l" with "copyID". 4105 * "ht_stack" is used to add hashtabs to be marked. Can be NULL. 4106 * 4107 * Returns TRUE if setting references failed somehow. 4108 */ 4109 int 4110 set_ref_in_list_items(list_T *l, int copyID, ht_stack_T **ht_stack) 4111 { 4112 listitem_T *li; 4113 int abort = FALSE; 4114 list_T *cur_l; 4115 list_stack_T *list_stack = NULL; 4116 list_stack_T *tempitem; 4117 4118 cur_l = l; 4119 for (;;) 4120 { 4121 if (!abort) 4122 /* Mark each item in the list. If the item contains a hashtab 4123 * it is added to ht_stack, if it contains a list it is added to 4124 * list_stack. */ 4125 for (li = cur_l->lv_first; !abort && li != NULL; li = li->li_next) 4126 abort = abort || set_ref_in_item(&li->li_tv, copyID, 4127 ht_stack, &list_stack); 4128 if (list_stack == NULL) 4129 break; 4130 4131 /* take an item from the stack */ 4132 cur_l = list_stack->list; 4133 tempitem = list_stack; 4134 list_stack = list_stack->prev; 4135 free(tempitem); 4136 } 4137 4138 return abort; 4139 } 4140 4141 /* 4142 * Mark all lists and dicts referenced through typval "tv" with "copyID". 4143 * "list_stack" is used to add lists to be marked. Can be NULL. 4144 * "ht_stack" is used to add hashtabs to be marked. Can be NULL. 4145 * 4146 * Returns TRUE if setting references failed somehow. 4147 */ 4148 int 4149 set_ref_in_item( 4150 typval_T *tv, 4151 int copyID, 4152 ht_stack_T **ht_stack, 4153 list_stack_T **list_stack) 4154 { 4155 int abort = FALSE; 4156 4157 if (tv->v_type == VAR_DICT) 4158 { 4159 dict_T *dd = tv->vval.v_dict; 4160 4161 if (dd != NULL && dd->dv_copyID != copyID) 4162 { 4163 /* Didn't see this dict yet. */ 4164 dd->dv_copyID = copyID; 4165 if (ht_stack == NULL) 4166 { 4167 abort = set_ref_in_ht(&dd->dv_hashtab, copyID, list_stack); 4168 } 4169 else 4170 { 4171 ht_stack_T *newitem = (ht_stack_T*)malloc(sizeof(ht_stack_T)); 4172 if (newitem == NULL) 4173 abort = TRUE; 4174 else 4175 { 4176 newitem->ht = &dd->dv_hashtab; 4177 newitem->prev = *ht_stack; 4178 *ht_stack = newitem; 4179 } 4180 } 4181 } 4182 } 4183 else if (tv->v_type == VAR_LIST) 4184 { 4185 list_T *ll = tv->vval.v_list; 4186 4187 if (ll != NULL && ll->lv_copyID != copyID) 4188 { 4189 /* Didn't see this list yet. */ 4190 ll->lv_copyID = copyID; 4191 if (list_stack == NULL) 4192 { 4193 abort = set_ref_in_list_items(ll, copyID, ht_stack); 4194 } 4195 else 4196 { 4197 list_stack_T *newitem = (list_stack_T*)malloc( 4198 sizeof(list_stack_T)); 4199 if (newitem == NULL) 4200 abort = TRUE; 4201 else 4202 { 4203 newitem->list = ll; 4204 newitem->prev = *list_stack; 4205 *list_stack = newitem; 4206 } 4207 } 4208 } 4209 } 4210 else if (tv->v_type == VAR_FUNC) 4211 { 4212 abort = set_ref_in_func(tv->vval.v_string, NULL, copyID); 4213 } 4214 else if (tv->v_type == VAR_PARTIAL) 4215 { 4216 partial_T *pt = tv->vval.v_partial; 4217 int i; 4218 4219 /* A partial does not have a copyID, because it cannot contain itself. 4220 */ 4221 if (pt != NULL) 4222 { 4223 abort = set_ref_in_func(pt->pt_name, pt->pt_func, copyID); 4224 4225 if (pt->pt_dict != NULL) 4226 { 4227 typval_T dtv; 4228 4229 dtv.v_type = VAR_DICT; 4230 dtv.vval.v_dict = pt->pt_dict; 4231 set_ref_in_item(&dtv, copyID, ht_stack, list_stack); 4232 } 4233 4234 for (i = 0; i < pt->pt_argc; ++i) 4235 abort = abort || set_ref_in_item(&pt->pt_argv[i], copyID, 4236 ht_stack, list_stack); 4237 } 4238 } 4239 #ifdef FEAT_JOB_CHANNEL 4240 else if (tv->v_type == VAR_JOB) 4241 { 4242 job_T *job = tv->vval.v_job; 4243 typval_T dtv; 4244 4245 if (job != NULL && job->jv_copyID != copyID) 4246 { 4247 job->jv_copyID = copyID; 4248 if (job->jv_channel != NULL) 4249 { 4250 dtv.v_type = VAR_CHANNEL; 4251 dtv.vval.v_channel = job->jv_channel; 4252 set_ref_in_item(&dtv, copyID, ht_stack, list_stack); 4253 } 4254 if (job->jv_exit_cb.cb_partial != NULL) 4255 { 4256 dtv.v_type = VAR_PARTIAL; 4257 dtv.vval.v_partial = job->jv_exit_cb.cb_partial; 4258 set_ref_in_item(&dtv, copyID, ht_stack, list_stack); 4259 } 4260 } 4261 } 4262 else if (tv->v_type == VAR_CHANNEL) 4263 { 4264 channel_T *ch =tv->vval.v_channel; 4265 ch_part_T part; 4266 typval_T dtv; 4267 jsonq_T *jq; 4268 cbq_T *cq; 4269 4270 if (ch != NULL && ch->ch_copyID != copyID) 4271 { 4272 ch->ch_copyID = copyID; 4273 for (part = PART_SOCK; part < PART_COUNT; ++part) 4274 { 4275 for (jq = ch->ch_part[part].ch_json_head.jq_next; jq != NULL; 4276 jq = jq->jq_next) 4277 set_ref_in_item(jq->jq_value, copyID, ht_stack, list_stack); 4278 for (cq = ch->ch_part[part].ch_cb_head.cq_next; cq != NULL; 4279 cq = cq->cq_next) 4280 if (cq->cq_callback.cb_partial != NULL) 4281 { 4282 dtv.v_type = VAR_PARTIAL; 4283 dtv.vval.v_partial = cq->cq_callback.cb_partial; 4284 set_ref_in_item(&dtv, copyID, ht_stack, list_stack); 4285 } 4286 if (ch->ch_part[part].ch_callback.cb_partial != NULL) 4287 { 4288 dtv.v_type = VAR_PARTIAL; 4289 dtv.vval.v_partial = 4290 ch->ch_part[part].ch_callback.cb_partial; 4291 set_ref_in_item(&dtv, copyID, ht_stack, list_stack); 4292 } 4293 } 4294 if (ch->ch_callback.cb_partial != NULL) 4295 { 4296 dtv.v_type = VAR_PARTIAL; 4297 dtv.vval.v_partial = ch->ch_callback.cb_partial; 4298 set_ref_in_item(&dtv, copyID, ht_stack, list_stack); 4299 } 4300 if (ch->ch_close_cb.cb_partial != NULL) 4301 { 4302 dtv.v_type = VAR_PARTIAL; 4303 dtv.vval.v_partial = ch->ch_close_cb.cb_partial; 4304 set_ref_in_item(&dtv, copyID, ht_stack, list_stack); 4305 } 4306 } 4307 } 4308 #endif 4309 return abort; 4310 } 4311 4312 /* 4313 * Return a string with the string representation of a variable. 4314 * If the memory is allocated "tofree" is set to it, otherwise NULL. 4315 * "numbuf" is used for a number. 4316 * When "copyID" is not NULL replace recursive lists and dicts with "...". 4317 * When both "echo_style" and "composite_val" are FALSE, put quotes around 4318 * stings as "string()", otherwise does not put quotes around strings, as 4319 * ":echo" displays values. 4320 * When "restore_copyID" is FALSE, repeated items in dictionaries and lists 4321 * are replaced with "...". 4322 * May return NULL. 4323 */ 4324 char_u * 4325 echo_string_core( 4326 typval_T *tv, 4327 char_u **tofree, 4328 char_u *numbuf, 4329 int copyID, 4330 int echo_style, 4331 int restore_copyID, 4332 int composite_val) 4333 { 4334 static int recurse = 0; 4335 char_u *r = NULL; 4336 4337 if (recurse >= DICT_MAXNEST) 4338 { 4339 if (!did_echo_string_emsg) 4340 { 4341 /* Only give this message once for a recursive call to avoid 4342 * flooding the user with errors. And stop iterating over lists 4343 * and dicts. */ 4344 did_echo_string_emsg = TRUE; 4345 emsg(_("E724: variable nested too deep for displaying")); 4346 } 4347 *tofree = NULL; 4348 return (char_u *)"{E724}"; 4349 } 4350 ++recurse; 4351 4352 switch (tv->v_type) 4353 { 4354 case VAR_STRING: 4355 if (echo_style && !composite_val) 4356 { 4357 *tofree = NULL; 4358 r = tv->vval.v_string; 4359 if (r == NULL) 4360 r = (char_u *)""; 4361 } 4362 else 4363 { 4364 *tofree = string_quote(tv->vval.v_string, FALSE); 4365 r = *tofree; 4366 } 4367 break; 4368 4369 case VAR_FUNC: 4370 if (echo_style) 4371 { 4372 *tofree = NULL; 4373 r = tv->vval.v_string; 4374 } 4375 else 4376 { 4377 *tofree = string_quote(tv->vval.v_string, TRUE); 4378 r = *tofree; 4379 } 4380 break; 4381 4382 case VAR_PARTIAL: 4383 { 4384 partial_T *pt = tv->vval.v_partial; 4385 char_u *fname = string_quote(pt == NULL ? NULL 4386 : partial_name(pt), FALSE); 4387 garray_T ga; 4388 int i; 4389 char_u *tf; 4390 4391 ga_init2(&ga, 1, 100); 4392 ga_concat(&ga, (char_u *)"function("); 4393 if (fname != NULL) 4394 { 4395 ga_concat(&ga, fname); 4396 vim_free(fname); 4397 } 4398 if (pt != NULL && pt->pt_argc > 0) 4399 { 4400 ga_concat(&ga, (char_u *)", ["); 4401 for (i = 0; i < pt->pt_argc; ++i) 4402 { 4403 if (i > 0) 4404 ga_concat(&ga, (char_u *)", "); 4405 ga_concat(&ga, 4406 tv2string(&pt->pt_argv[i], &tf, numbuf, copyID)); 4407 vim_free(tf); 4408 } 4409 ga_concat(&ga, (char_u *)"]"); 4410 } 4411 if (pt != NULL && pt->pt_dict != NULL) 4412 { 4413 typval_T dtv; 4414 4415 ga_concat(&ga, (char_u *)", "); 4416 dtv.v_type = VAR_DICT; 4417 dtv.vval.v_dict = pt->pt_dict; 4418 ga_concat(&ga, tv2string(&dtv, &tf, numbuf, copyID)); 4419 vim_free(tf); 4420 } 4421 ga_concat(&ga, (char_u *)")"); 4422 4423 *tofree = ga.ga_data; 4424 r = *tofree; 4425 break; 4426 } 4427 4428 case VAR_BLOB: 4429 r = blob2string(tv->vval.v_blob, tofree, numbuf); 4430 break; 4431 4432 case VAR_LIST: 4433 if (tv->vval.v_list == NULL) 4434 { 4435 *tofree = NULL; 4436 r = NULL; 4437 } 4438 else if (copyID != 0 && tv->vval.v_list->lv_copyID == copyID 4439 && tv->vval.v_list->lv_len > 0) 4440 { 4441 *tofree = NULL; 4442 r = (char_u *)"[...]"; 4443 } 4444 else 4445 { 4446 int old_copyID = tv->vval.v_list->lv_copyID; 4447 4448 tv->vval.v_list->lv_copyID = copyID; 4449 *tofree = list2string(tv, copyID, restore_copyID); 4450 if (restore_copyID) 4451 tv->vval.v_list->lv_copyID = old_copyID; 4452 r = *tofree; 4453 } 4454 break; 4455 4456 case VAR_DICT: 4457 if (tv->vval.v_dict == NULL) 4458 { 4459 *tofree = NULL; 4460 r = NULL; 4461 } 4462 else if (copyID != 0 && tv->vval.v_dict->dv_copyID == copyID 4463 && tv->vval.v_dict->dv_hashtab.ht_used != 0) 4464 { 4465 *tofree = NULL; 4466 r = (char_u *)"{...}"; 4467 } 4468 else 4469 { 4470 int old_copyID = tv->vval.v_dict->dv_copyID; 4471 tv->vval.v_dict->dv_copyID = copyID; 4472 *tofree = dict2string(tv, copyID, restore_copyID); 4473 if (restore_copyID) 4474 tv->vval.v_dict->dv_copyID = old_copyID; 4475 r = *tofree; 4476 } 4477 break; 4478 4479 case VAR_NUMBER: 4480 case VAR_UNKNOWN: 4481 *tofree = NULL; 4482 r = tv_get_string_buf(tv, numbuf); 4483 break; 4484 4485 case VAR_JOB: 4486 case VAR_CHANNEL: 4487 *tofree = NULL; 4488 r = tv_get_string_buf(tv, numbuf); 4489 if (composite_val) 4490 { 4491 *tofree = string_quote(r, FALSE); 4492 r = *tofree; 4493 } 4494 break; 4495 4496 case VAR_FLOAT: 4497 #ifdef FEAT_FLOAT 4498 *tofree = NULL; 4499 vim_snprintf((char *)numbuf, NUMBUFLEN, "%g", tv->vval.v_float); 4500 r = numbuf; 4501 break; 4502 #endif 4503 4504 case VAR_SPECIAL: 4505 *tofree = NULL; 4506 r = (char_u *)get_var_special_name(tv->vval.v_number); 4507 break; 4508 } 4509 4510 if (--recurse == 0) 4511 did_echo_string_emsg = FALSE; 4512 return r; 4513 } 4514 4515 /* 4516 * Return a string with the string representation of a variable. 4517 * If the memory is allocated "tofree" is set to it, otherwise NULL. 4518 * "numbuf" is used for a number. 4519 * Does not put quotes around strings, as ":echo" displays values. 4520 * When "copyID" is not NULL replace recursive lists and dicts with "...". 4521 * May return NULL. 4522 */ 4523 char_u * 4524 echo_string( 4525 typval_T *tv, 4526 char_u **tofree, 4527 char_u *numbuf, 4528 int copyID) 4529 { 4530 return echo_string_core(tv, tofree, numbuf, copyID, TRUE, FALSE, FALSE); 4531 } 4532 4533 /* 4534 * Return a string with the string representation of a variable. 4535 * If the memory is allocated "tofree" is set to it, otherwise NULL. 4536 * "numbuf" is used for a number. 4537 * Puts quotes around strings, so that they can be parsed back by eval(). 4538 * May return NULL. 4539 */ 4540 char_u * 4541 tv2string( 4542 typval_T *tv, 4543 char_u **tofree, 4544 char_u *numbuf, 4545 int copyID) 4546 { 4547 return echo_string_core(tv, tofree, numbuf, copyID, FALSE, TRUE, FALSE); 4548 } 4549 4550 /* 4551 * Return string "str" in ' quotes, doubling ' characters. 4552 * If "str" is NULL an empty string is assumed. 4553 * If "function" is TRUE make it function('string'). 4554 */ 4555 char_u * 4556 string_quote(char_u *str, int function) 4557 { 4558 unsigned len; 4559 char_u *p, *r, *s; 4560 4561 len = (function ? 13 : 3); 4562 if (str != NULL) 4563 { 4564 len += (unsigned)STRLEN(str); 4565 for (p = str; *p != NUL; MB_PTR_ADV(p)) 4566 if (*p == '\'') 4567 ++len; 4568 } 4569 s = r = alloc(len); 4570 if (r != NULL) 4571 { 4572 if (function) 4573 { 4574 STRCPY(r, "function('"); 4575 r += 10; 4576 } 4577 else 4578 *r++ = '\''; 4579 if (str != NULL) 4580 for (p = str; *p != NUL; ) 4581 { 4582 if (*p == '\'') 4583 *r++ = '\''; 4584 MB_COPY_CHAR(p, r); 4585 } 4586 *r++ = '\''; 4587 if (function) 4588 *r++ = ')'; 4589 *r++ = NUL; 4590 } 4591 return s; 4592 } 4593 4594 #if defined(FEAT_FLOAT) || defined(PROTO) 4595 /* 4596 * Convert the string "text" to a floating point number. 4597 * This uses strtod(). setlocale(LC_NUMERIC, "C") has been used to make sure 4598 * this always uses a decimal point. 4599 * Returns the length of the text that was consumed. 4600 */ 4601 int 4602 string2float( 4603 char_u *text, 4604 float_T *value) /* result stored here */ 4605 { 4606 char *s = (char *)text; 4607 float_T f; 4608 4609 /* MS-Windows does not deal with "inf" and "nan" properly. */ 4610 if (STRNICMP(text, "inf", 3) == 0) 4611 { 4612 *value = INFINITY; 4613 return 3; 4614 } 4615 if (STRNICMP(text, "-inf", 3) == 0) 4616 { 4617 *value = -INFINITY; 4618 return 4; 4619 } 4620 if (STRNICMP(text, "nan", 3) == 0) 4621 { 4622 *value = NAN; 4623 return 3; 4624 } 4625 f = strtod(s, &s); 4626 *value = f; 4627 return (int)((char_u *)s - text); 4628 } 4629 #endif 4630 4631 /* 4632 * Get the value of an environment variable. 4633 * "arg" is pointing to the '$'. It is advanced to after the name. 4634 * If the environment variable was not set, silently assume it is empty. 4635 * Return FAIL if the name is invalid. 4636 */ 4637 static int 4638 get_env_tv(char_u **arg, typval_T *rettv, int evaluate) 4639 { 4640 char_u *string = NULL; 4641 int len; 4642 int cc; 4643 char_u *name; 4644 int mustfree = FALSE; 4645 4646 ++*arg; 4647 name = *arg; 4648 len = get_env_len(arg); 4649 if (evaluate) 4650 { 4651 if (len == 0) 4652 return FAIL; /* invalid empty name */ 4653 4654 cc = name[len]; 4655 name[len] = NUL; 4656 /* first try vim_getenv(), fast for normal environment vars */ 4657 string = vim_getenv(name, &mustfree); 4658 if (string != NULL && *string != NUL) 4659 { 4660 if (!mustfree) 4661 string = vim_strsave(string); 4662 } 4663 else 4664 { 4665 if (mustfree) 4666 vim_free(string); 4667 4668 /* next try expanding things like $VIM and ${HOME} */ 4669 string = expand_env_save(name - 1); 4670 if (string != NULL && *string == '$') 4671 VIM_CLEAR(string); 4672 } 4673 name[len] = cc; 4674 4675 rettv->v_type = VAR_STRING; 4676 rettv->vval.v_string = string; 4677 } 4678 4679 return OK; 4680 } 4681 4682 /* 4683 * Translate a String variable into a position. 4684 * Returns NULL when there is an error. 4685 */ 4686 pos_T * 4687 var2fpos( 4688 typval_T *varp, 4689 int dollar_lnum, /* TRUE when $ is last line */ 4690 int *fnum) /* set to fnum for '0, 'A, etc. */ 4691 { 4692 char_u *name; 4693 static pos_T pos; 4694 pos_T *pp; 4695 4696 /* Argument can be [lnum, col, coladd]. */ 4697 if (varp->v_type == VAR_LIST) 4698 { 4699 list_T *l; 4700 int len; 4701 int error = FALSE; 4702 listitem_T *li; 4703 4704 l = varp->vval.v_list; 4705 if (l == NULL) 4706 return NULL; 4707 4708 /* Get the line number */ 4709 pos.lnum = list_find_nr(l, 0L, &error); 4710 if (error || pos.lnum <= 0 || pos.lnum > curbuf->b_ml.ml_line_count) 4711 return NULL; /* invalid line number */ 4712 4713 /* Get the column number */ 4714 pos.col = list_find_nr(l, 1L, &error); 4715 if (error) 4716 return NULL; 4717 len = (long)STRLEN(ml_get(pos.lnum)); 4718 4719 /* We accept "$" for the column number: last column. */ 4720 li = list_find(l, 1L); 4721 if (li != NULL && li->li_tv.v_type == VAR_STRING 4722 && li->li_tv.vval.v_string != NULL 4723 && STRCMP(li->li_tv.vval.v_string, "$") == 0) 4724 pos.col = len + 1; 4725 4726 /* Accept a position up to the NUL after the line. */ 4727 if (pos.col == 0 || (int)pos.col > len + 1) 4728 return NULL; /* invalid column number */ 4729 --pos.col; 4730 4731 /* Get the virtual offset. Defaults to zero. */ 4732 pos.coladd = list_find_nr(l, 2L, &error); 4733 if (error) 4734 pos.coladd = 0; 4735 4736 return &pos; 4737 } 4738 4739 name = tv_get_string_chk(varp); 4740 if (name == NULL) 4741 return NULL; 4742 if (name[0] == '.') /* cursor */ 4743 return &curwin->w_cursor; 4744 if (name[0] == 'v' && name[1] == NUL) /* Visual start */ 4745 { 4746 if (VIsual_active) 4747 return &VIsual; 4748 return &curwin->w_cursor; 4749 } 4750 if (name[0] == '\'') /* mark */ 4751 { 4752 pp = getmark_buf_fnum(curbuf, name[1], FALSE, fnum); 4753 if (pp == NULL || pp == (pos_T *)-1 || pp->lnum <= 0) 4754 return NULL; 4755 return pp; 4756 } 4757 4758 pos.coladd = 0; 4759 4760 if (name[0] == 'w' && dollar_lnum) 4761 { 4762 pos.col = 0; 4763 if (name[1] == '0') /* "w0": first visible line */ 4764 { 4765 update_topline(); 4766 /* In silent Ex mode topline is zero, but that's not a valid line 4767 * number; use one instead. */ 4768 pos.lnum = curwin->w_topline > 0 ? curwin->w_topline : 1; 4769 return &pos; 4770 } 4771 else if (name[1] == '$') /* "w$": last visible line */ 4772 { 4773 validate_botline(); 4774 /* In silent Ex mode botline is zero, return zero then. */ 4775 pos.lnum = curwin->w_botline > 0 ? curwin->w_botline - 1 : 0; 4776 return &pos; 4777 } 4778 } 4779 else if (name[0] == '$') /* last column or line */ 4780 { 4781 if (dollar_lnum) 4782 { 4783 pos.lnum = curbuf->b_ml.ml_line_count; 4784 pos.col = 0; 4785 } 4786 else 4787 { 4788 pos.lnum = curwin->w_cursor.lnum; 4789 pos.col = (colnr_T)STRLEN(ml_get_curline()); 4790 } 4791 return &pos; 4792 } 4793 return NULL; 4794 } 4795 4796 /* 4797 * Convert list in "arg" into a position and optional file number. 4798 * When "fnump" is NULL there is no file number, only 3 items. 4799 * Note that the column is passed on as-is, the caller may want to decrement 4800 * it to use 1 for the first column. 4801 * Return FAIL when conversion is not possible, doesn't check the position for 4802 * validity. 4803 */ 4804 int 4805 list2fpos( 4806 typval_T *arg, 4807 pos_T *posp, 4808 int *fnump, 4809 colnr_T *curswantp) 4810 { 4811 list_T *l = arg->vval.v_list; 4812 long i = 0; 4813 long n; 4814 4815 /* List must be: [fnum, lnum, col, coladd, curswant], where "fnum" is only 4816 * there when "fnump" isn't NULL; "coladd" and "curswant" are optional. */ 4817 if (arg->v_type != VAR_LIST 4818 || l == NULL 4819 || l->lv_len < (fnump == NULL ? 2 : 3) 4820 || l->lv_len > (fnump == NULL ? 4 : 5)) 4821 return FAIL; 4822 4823 if (fnump != NULL) 4824 { 4825 n = list_find_nr(l, i++, NULL); /* fnum */ 4826 if (n < 0) 4827 return FAIL; 4828 if (n == 0) 4829 n = curbuf->b_fnum; /* current buffer */ 4830 *fnump = n; 4831 } 4832 4833 n = list_find_nr(l, i++, NULL); /* lnum */ 4834 if (n < 0) 4835 return FAIL; 4836 posp->lnum = n; 4837 4838 n = list_find_nr(l, i++, NULL); /* col */ 4839 if (n < 0) 4840 return FAIL; 4841 posp->col = n; 4842 4843 n = list_find_nr(l, i, NULL); /* off */ 4844 if (n < 0) 4845 posp->coladd = 0; 4846 else 4847 posp->coladd = n; 4848 4849 if (curswantp != NULL) 4850 *curswantp = list_find_nr(l, i + 1, NULL); /* curswant */ 4851 4852 return OK; 4853 } 4854 4855 /* 4856 * Get the length of an environment variable name. 4857 * Advance "arg" to the first character after the name. 4858 * Return 0 for error. 4859 */ 4860 int 4861 get_env_len(char_u **arg) 4862 { 4863 char_u *p; 4864 int len; 4865 4866 for (p = *arg; vim_isIDc(*p); ++p) 4867 ; 4868 if (p == *arg) /* no name found */ 4869 return 0; 4870 4871 len = (int)(p - *arg); 4872 *arg = p; 4873 return len; 4874 } 4875 4876 /* 4877 * Get the length of the name of a function or internal variable. 4878 * "arg" is advanced to the first non-white character after the name. 4879 * Return 0 if something is wrong. 4880 */ 4881 int 4882 get_id_len(char_u **arg) 4883 { 4884 char_u *p; 4885 int len; 4886 4887 /* Find the end of the name. */ 4888 for (p = *arg; eval_isnamec(*p); ++p) 4889 { 4890 if (*p == ':') 4891 { 4892 /* "s:" is start of "s:var", but "n:" is not and can be used in 4893 * slice "[n:]". Also "xx:" is not a namespace. */ 4894 len = (int)(p - *arg); 4895 if ((len == 1 && vim_strchr(NAMESPACE_CHAR, **arg) == NULL) 4896 || len > 1) 4897 break; 4898 } 4899 } 4900 if (p == *arg) /* no name found */ 4901 return 0; 4902 4903 len = (int)(p - *arg); 4904 *arg = skipwhite(p); 4905 4906 return len; 4907 } 4908 4909 /* 4910 * Get the length of the name of a variable or function. 4911 * Only the name is recognized, does not handle ".key" or "[idx]". 4912 * "arg" is advanced to the first non-white character after the name. 4913 * Return -1 if curly braces expansion failed. 4914 * Return 0 if something else is wrong. 4915 * If the name contains 'magic' {}'s, expand them and return the 4916 * expanded name in an allocated string via 'alias' - caller must free. 4917 */ 4918 int 4919 get_name_len( 4920 char_u **arg, 4921 char_u **alias, 4922 int evaluate, 4923 int verbose) 4924 { 4925 int len; 4926 char_u *p; 4927 char_u *expr_start; 4928 char_u *expr_end; 4929 4930 *alias = NULL; /* default to no alias */ 4931 4932 if ((*arg)[0] == K_SPECIAL && (*arg)[1] == KS_EXTRA 4933 && (*arg)[2] == (int)KE_SNR) 4934 { 4935 /* hard coded <SNR>, already translated */ 4936 *arg += 3; 4937 return get_id_len(arg) + 3; 4938 } 4939 len = eval_fname_script(*arg); 4940 if (len > 0) 4941 { 4942 /* literal "<SID>", "s:" or "<SNR>" */ 4943 *arg += len; 4944 } 4945 4946 /* 4947 * Find the end of the name; check for {} construction. 4948 */ 4949 p = find_name_end(*arg, &expr_start, &expr_end, 4950 len > 0 ? 0 : FNE_CHECK_START); 4951 if (expr_start != NULL) 4952 { 4953 char_u *temp_string; 4954 4955 if (!evaluate) 4956 { 4957 len += (int)(p - *arg); 4958 *arg = skipwhite(p); 4959 return len; 4960 } 4961 4962 /* 4963 * Include any <SID> etc in the expanded string: 4964 * Thus the -len here. 4965 */ 4966 temp_string = make_expanded_name(*arg - len, expr_start, expr_end, p); 4967 if (temp_string == NULL) 4968 return -1; 4969 *alias = temp_string; 4970 *arg = skipwhite(p); 4971 return (int)STRLEN(temp_string); 4972 } 4973 4974 len += get_id_len(arg); 4975 // Only give an error when there is something, otherwise it will be 4976 // reported at a higher level. 4977 if (len == 0 && verbose && **arg != NUL) 4978 semsg(_(e_invexpr2), *arg); 4979 4980 return len; 4981 } 4982 4983 /* 4984 * Find the end of a variable or function name, taking care of magic braces. 4985 * If "expr_start" is not NULL then "expr_start" and "expr_end" are set to the 4986 * start and end of the first magic braces item. 4987 * "flags" can have FNE_INCL_BR and FNE_CHECK_START. 4988 * Return a pointer to just after the name. Equal to "arg" if there is no 4989 * valid name. 4990 */ 4991 char_u * 4992 find_name_end( 4993 char_u *arg, 4994 char_u **expr_start, 4995 char_u **expr_end, 4996 int flags) 4997 { 4998 int mb_nest = 0; 4999 int br_nest = 0; 5000 char_u *p; 5001 int len; 5002 5003 if (expr_start != NULL) 5004 { 5005 *expr_start = NULL; 5006 *expr_end = NULL; 5007 } 5008 5009 /* Quick check for valid starting character. */ 5010 if ((flags & FNE_CHECK_START) && !eval_isnamec1(*arg) && *arg != '{') 5011 return arg; 5012 5013 for (p = arg; *p != NUL 5014 && (eval_isnamec(*p) 5015 || *p == '{' 5016 || ((flags & FNE_INCL_BR) && (*p == '[' || *p == '.')) 5017 || mb_nest != 0 5018 || br_nest != 0); MB_PTR_ADV(p)) 5019 { 5020 if (*p == '\'') 5021 { 5022 /* skip over 'string' to avoid counting [ and ] inside it. */ 5023 for (p = p + 1; *p != NUL && *p != '\''; MB_PTR_ADV(p)) 5024 ; 5025 if (*p == NUL) 5026 break; 5027 } 5028 else if (*p == '"') 5029 { 5030 /* skip over "str\"ing" to avoid counting [ and ] inside it. */ 5031 for (p = p + 1; *p != NUL && *p != '"'; MB_PTR_ADV(p)) 5032 if (*p == '\\' && p[1] != NUL) 5033 ++p; 5034 if (*p == NUL) 5035 break; 5036 } 5037 else if (br_nest == 0 && mb_nest == 0 && *p == ':') 5038 { 5039 /* "s:" is start of "s:var", but "n:" is not and can be used in 5040 * slice "[n:]". Also "xx:" is not a namespace. But {ns}: is. */ 5041 len = (int)(p - arg); 5042 if ((len == 1 && vim_strchr(NAMESPACE_CHAR, *arg) == NULL) 5043 || (len > 1 && p[-1] != '}')) 5044 break; 5045 } 5046 5047 if (mb_nest == 0) 5048 { 5049 if (*p == '[') 5050 ++br_nest; 5051 else if (*p == ']') 5052 --br_nest; 5053 } 5054 5055 if (br_nest == 0) 5056 { 5057 if (*p == '{') 5058 { 5059 mb_nest++; 5060 if (expr_start != NULL && *expr_start == NULL) 5061 *expr_start = p; 5062 } 5063 else if (*p == '}') 5064 { 5065 mb_nest--; 5066 if (expr_start != NULL && mb_nest == 0 && *expr_end == NULL) 5067 *expr_end = p; 5068 } 5069 } 5070 } 5071 5072 return p; 5073 } 5074 5075 /* 5076 * Expands out the 'magic' {}'s in a variable/function name. 5077 * Note that this can call itself recursively, to deal with 5078 * constructs like foo{bar}{baz}{bam} 5079 * The four pointer arguments point to "foo{expre}ss{ion}bar" 5080 * "in_start" ^ 5081 * "expr_start" ^ 5082 * "expr_end" ^ 5083 * "in_end" ^ 5084 * 5085 * Returns a new allocated string, which the caller must free. 5086 * Returns NULL for failure. 5087 */ 5088 static char_u * 5089 make_expanded_name( 5090 char_u *in_start, 5091 char_u *expr_start, 5092 char_u *expr_end, 5093 char_u *in_end) 5094 { 5095 char_u c1; 5096 char_u *retval = NULL; 5097 char_u *temp_result; 5098 char_u *nextcmd = NULL; 5099 5100 if (expr_end == NULL || in_end == NULL) 5101 return NULL; 5102 *expr_start = NUL; 5103 *expr_end = NUL; 5104 c1 = *in_end; 5105 *in_end = NUL; 5106 5107 temp_result = eval_to_string(expr_start + 1, &nextcmd, FALSE); 5108 if (temp_result != NULL && nextcmd == NULL) 5109 { 5110 retval = alloc(STRLEN(temp_result) + (expr_start - in_start) 5111 + (in_end - expr_end) + 1); 5112 if (retval != NULL) 5113 { 5114 STRCPY(retval, in_start); 5115 STRCAT(retval, temp_result); 5116 STRCAT(retval, expr_end + 1); 5117 } 5118 } 5119 vim_free(temp_result); 5120 5121 *in_end = c1; /* put char back for error messages */ 5122 *expr_start = '{'; 5123 *expr_end = '}'; 5124 5125 if (retval != NULL) 5126 { 5127 temp_result = find_name_end(retval, &expr_start, &expr_end, 0); 5128 if (expr_start != NULL) 5129 { 5130 /* Further expansion! */ 5131 temp_result = make_expanded_name(retval, expr_start, 5132 expr_end, temp_result); 5133 vim_free(retval); 5134 retval = temp_result; 5135 } 5136 } 5137 5138 return retval; 5139 } 5140 5141 /* 5142 * Return TRUE if character "c" can be used in a variable or function name. 5143 * Does not include '{' or '}' for magic braces. 5144 */ 5145 int 5146 eval_isnamec(int c) 5147 { 5148 return (ASCII_ISALNUM(c) || c == '_' || c == ':' || c == AUTOLOAD_CHAR); 5149 } 5150 5151 /* 5152 * Return TRUE if character "c" can be used as the first character in a 5153 * variable or function name (excluding '{' and '}'). 5154 */ 5155 int 5156 eval_isnamec1(int c) 5157 { 5158 return (ASCII_ISALPHA(c) || c == '_'); 5159 } 5160 5161 /* 5162 * Handle: 5163 * - expr[expr], expr[expr:expr] subscript 5164 * - ".name" lookup 5165 * - function call with Funcref variable: func(expr) 5166 * - method call: var->method() 5167 * 5168 * Can all be combined in any order: dict.func(expr)[idx]['func'](expr)->len() 5169 */ 5170 int 5171 handle_subscript( 5172 char_u **arg, 5173 typval_T *rettv, 5174 int evaluate, // do more than finding the end 5175 int verbose, // give error messages 5176 char_u *start_leader, // start of '!' and '-' prefixes 5177 char_u **end_leaderp) // end of '!' and '-' prefixes 5178 { 5179 int ret = OK; 5180 dict_T *selfdict = NULL; 5181 5182 // "." is ".name" lookup when we found a dict or when evaluating and 5183 // scriptversion is at least 2, where string concatenation is "..". 5184 while (ret == OK 5185 && (((**arg == '[' 5186 || (**arg == '.' && (rettv->v_type == VAR_DICT 5187 || (!evaluate 5188 && (*arg)[1] != '.' 5189 && current_sctx.sc_version >= 2))) 5190 || (**arg == '(' && (!evaluate || rettv->v_type == VAR_FUNC 5191 || rettv->v_type == VAR_PARTIAL))) 5192 && !VIM_ISWHITE(*(*arg - 1))) 5193 || (**arg == '-' && (*arg)[1] == '>'))) 5194 { 5195 if (**arg == '(') 5196 { 5197 ret = call_func_rettv(arg, rettv, evaluate, selfdict, NULL); 5198 5199 // Stop the expression evaluation when immediately aborting on 5200 // error, or when an interrupt occurred or an exception was thrown 5201 // but not caught. 5202 if (aborting()) 5203 { 5204 if (ret == OK) 5205 clear_tv(rettv); 5206 ret = FAIL; 5207 } 5208 dict_unref(selfdict); 5209 selfdict = NULL; 5210 } 5211 else if (**arg == '-') 5212 { 5213 // Expression "-1.0->method()" applies the leader "-" before 5214 // applying ->. 5215 if (evaluate && *end_leaderp > start_leader) 5216 ret = eval7_leader(rettv, start_leader, end_leaderp); 5217 if (ret == OK) 5218 { 5219 if ((*arg)[2] == '{') 5220 // expr->{lambda}() 5221 ret = eval_lambda(arg, rettv, evaluate, verbose); 5222 else 5223 // expr->name() 5224 ret = eval_method(arg, rettv, evaluate, verbose); 5225 } 5226 } 5227 else /* **arg == '[' || **arg == '.' */ 5228 { 5229 dict_unref(selfdict); 5230 if (rettv->v_type == VAR_DICT) 5231 { 5232 selfdict = rettv->vval.v_dict; 5233 if (selfdict != NULL) 5234 ++selfdict->dv_refcount; 5235 } 5236 else 5237 selfdict = NULL; 5238 if (eval_index(arg, rettv, evaluate, verbose) == FAIL) 5239 { 5240 clear_tv(rettv); 5241 ret = FAIL; 5242 } 5243 } 5244 } 5245 5246 /* Turn "dict.Func" into a partial for "Func" bound to "dict". 5247 * Don't do this when "Func" is already a partial that was bound 5248 * explicitly (pt_auto is FALSE). */ 5249 if (selfdict != NULL 5250 && (rettv->v_type == VAR_FUNC 5251 || (rettv->v_type == VAR_PARTIAL 5252 && (rettv->vval.v_partial->pt_auto 5253 || rettv->vval.v_partial->pt_dict == NULL)))) 5254 selfdict = make_partial(selfdict, rettv); 5255 5256 dict_unref(selfdict); 5257 return ret; 5258 } 5259 5260 /* 5261 * Allocate memory for a variable type-value, and make it empty (0 or NULL 5262 * value). 5263 */ 5264 typval_T * 5265 alloc_tv(void) 5266 { 5267 return ALLOC_CLEAR_ONE(typval_T); 5268 } 5269 5270 /* 5271 * Allocate memory for a variable type-value, and assign a string to it. 5272 * The string "s" must have been allocated, it is consumed. 5273 * Return NULL for out of memory, the variable otherwise. 5274 */ 5275 typval_T * 5276 alloc_string_tv(char_u *s) 5277 { 5278 typval_T *rettv; 5279 5280 rettv = alloc_tv(); 5281 if (rettv != NULL) 5282 { 5283 rettv->v_type = VAR_STRING; 5284 rettv->vval.v_string = s; 5285 } 5286 else 5287 vim_free(s); 5288 return rettv; 5289 } 5290 5291 /* 5292 * Free the memory for a variable type-value. 5293 */ 5294 void 5295 free_tv(typval_T *varp) 5296 { 5297 if (varp != NULL) 5298 { 5299 switch (varp->v_type) 5300 { 5301 case VAR_FUNC: 5302 func_unref(varp->vval.v_string); 5303 /* FALLTHROUGH */ 5304 case VAR_STRING: 5305 vim_free(varp->vval.v_string); 5306 break; 5307 case VAR_PARTIAL: 5308 partial_unref(varp->vval.v_partial); 5309 break; 5310 case VAR_BLOB: 5311 blob_unref(varp->vval.v_blob); 5312 break; 5313 case VAR_LIST: 5314 list_unref(varp->vval.v_list); 5315 break; 5316 case VAR_DICT: 5317 dict_unref(varp->vval.v_dict); 5318 break; 5319 case VAR_JOB: 5320 #ifdef FEAT_JOB_CHANNEL 5321 job_unref(varp->vval.v_job); 5322 break; 5323 #endif 5324 case VAR_CHANNEL: 5325 #ifdef FEAT_JOB_CHANNEL 5326 channel_unref(varp->vval.v_channel); 5327 break; 5328 #endif 5329 case VAR_NUMBER: 5330 case VAR_FLOAT: 5331 case VAR_UNKNOWN: 5332 case VAR_SPECIAL: 5333 break; 5334 } 5335 vim_free(varp); 5336 } 5337 } 5338 5339 /* 5340 * Free the memory for a variable value and set the value to NULL or 0. 5341 */ 5342 void 5343 clear_tv(typval_T *varp) 5344 { 5345 if (varp != NULL) 5346 { 5347 switch (varp->v_type) 5348 { 5349 case VAR_FUNC: 5350 func_unref(varp->vval.v_string); 5351 /* FALLTHROUGH */ 5352 case VAR_STRING: 5353 VIM_CLEAR(varp->vval.v_string); 5354 break; 5355 case VAR_PARTIAL: 5356 partial_unref(varp->vval.v_partial); 5357 varp->vval.v_partial = NULL; 5358 break; 5359 case VAR_BLOB: 5360 blob_unref(varp->vval.v_blob); 5361 varp->vval.v_blob = NULL; 5362 break; 5363 case VAR_LIST: 5364 list_unref(varp->vval.v_list); 5365 varp->vval.v_list = NULL; 5366 break; 5367 case VAR_DICT: 5368 dict_unref(varp->vval.v_dict); 5369 varp->vval.v_dict = NULL; 5370 break; 5371 case VAR_NUMBER: 5372 case VAR_SPECIAL: 5373 varp->vval.v_number = 0; 5374 break; 5375 case VAR_FLOAT: 5376 #ifdef FEAT_FLOAT 5377 varp->vval.v_float = 0.0; 5378 break; 5379 #endif 5380 case VAR_JOB: 5381 #ifdef FEAT_JOB_CHANNEL 5382 job_unref(varp->vval.v_job); 5383 varp->vval.v_job = NULL; 5384 #endif 5385 break; 5386 case VAR_CHANNEL: 5387 #ifdef FEAT_JOB_CHANNEL 5388 channel_unref(varp->vval.v_channel); 5389 varp->vval.v_channel = NULL; 5390 #endif 5391 case VAR_UNKNOWN: 5392 break; 5393 } 5394 varp->v_lock = 0; 5395 } 5396 } 5397 5398 /* 5399 * Set the value of a variable to NULL without freeing items. 5400 */ 5401 void 5402 init_tv(typval_T *varp) 5403 { 5404 if (varp != NULL) 5405 vim_memset(varp, 0, sizeof(typval_T)); 5406 } 5407 5408 /* 5409 * Get the number value of a variable. 5410 * If it is a String variable, uses vim_str2nr(). 5411 * For incompatible types, return 0. 5412 * tv_get_number_chk() is similar to tv_get_number(), but informs the 5413 * caller of incompatible types: it sets *denote to TRUE if "denote" 5414 * is not NULL or returns -1 otherwise. 5415 */ 5416 varnumber_T 5417 tv_get_number(typval_T *varp) 5418 { 5419 int error = FALSE; 5420 5421 return tv_get_number_chk(varp, &error); /* return 0L on error */ 5422 } 5423 5424 varnumber_T 5425 tv_get_number_chk(typval_T *varp, int *denote) 5426 { 5427 varnumber_T n = 0L; 5428 5429 switch (varp->v_type) 5430 { 5431 case VAR_NUMBER: 5432 return varp->vval.v_number; 5433 case VAR_FLOAT: 5434 #ifdef FEAT_FLOAT 5435 emsg(_("E805: Using a Float as a Number")); 5436 break; 5437 #endif 5438 case VAR_FUNC: 5439 case VAR_PARTIAL: 5440 emsg(_("E703: Using a Funcref as a Number")); 5441 break; 5442 case VAR_STRING: 5443 if (varp->vval.v_string != NULL) 5444 vim_str2nr(varp->vval.v_string, NULL, NULL, 5445 STR2NR_ALL, &n, NULL, 0, FALSE); 5446 return n; 5447 case VAR_LIST: 5448 emsg(_("E745: Using a List as a Number")); 5449 break; 5450 case VAR_DICT: 5451 emsg(_("E728: Using a Dictionary as a Number")); 5452 break; 5453 case VAR_SPECIAL: 5454 return varp->vval.v_number == VVAL_TRUE ? 1 : 0; 5455 break; 5456 case VAR_JOB: 5457 #ifdef FEAT_JOB_CHANNEL 5458 emsg(_("E910: Using a Job as a Number")); 5459 break; 5460 #endif 5461 case VAR_CHANNEL: 5462 #ifdef FEAT_JOB_CHANNEL 5463 emsg(_("E913: Using a Channel as a Number")); 5464 break; 5465 #endif 5466 case VAR_BLOB: 5467 emsg(_("E974: Using a Blob as a Number")); 5468 break; 5469 case VAR_UNKNOWN: 5470 internal_error("tv_get_number(UNKNOWN)"); 5471 break; 5472 } 5473 if (denote == NULL) /* useful for values that must be unsigned */ 5474 n = -1; 5475 else 5476 *denote = TRUE; 5477 return n; 5478 } 5479 5480 #ifdef FEAT_FLOAT 5481 float_T 5482 tv_get_float(typval_T *varp) 5483 { 5484 switch (varp->v_type) 5485 { 5486 case VAR_NUMBER: 5487 return (float_T)(varp->vval.v_number); 5488 case VAR_FLOAT: 5489 return varp->vval.v_float; 5490 case VAR_FUNC: 5491 case VAR_PARTIAL: 5492 emsg(_("E891: Using a Funcref as a Float")); 5493 break; 5494 case VAR_STRING: 5495 emsg(_("E892: Using a String as a Float")); 5496 break; 5497 case VAR_LIST: 5498 emsg(_("E893: Using a List as a Float")); 5499 break; 5500 case VAR_DICT: 5501 emsg(_("E894: Using a Dictionary as a Float")); 5502 break; 5503 case VAR_SPECIAL: 5504 emsg(_("E907: Using a special value as a Float")); 5505 break; 5506 case VAR_JOB: 5507 # ifdef FEAT_JOB_CHANNEL 5508 emsg(_("E911: Using a Job as a Float")); 5509 break; 5510 # endif 5511 case VAR_CHANNEL: 5512 # ifdef FEAT_JOB_CHANNEL 5513 emsg(_("E914: Using a Channel as a Float")); 5514 break; 5515 # endif 5516 case VAR_BLOB: 5517 emsg(_("E975: Using a Blob as a Float")); 5518 break; 5519 case VAR_UNKNOWN: 5520 internal_error("tv_get_float(UNKNOWN)"); 5521 break; 5522 } 5523 return 0; 5524 } 5525 #endif 5526 5527 /* 5528 * Get the string value of a variable. 5529 * If it is a Number variable, the number is converted into a string. 5530 * tv_get_string() uses a single, static buffer. YOU CAN ONLY USE IT ONCE! 5531 * tv_get_string_buf() uses a given buffer. 5532 * If the String variable has never been set, return an empty string. 5533 * Never returns NULL; 5534 * tv_get_string_chk() and tv_get_string_buf_chk() are similar, but return 5535 * NULL on error. 5536 */ 5537 char_u * 5538 tv_get_string(typval_T *varp) 5539 { 5540 static char_u mybuf[NUMBUFLEN]; 5541 5542 return tv_get_string_buf(varp, mybuf); 5543 } 5544 5545 char_u * 5546 tv_get_string_buf(typval_T *varp, char_u *buf) 5547 { 5548 char_u *res = tv_get_string_buf_chk(varp, buf); 5549 5550 return res != NULL ? res : (char_u *)""; 5551 } 5552 5553 /* 5554 * Careful: This uses a single, static buffer. YOU CAN ONLY USE IT ONCE! 5555 */ 5556 char_u * 5557 tv_get_string_chk(typval_T *varp) 5558 { 5559 static char_u mybuf[NUMBUFLEN]; 5560 5561 return tv_get_string_buf_chk(varp, mybuf); 5562 } 5563 5564 char_u * 5565 tv_get_string_buf_chk(typval_T *varp, char_u *buf) 5566 { 5567 switch (varp->v_type) 5568 { 5569 case VAR_NUMBER: 5570 vim_snprintf((char *)buf, NUMBUFLEN, "%lld", 5571 (long_long_T)varp->vval.v_number); 5572 return buf; 5573 case VAR_FUNC: 5574 case VAR_PARTIAL: 5575 emsg(_("E729: using Funcref as a String")); 5576 break; 5577 case VAR_LIST: 5578 emsg(_("E730: using List as a String")); 5579 break; 5580 case VAR_DICT: 5581 emsg(_("E731: using Dictionary as a String")); 5582 break; 5583 case VAR_FLOAT: 5584 #ifdef FEAT_FLOAT 5585 emsg(_(e_float_as_string)); 5586 break; 5587 #endif 5588 case VAR_STRING: 5589 if (varp->vval.v_string != NULL) 5590 return varp->vval.v_string; 5591 return (char_u *)""; 5592 case VAR_SPECIAL: 5593 STRCPY(buf, get_var_special_name(varp->vval.v_number)); 5594 return buf; 5595 case VAR_BLOB: 5596 emsg(_("E976: using Blob as a String")); 5597 break; 5598 case VAR_JOB: 5599 #ifdef FEAT_JOB_CHANNEL 5600 { 5601 job_T *job = varp->vval.v_job; 5602 char *status; 5603 5604 if (job == NULL) 5605 return (char_u *)"no process"; 5606 status = job->jv_status == JOB_FAILED ? "fail" 5607 : job->jv_status >= JOB_ENDED ? "dead" 5608 : "run"; 5609 # ifdef UNIX 5610 vim_snprintf((char *)buf, NUMBUFLEN, 5611 "process %ld %s", (long)job->jv_pid, status); 5612 # elif defined(MSWIN) 5613 vim_snprintf((char *)buf, NUMBUFLEN, 5614 "process %ld %s", 5615 (long)job->jv_proc_info.dwProcessId, 5616 status); 5617 # else 5618 /* fall-back */ 5619 vim_snprintf((char *)buf, NUMBUFLEN, "process ? %s", status); 5620 # endif 5621 return buf; 5622 } 5623 #endif 5624 break; 5625 case VAR_CHANNEL: 5626 #ifdef FEAT_JOB_CHANNEL 5627 { 5628 channel_T *channel = varp->vval.v_channel; 5629 char *status = channel_status(channel, -1); 5630 5631 if (channel == NULL) 5632 vim_snprintf((char *)buf, NUMBUFLEN, "channel %s", status); 5633 else 5634 vim_snprintf((char *)buf, NUMBUFLEN, 5635 "channel %d %s", channel->ch_id, status); 5636 return buf; 5637 } 5638 #endif 5639 break; 5640 case VAR_UNKNOWN: 5641 emsg(_("E908: using an invalid value as a String")); 5642 break; 5643 } 5644 return NULL; 5645 } 5646 5647 /* 5648 * Turn a typeval into a string. Similar to tv_get_string_buf() but uses 5649 * string() on Dict, List, etc. 5650 */ 5651 static char_u * 5652 tv_stringify(typval_T *varp, char_u *buf) 5653 { 5654 if (varp->v_type == VAR_LIST 5655 || varp->v_type == VAR_DICT 5656 || varp->v_type == VAR_FUNC 5657 || varp->v_type == VAR_PARTIAL 5658 || varp->v_type == VAR_FLOAT) 5659 { 5660 typval_T tmp; 5661 5662 f_string(varp, &tmp); 5663 tv_get_string_buf(&tmp, buf); 5664 clear_tv(varp); 5665 *varp = tmp; 5666 return tmp.vval.v_string; 5667 } 5668 return tv_get_string_buf(varp, buf); 5669 } 5670 5671 /* 5672 * Return TRUE if typeval "tv" and its value are set to be locked (immutable). 5673 * Also give an error message, using "name" or _("name") when use_gettext is 5674 * TRUE. 5675 */ 5676 static int 5677 tv_check_lock(typval_T *tv, char_u *name, int use_gettext) 5678 { 5679 int lock = 0; 5680 5681 switch (tv->v_type) 5682 { 5683 case VAR_BLOB: 5684 if (tv->vval.v_blob != NULL) 5685 lock = tv->vval.v_blob->bv_lock; 5686 break; 5687 case VAR_LIST: 5688 if (tv->vval.v_list != NULL) 5689 lock = tv->vval.v_list->lv_lock; 5690 break; 5691 case VAR_DICT: 5692 if (tv->vval.v_dict != NULL) 5693 lock = tv->vval.v_dict->dv_lock; 5694 break; 5695 default: 5696 break; 5697 } 5698 return var_check_lock(tv->v_lock, name, use_gettext) 5699 || (lock != 0 && var_check_lock(lock, name, use_gettext)); 5700 } 5701 5702 /* 5703 * Copy the values from typval_T "from" to typval_T "to". 5704 * When needed allocates string or increases reference count. 5705 * Does not make a copy of a list, blob or dict but copies the reference! 5706 * It is OK for "from" and "to" to point to the same item. This is used to 5707 * make a copy later. 5708 */ 5709 void 5710 copy_tv(typval_T *from, typval_T *to) 5711 { 5712 to->v_type = from->v_type; 5713 to->v_lock = 0; 5714 switch (from->v_type) 5715 { 5716 case VAR_NUMBER: 5717 case VAR_SPECIAL: 5718 to->vval.v_number = from->vval.v_number; 5719 break; 5720 case VAR_FLOAT: 5721 #ifdef FEAT_FLOAT 5722 to->vval.v_float = from->vval.v_float; 5723 break; 5724 #endif 5725 case VAR_JOB: 5726 #ifdef FEAT_JOB_CHANNEL 5727 to->vval.v_job = from->vval.v_job; 5728 if (to->vval.v_job != NULL) 5729 ++to->vval.v_job->jv_refcount; 5730 break; 5731 #endif 5732 case VAR_CHANNEL: 5733 #ifdef FEAT_JOB_CHANNEL 5734 to->vval.v_channel = from->vval.v_channel; 5735 if (to->vval.v_channel != NULL) 5736 ++to->vval.v_channel->ch_refcount; 5737 break; 5738 #endif 5739 case VAR_STRING: 5740 case VAR_FUNC: 5741 if (from->vval.v_string == NULL) 5742 to->vval.v_string = NULL; 5743 else 5744 { 5745 to->vval.v_string = vim_strsave(from->vval.v_string); 5746 if (from->v_type == VAR_FUNC) 5747 func_ref(to->vval.v_string); 5748 } 5749 break; 5750 case VAR_PARTIAL: 5751 if (from->vval.v_partial == NULL) 5752 to->vval.v_partial = NULL; 5753 else 5754 { 5755 to->vval.v_partial = from->vval.v_partial; 5756 ++to->vval.v_partial->pt_refcount; 5757 } 5758 break; 5759 case VAR_BLOB: 5760 if (from->vval.v_blob == NULL) 5761 to->vval.v_blob = NULL; 5762 else 5763 { 5764 to->vval.v_blob = from->vval.v_blob; 5765 ++to->vval.v_blob->bv_refcount; 5766 } 5767 break; 5768 case VAR_LIST: 5769 if (from->vval.v_list == NULL) 5770 to->vval.v_list = NULL; 5771 else 5772 { 5773 to->vval.v_list = from->vval.v_list; 5774 ++to->vval.v_list->lv_refcount; 5775 } 5776 break; 5777 case VAR_DICT: 5778 if (from->vval.v_dict == NULL) 5779 to->vval.v_dict = NULL; 5780 else 5781 { 5782 to->vval.v_dict = from->vval.v_dict; 5783 ++to->vval.v_dict->dv_refcount; 5784 } 5785 break; 5786 case VAR_UNKNOWN: 5787 internal_error("copy_tv(UNKNOWN)"); 5788 break; 5789 } 5790 } 5791 5792 /* 5793 * Make a copy of an item. 5794 * Lists and Dictionaries are also copied. A deep copy if "deep" is set. 5795 * For deepcopy() "copyID" is zero for a full copy or the ID for when a 5796 * reference to an already copied list/dict can be used. 5797 * Returns FAIL or OK. 5798 */ 5799 int 5800 item_copy( 5801 typval_T *from, 5802 typval_T *to, 5803 int deep, 5804 int copyID) 5805 { 5806 static int recurse = 0; 5807 int ret = OK; 5808 5809 if (recurse >= DICT_MAXNEST) 5810 { 5811 emsg(_("E698: variable nested too deep for making a copy")); 5812 return FAIL; 5813 } 5814 ++recurse; 5815 5816 switch (from->v_type) 5817 { 5818 case VAR_NUMBER: 5819 case VAR_FLOAT: 5820 case VAR_STRING: 5821 case VAR_FUNC: 5822 case VAR_PARTIAL: 5823 case VAR_SPECIAL: 5824 case VAR_JOB: 5825 case VAR_CHANNEL: 5826 copy_tv(from, to); 5827 break; 5828 case VAR_LIST: 5829 to->v_type = VAR_LIST; 5830 to->v_lock = 0; 5831 if (from->vval.v_list == NULL) 5832 to->vval.v_list = NULL; 5833 else if (copyID != 0 && from->vval.v_list->lv_copyID == copyID) 5834 { 5835 /* use the copy made earlier */ 5836 to->vval.v_list = from->vval.v_list->lv_copylist; 5837 ++to->vval.v_list->lv_refcount; 5838 } 5839 else 5840 to->vval.v_list = list_copy(from->vval.v_list, deep, copyID); 5841 if (to->vval.v_list == NULL) 5842 ret = FAIL; 5843 break; 5844 case VAR_BLOB: 5845 ret = blob_copy(from, to); 5846 break; 5847 case VAR_DICT: 5848 to->v_type = VAR_DICT; 5849 to->v_lock = 0; 5850 if (from->vval.v_dict == NULL) 5851 to->vval.v_dict = NULL; 5852 else if (copyID != 0 && from->vval.v_dict->dv_copyID == copyID) 5853 { 5854 /* use the copy made earlier */ 5855 to->vval.v_dict = from->vval.v_dict->dv_copydict; 5856 ++to->vval.v_dict->dv_refcount; 5857 } 5858 else 5859 to->vval.v_dict = dict_copy(from->vval.v_dict, deep, copyID); 5860 if (to->vval.v_dict == NULL) 5861 ret = FAIL; 5862 break; 5863 case VAR_UNKNOWN: 5864 internal_error("item_copy(UNKNOWN)"); 5865 ret = FAIL; 5866 } 5867 --recurse; 5868 return ret; 5869 } 5870 5871 /* 5872 * ":echo expr1 ..." print each argument separated with a space, add a 5873 * newline at the end. 5874 * ":echon expr1 ..." print each argument plain. 5875 */ 5876 void 5877 ex_echo(exarg_T *eap) 5878 { 5879 char_u *arg = eap->arg; 5880 typval_T rettv; 5881 char_u *tofree; 5882 char_u *p; 5883 int needclr = TRUE; 5884 int atstart = TRUE; 5885 char_u numbuf[NUMBUFLEN]; 5886 int did_emsg_before = did_emsg; 5887 int called_emsg_before = called_emsg; 5888 5889 if (eap->skip) 5890 ++emsg_skip; 5891 while (*arg != NUL && *arg != '|' && *arg != '\n' && !got_int) 5892 { 5893 /* If eval1() causes an error message the text from the command may 5894 * still need to be cleared. E.g., "echo 22,44". */ 5895 need_clr_eos = needclr; 5896 5897 p = arg; 5898 if (eval1(&arg, &rettv, !eap->skip) == FAIL) 5899 { 5900 /* 5901 * Report the invalid expression unless the expression evaluation 5902 * has been cancelled due to an aborting error, an interrupt, or an 5903 * exception. 5904 */ 5905 if (!aborting() && did_emsg == did_emsg_before 5906 && called_emsg == called_emsg_before) 5907 semsg(_(e_invexpr2), p); 5908 need_clr_eos = FALSE; 5909 break; 5910 } 5911 need_clr_eos = FALSE; 5912 5913 if (!eap->skip) 5914 { 5915 if (atstart) 5916 { 5917 atstart = FALSE; 5918 /* Call msg_start() after eval1(), evaluating the expression 5919 * may cause a message to appear. */ 5920 if (eap->cmdidx == CMD_echo) 5921 { 5922 /* Mark the saved text as finishing the line, so that what 5923 * follows is displayed on a new line when scrolling back 5924 * at the more prompt. */ 5925 msg_sb_eol(); 5926 msg_start(); 5927 } 5928 } 5929 else if (eap->cmdidx == CMD_echo) 5930 msg_puts_attr(" ", echo_attr); 5931 p = echo_string(&rettv, &tofree, numbuf, get_copyID()); 5932 if (p != NULL) 5933 for ( ; *p != NUL && !got_int; ++p) 5934 { 5935 if (*p == '\n' || *p == '\r' || *p == TAB) 5936 { 5937 if (*p != TAB && needclr) 5938 { 5939 /* remove any text still there from the command */ 5940 msg_clr_eos(); 5941 needclr = FALSE; 5942 } 5943 msg_putchar_attr(*p, echo_attr); 5944 } 5945 else 5946 { 5947 if (has_mbyte) 5948 { 5949 int i = (*mb_ptr2len)(p); 5950 5951 (void)msg_outtrans_len_attr(p, i, echo_attr); 5952 p += i - 1; 5953 } 5954 else 5955 (void)msg_outtrans_len_attr(p, 1, echo_attr); 5956 } 5957 } 5958 vim_free(tofree); 5959 } 5960 clear_tv(&rettv); 5961 arg = skipwhite(arg); 5962 } 5963 eap->nextcmd = check_nextcmd(arg); 5964 5965 if (eap->skip) 5966 --emsg_skip; 5967 else 5968 { 5969 /* remove text that may still be there from the command */ 5970 if (needclr) 5971 msg_clr_eos(); 5972 if (eap->cmdidx == CMD_echo) 5973 msg_end(); 5974 } 5975 } 5976 5977 /* 5978 * ":echohl {name}". 5979 */ 5980 void 5981 ex_echohl(exarg_T *eap) 5982 { 5983 echo_attr = syn_name2attr(eap->arg); 5984 } 5985 5986 /* 5987 * Returns the :echo attribute 5988 */ 5989 int 5990 get_echo_attr(void) 5991 { 5992 return echo_attr; 5993 } 5994 5995 /* 5996 * ":execute expr1 ..." execute the result of an expression. 5997 * ":echomsg expr1 ..." Print a message 5998 * ":echoerr expr1 ..." Print an error 5999 * Each gets spaces around each argument and a newline at the end for 6000 * echo commands 6001 */ 6002 void 6003 ex_execute(exarg_T *eap) 6004 { 6005 char_u *arg = eap->arg; 6006 typval_T rettv; 6007 int ret = OK; 6008 char_u *p; 6009 garray_T ga; 6010 int len; 6011 int save_did_emsg; 6012 6013 ga_init2(&ga, 1, 80); 6014 6015 if (eap->skip) 6016 ++emsg_skip; 6017 while (*arg != NUL && *arg != '|' && *arg != '\n') 6018 { 6019 ret = eval1_emsg(&arg, &rettv, !eap->skip); 6020 if (ret == FAIL) 6021 break; 6022 6023 if (!eap->skip) 6024 { 6025 char_u buf[NUMBUFLEN]; 6026 6027 if (eap->cmdidx == CMD_execute) 6028 p = tv_get_string_buf(&rettv, buf); 6029 else 6030 p = tv_stringify(&rettv, buf); 6031 len = (int)STRLEN(p); 6032 if (ga_grow(&ga, len + 2) == FAIL) 6033 { 6034 clear_tv(&rettv); 6035 ret = FAIL; 6036 break; 6037 } 6038 if (ga.ga_len) 6039 ((char_u *)(ga.ga_data))[ga.ga_len++] = ' '; 6040 STRCPY((char_u *)(ga.ga_data) + ga.ga_len, p); 6041 ga.ga_len += len; 6042 } 6043 6044 clear_tv(&rettv); 6045 arg = skipwhite(arg); 6046 } 6047 6048 if (ret != FAIL && ga.ga_data != NULL) 6049 { 6050 if (eap->cmdidx == CMD_echomsg || eap->cmdidx == CMD_echoerr) 6051 { 6052 /* Mark the already saved text as finishing the line, so that what 6053 * follows is displayed on a new line when scrolling back at the 6054 * more prompt. */ 6055 msg_sb_eol(); 6056 } 6057 6058 if (eap->cmdidx == CMD_echomsg) 6059 { 6060 msg_attr(ga.ga_data, echo_attr); 6061 out_flush(); 6062 } 6063 else if (eap->cmdidx == CMD_echoerr) 6064 { 6065 /* We don't want to abort following commands, restore did_emsg. */ 6066 save_did_emsg = did_emsg; 6067 emsg(ga.ga_data); 6068 if (!force_abort) 6069 did_emsg = save_did_emsg; 6070 } 6071 else if (eap->cmdidx == CMD_execute) 6072 do_cmdline((char_u *)ga.ga_data, 6073 eap->getline, eap->cookie, DOCMD_NOWAIT|DOCMD_VERBOSE); 6074 } 6075 6076 ga_clear(&ga); 6077 6078 if (eap->skip) 6079 --emsg_skip; 6080 6081 eap->nextcmd = check_nextcmd(arg); 6082 } 6083 6084 /* 6085 * Skip over the name of an option: "&option", "&g:option" or "&l:option". 6086 * "arg" points to the "&" or '+' when called, to "option" when returning. 6087 * Returns NULL when no option name found. Otherwise pointer to the char 6088 * after the option name. 6089 */ 6090 char_u * 6091 find_option_end(char_u **arg, int *opt_flags) 6092 { 6093 char_u *p = *arg; 6094 6095 ++p; 6096 if (*p == 'g' && p[1] == ':') 6097 { 6098 *opt_flags = OPT_GLOBAL; 6099 p += 2; 6100 } 6101 else if (*p == 'l' && p[1] == ':') 6102 { 6103 *opt_flags = OPT_LOCAL; 6104 p += 2; 6105 } 6106 else 6107 *opt_flags = 0; 6108 6109 if (!ASCII_ISALPHA(*p)) 6110 return NULL; 6111 *arg = p; 6112 6113 if (p[0] == 't' && p[1] == '_' && p[2] != NUL && p[3] != NUL) 6114 p += 4; /* termcap option */ 6115 else 6116 while (ASCII_ISALPHA(*p)) 6117 ++p; 6118 return p; 6119 } 6120 6121 /* 6122 * Display script name where an item was last set. 6123 * Should only be invoked when 'verbose' is non-zero. 6124 */ 6125 void 6126 last_set_msg(sctx_T script_ctx) 6127 { 6128 char_u *p; 6129 6130 if (script_ctx.sc_sid != 0) 6131 { 6132 p = home_replace_save(NULL, get_scriptname(script_ctx.sc_sid)); 6133 if (p != NULL) 6134 { 6135 verbose_enter(); 6136 msg_puts(_("\n\tLast set from ")); 6137 msg_puts((char *)p); 6138 if (script_ctx.sc_lnum > 0) 6139 { 6140 msg_puts(_(" line ")); 6141 msg_outnum((long)script_ctx.sc_lnum); 6142 } 6143 verbose_leave(); 6144 vim_free(p); 6145 } 6146 } 6147 } 6148 6149 /* 6150 * Compare "typ1" and "typ2". Put the result in "typ1". 6151 */ 6152 int 6153 typval_compare( 6154 typval_T *typ1, /* first operand */ 6155 typval_T *typ2, /* second operand */ 6156 exptype_T type, /* operator */ 6157 int type_is, /* TRUE for "is" and "isnot" */ 6158 int ic) /* ignore case */ 6159 { 6160 int i; 6161 varnumber_T n1, n2; 6162 char_u *s1, *s2; 6163 char_u buf1[NUMBUFLEN], buf2[NUMBUFLEN]; 6164 6165 if (type_is && typ1->v_type != typ2->v_type) 6166 { 6167 /* For "is" a different type always means FALSE, for "notis" 6168 * it means TRUE. */ 6169 n1 = (type == TYPE_NEQUAL); 6170 } 6171 else if (typ1->v_type == VAR_BLOB || typ2->v_type == VAR_BLOB) 6172 { 6173 if (type_is) 6174 { 6175 n1 = (typ1->v_type == typ2->v_type 6176 && typ1->vval.v_blob == typ2->vval.v_blob); 6177 if (type == TYPE_NEQUAL) 6178 n1 = !n1; 6179 } 6180 else if (typ1->v_type != typ2->v_type 6181 || (type != TYPE_EQUAL && type != TYPE_NEQUAL)) 6182 { 6183 if (typ1->v_type != typ2->v_type) 6184 emsg(_("E977: Can only compare Blob with Blob")); 6185 else 6186 emsg(_(e_invalblob)); 6187 clear_tv(typ1); 6188 return FAIL; 6189 } 6190 else 6191 { 6192 // Compare two Blobs for being equal or unequal. 6193 n1 = blob_equal(typ1->vval.v_blob, typ2->vval.v_blob); 6194 if (type == TYPE_NEQUAL) 6195 n1 = !n1; 6196 } 6197 } 6198 else if (typ1->v_type == VAR_LIST || typ2->v_type == VAR_LIST) 6199 { 6200 if (type_is) 6201 { 6202 n1 = (typ1->v_type == typ2->v_type 6203 && typ1->vval.v_list == typ2->vval.v_list); 6204 if (type == TYPE_NEQUAL) 6205 n1 = !n1; 6206 } 6207 else if (typ1->v_type != typ2->v_type 6208 || (type != TYPE_EQUAL && type != TYPE_NEQUAL)) 6209 { 6210 if (typ1->v_type != typ2->v_type) 6211 emsg(_("E691: Can only compare List with List")); 6212 else 6213 emsg(_("E692: Invalid operation for List")); 6214 clear_tv(typ1); 6215 return FAIL; 6216 } 6217 else 6218 { 6219 /* Compare two Lists for being equal or unequal. */ 6220 n1 = list_equal(typ1->vval.v_list, typ2->vval.v_list, 6221 ic, FALSE); 6222 if (type == TYPE_NEQUAL) 6223 n1 = !n1; 6224 } 6225 } 6226 6227 else if (typ1->v_type == VAR_DICT || typ2->v_type == VAR_DICT) 6228 { 6229 if (type_is) 6230 { 6231 n1 = (typ1->v_type == typ2->v_type 6232 && typ1->vval.v_dict == typ2->vval.v_dict); 6233 if (type == TYPE_NEQUAL) 6234 n1 = !n1; 6235 } 6236 else if (typ1->v_type != typ2->v_type 6237 || (type != TYPE_EQUAL && type != TYPE_NEQUAL)) 6238 { 6239 if (typ1->v_type != typ2->v_type) 6240 emsg(_("E735: Can only compare Dictionary with Dictionary")); 6241 else 6242 emsg(_("E736: Invalid operation for Dictionary")); 6243 clear_tv(typ1); 6244 return FAIL; 6245 } 6246 else 6247 { 6248 /* Compare two Dictionaries for being equal or unequal. */ 6249 n1 = dict_equal(typ1->vval.v_dict, typ2->vval.v_dict, 6250 ic, FALSE); 6251 if (type == TYPE_NEQUAL) 6252 n1 = !n1; 6253 } 6254 } 6255 6256 else if (typ1->v_type == VAR_FUNC || typ2->v_type == VAR_FUNC 6257 || typ1->v_type == VAR_PARTIAL || typ2->v_type == VAR_PARTIAL) 6258 { 6259 if (type != TYPE_EQUAL && type != TYPE_NEQUAL) 6260 { 6261 emsg(_("E694: Invalid operation for Funcrefs")); 6262 clear_tv(typ1); 6263 return FAIL; 6264 } 6265 if ((typ1->v_type == VAR_PARTIAL 6266 && typ1->vval.v_partial == NULL) 6267 || (typ2->v_type == VAR_PARTIAL 6268 && typ2->vval.v_partial == NULL)) 6269 /* when a partial is NULL assume not equal */ 6270 n1 = FALSE; 6271 else if (type_is) 6272 { 6273 if (typ1->v_type == VAR_FUNC && typ2->v_type == VAR_FUNC) 6274 /* strings are considered the same if their value is 6275 * the same */ 6276 n1 = tv_equal(typ1, typ2, ic, FALSE); 6277 else if (typ1->v_type == VAR_PARTIAL 6278 && typ2->v_type == VAR_PARTIAL) 6279 n1 = (typ1->vval.v_partial == typ2->vval.v_partial); 6280 else 6281 n1 = FALSE; 6282 } 6283 else 6284 n1 = tv_equal(typ1, typ2, ic, FALSE); 6285 if (type == TYPE_NEQUAL) 6286 n1 = !n1; 6287 } 6288 6289 #ifdef FEAT_FLOAT 6290 /* 6291 * If one of the two variables is a float, compare as a float. 6292 * When using "=~" or "!~", always compare as string. 6293 */ 6294 else if ((typ1->v_type == VAR_FLOAT || typ2->v_type == VAR_FLOAT) 6295 && type != TYPE_MATCH && type != TYPE_NOMATCH) 6296 { 6297 float_T f1, f2; 6298 6299 f1 = tv_get_float(typ1); 6300 f2 = tv_get_float(typ2); 6301 n1 = FALSE; 6302 switch (type) 6303 { 6304 case TYPE_EQUAL: n1 = (f1 == f2); break; 6305 case TYPE_NEQUAL: n1 = (f1 != f2); break; 6306 case TYPE_GREATER: n1 = (f1 > f2); break; 6307 case TYPE_GEQUAL: n1 = (f1 >= f2); break; 6308 case TYPE_SMALLER: n1 = (f1 < f2); break; 6309 case TYPE_SEQUAL: n1 = (f1 <= f2); break; 6310 case TYPE_UNKNOWN: 6311 case TYPE_MATCH: 6312 case TYPE_NOMATCH: break; /* avoid gcc warning */ 6313 } 6314 } 6315 #endif 6316 6317 /* 6318 * If one of the two variables is a number, compare as a number. 6319 * When using "=~" or "!~", always compare as string. 6320 */ 6321 else if ((typ1->v_type == VAR_NUMBER || typ2->v_type == VAR_NUMBER) 6322 && type != TYPE_MATCH && type != TYPE_NOMATCH) 6323 { 6324 n1 = tv_get_number(typ1); 6325 n2 = tv_get_number(typ2); 6326 switch (type) 6327 { 6328 case TYPE_EQUAL: n1 = (n1 == n2); break; 6329 case TYPE_NEQUAL: n1 = (n1 != n2); break; 6330 case TYPE_GREATER: n1 = (n1 > n2); break; 6331 case TYPE_GEQUAL: n1 = (n1 >= n2); break; 6332 case TYPE_SMALLER: n1 = (n1 < n2); break; 6333 case TYPE_SEQUAL: n1 = (n1 <= n2); break; 6334 case TYPE_UNKNOWN: 6335 case TYPE_MATCH: 6336 case TYPE_NOMATCH: break; /* avoid gcc warning */ 6337 } 6338 } 6339 else 6340 { 6341 s1 = tv_get_string_buf(typ1, buf1); 6342 s2 = tv_get_string_buf(typ2, buf2); 6343 if (type != TYPE_MATCH && type != TYPE_NOMATCH) 6344 i = ic ? MB_STRICMP(s1, s2) : STRCMP(s1, s2); 6345 else 6346 i = 0; 6347 n1 = FALSE; 6348 switch (type) 6349 { 6350 case TYPE_EQUAL: n1 = (i == 0); break; 6351 case TYPE_NEQUAL: n1 = (i != 0); break; 6352 case TYPE_GREATER: n1 = (i > 0); break; 6353 case TYPE_GEQUAL: n1 = (i >= 0); break; 6354 case TYPE_SMALLER: n1 = (i < 0); break; 6355 case TYPE_SEQUAL: n1 = (i <= 0); break; 6356 6357 case TYPE_MATCH: 6358 case TYPE_NOMATCH: 6359 n1 = pattern_match(s2, s1, ic); 6360 if (type == TYPE_NOMATCH) 6361 n1 = !n1; 6362 break; 6363 6364 case TYPE_UNKNOWN: break; /* avoid gcc warning */ 6365 } 6366 } 6367 clear_tv(typ1); 6368 typ1->v_type = VAR_NUMBER; 6369 typ1->vval.v_number = n1; 6370 6371 return OK; 6372 } 6373 6374 char_u * 6375 typval_tostring(typval_T *arg) 6376 { 6377 char_u *tofree; 6378 char_u numbuf[NUMBUFLEN]; 6379 char_u *ret = NULL; 6380 6381 if (arg == NULL) 6382 return vim_strsave((char_u *)"(does not exist)"); 6383 ret = tv2string(arg, &tofree, numbuf, 0); 6384 /* Make a copy if we have a value but it's not in allocated memory. */ 6385 if (ret != NULL && tofree == NULL) 6386 ret = vim_strsave(ret); 6387 return ret; 6388 } 6389 6390 #endif /* FEAT_EVAL */ 6391 6392 #if defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) || defined(PROTO) 6393 6394 #ifdef MSWIN 6395 /* 6396 * Functions for ":8" filename modifier: get 8.3 version of a filename. 6397 */ 6398 6399 /* 6400 * Get the short path (8.3) for the filename in "fnamep". 6401 * Only works for a valid file name. 6402 * When the path gets longer "fnamep" is changed and the allocated buffer 6403 * is put in "bufp". 6404 * *fnamelen is the length of "fnamep" and set to 0 for a nonexistent path. 6405 * Returns OK on success, FAIL on failure. 6406 */ 6407 static int 6408 get_short_pathname(char_u **fnamep, char_u **bufp, int *fnamelen) 6409 { 6410 int l, len; 6411 char_u *newbuf; 6412 6413 len = *fnamelen; 6414 l = GetShortPathName((LPSTR)*fnamep, (LPSTR)*fnamep, len); 6415 if (l > len - 1) 6416 { 6417 /* If that doesn't work (not enough space), then save the string 6418 * and try again with a new buffer big enough. */ 6419 newbuf = vim_strnsave(*fnamep, l); 6420 if (newbuf == NULL) 6421 return FAIL; 6422 6423 vim_free(*bufp); 6424 *fnamep = *bufp = newbuf; 6425 6426 /* Really should always succeed, as the buffer is big enough. */ 6427 l = GetShortPathName((LPSTR)*fnamep, (LPSTR)*fnamep, l+1); 6428 } 6429 6430 *fnamelen = l; 6431 return OK; 6432 } 6433 6434 /* 6435 * Get the short path (8.3) for the filename in "fname". The converted 6436 * path is returned in "bufp". 6437 * 6438 * Some of the directories specified in "fname" may not exist. This function 6439 * will shorten the existing directories at the beginning of the path and then 6440 * append the remaining non-existing path. 6441 * 6442 * fname - Pointer to the filename to shorten. On return, contains the 6443 * pointer to the shortened pathname 6444 * bufp - Pointer to an allocated buffer for the filename. 6445 * fnamelen - Length of the filename pointed to by fname 6446 * 6447 * Returns OK on success (or nothing done) and FAIL on failure (out of memory). 6448 */ 6449 static int 6450 shortpath_for_invalid_fname( 6451 char_u **fname, 6452 char_u **bufp, 6453 int *fnamelen) 6454 { 6455 char_u *short_fname, *save_fname, *pbuf_unused; 6456 char_u *endp, *save_endp; 6457 char_u ch; 6458 int old_len, len; 6459 int new_len, sfx_len; 6460 int retval = OK; 6461 6462 /* Make a copy */ 6463 old_len = *fnamelen; 6464 save_fname = vim_strnsave(*fname, old_len); 6465 pbuf_unused = NULL; 6466 short_fname = NULL; 6467 6468 endp = save_fname + old_len - 1; /* Find the end of the copy */ 6469 save_endp = endp; 6470 6471 /* 6472 * Try shortening the supplied path till it succeeds by removing one 6473 * directory at a time from the tail of the path. 6474 */ 6475 len = 0; 6476 for (;;) 6477 { 6478 /* go back one path-separator */ 6479 while (endp > save_fname && !after_pathsep(save_fname, endp + 1)) 6480 --endp; 6481 if (endp <= save_fname) 6482 break; /* processed the complete path */ 6483 6484 /* 6485 * Replace the path separator with a NUL and try to shorten the 6486 * resulting path. 6487 */ 6488 ch = *endp; 6489 *endp = 0; 6490 short_fname = save_fname; 6491 len = (int)STRLEN(short_fname) + 1; 6492 if (get_short_pathname(&short_fname, &pbuf_unused, &len) == FAIL) 6493 { 6494 retval = FAIL; 6495 goto theend; 6496 } 6497 *endp = ch; /* preserve the string */ 6498 6499 if (len > 0) 6500 break; /* successfully shortened the path */ 6501 6502 /* failed to shorten the path. Skip the path separator */ 6503 --endp; 6504 } 6505 6506 if (len > 0) 6507 { 6508 /* 6509 * Succeeded in shortening the path. Now concatenate the shortened 6510 * path with the remaining path at the tail. 6511 */ 6512 6513 /* Compute the length of the new path. */ 6514 sfx_len = (int)(save_endp - endp) + 1; 6515 new_len = len + sfx_len; 6516 6517 *fnamelen = new_len; 6518 vim_free(*bufp); 6519 if (new_len > old_len) 6520 { 6521 /* There is not enough space in the currently allocated string, 6522 * copy it to a buffer big enough. */ 6523 *fname = *bufp = vim_strnsave(short_fname, new_len); 6524 if (*fname == NULL) 6525 { 6526 retval = FAIL; 6527 goto theend; 6528 } 6529 } 6530 else 6531 { 6532 /* Transfer short_fname to the main buffer (it's big enough), 6533 * unless get_short_pathname() did its work in-place. */ 6534 *fname = *bufp = save_fname; 6535 if (short_fname != save_fname) 6536 vim_strncpy(save_fname, short_fname, len); 6537 save_fname = NULL; 6538 } 6539 6540 /* concat the not-shortened part of the path */ 6541 vim_strncpy(*fname + len, endp, sfx_len); 6542 (*fname)[new_len] = NUL; 6543 } 6544 6545 theend: 6546 vim_free(pbuf_unused); 6547 vim_free(save_fname); 6548 6549 return retval; 6550 } 6551 6552 /* 6553 * Get a pathname for a partial path. 6554 * Returns OK for success, FAIL for failure. 6555 */ 6556 static int 6557 shortpath_for_partial( 6558 char_u **fnamep, 6559 char_u **bufp, 6560 int *fnamelen) 6561 { 6562 int sepcount, len, tflen; 6563 char_u *p; 6564 char_u *pbuf, *tfname; 6565 int hasTilde; 6566 6567 /* Count up the path separators from the RHS.. so we know which part 6568 * of the path to return. */ 6569 sepcount = 0; 6570 for (p = *fnamep; p < *fnamep + *fnamelen; MB_PTR_ADV(p)) 6571 if (vim_ispathsep(*p)) 6572 ++sepcount; 6573 6574 /* Need full path first (use expand_env() to remove a "~/") */ 6575 hasTilde = (**fnamep == '~'); 6576 if (hasTilde) 6577 pbuf = tfname = expand_env_save(*fnamep); 6578 else 6579 pbuf = tfname = FullName_save(*fnamep, FALSE); 6580 6581 len = tflen = (int)STRLEN(tfname); 6582 6583 if (get_short_pathname(&tfname, &pbuf, &len) == FAIL) 6584 return FAIL; 6585 6586 if (len == 0) 6587 { 6588 /* Don't have a valid filename, so shorten the rest of the 6589 * path if we can. This CAN give us invalid 8.3 filenames, but 6590 * there's not a lot of point in guessing what it might be. 6591 */ 6592 len = tflen; 6593 if (shortpath_for_invalid_fname(&tfname, &pbuf, &len) == FAIL) 6594 return FAIL; 6595 } 6596 6597 /* Count the paths backward to find the beginning of the desired string. */ 6598 for (p = tfname + len - 1; p >= tfname; --p) 6599 { 6600 if (has_mbyte) 6601 p -= mb_head_off(tfname, p); 6602 if (vim_ispathsep(*p)) 6603 { 6604 if (sepcount == 0 || (hasTilde && sepcount == 1)) 6605 break; 6606 else 6607 sepcount --; 6608 } 6609 } 6610 if (hasTilde) 6611 { 6612 --p; 6613 if (p >= tfname) 6614 *p = '~'; 6615 else 6616 return FAIL; 6617 } 6618 else 6619 ++p; 6620 6621 /* Copy in the string - p indexes into tfname - allocated at pbuf */ 6622 vim_free(*bufp); 6623 *fnamelen = (int)STRLEN(p); 6624 *bufp = pbuf; 6625 *fnamep = p; 6626 6627 return OK; 6628 } 6629 #endif // MSWIN 6630 6631 /* 6632 * Adjust a filename, according to a string of modifiers. 6633 * *fnamep must be NUL terminated when called. When returning, the length is 6634 * determined by *fnamelen. 6635 * Returns VALID_ flags or -1 for failure. 6636 * When there is an error, *fnamep is set to NULL. 6637 */ 6638 int 6639 modify_fname( 6640 char_u *src, // string with modifiers 6641 int tilde_file, // "~" is a file name, not $HOME 6642 int *usedlen, // characters after src that are used 6643 char_u **fnamep, // file name so far 6644 char_u **bufp, // buffer for allocated file name or NULL 6645 int *fnamelen) // length of fnamep 6646 { 6647 int valid = 0; 6648 char_u *tail; 6649 char_u *s, *p, *pbuf; 6650 char_u dirname[MAXPATHL]; 6651 int c; 6652 int has_fullname = 0; 6653 #ifdef MSWIN 6654 char_u *fname_start = *fnamep; 6655 int has_shortname = 0; 6656 #endif 6657 6658 repeat: 6659 /* ":p" - full path/file_name */ 6660 if (src[*usedlen] == ':' && src[*usedlen + 1] == 'p') 6661 { 6662 has_fullname = 1; 6663 6664 valid |= VALID_PATH; 6665 *usedlen += 2; 6666 6667 /* Expand "~/path" for all systems and "~user/path" for Unix and VMS */ 6668 if ((*fnamep)[0] == '~' 6669 #if !defined(UNIX) && !(defined(VMS) && defined(USER_HOME)) 6670 && ((*fnamep)[1] == '/' 6671 # ifdef BACKSLASH_IN_FILENAME 6672 || (*fnamep)[1] == '\\' 6673 # endif 6674 || (*fnamep)[1] == NUL) 6675 #endif 6676 && !(tilde_file && (*fnamep)[1] == NUL) 6677 ) 6678 { 6679 *fnamep = expand_env_save(*fnamep); 6680 vim_free(*bufp); /* free any allocated file name */ 6681 *bufp = *fnamep; 6682 if (*fnamep == NULL) 6683 return -1; 6684 } 6685 6686 /* When "/." or "/.." is used: force expansion to get rid of it. */ 6687 for (p = *fnamep; *p != NUL; MB_PTR_ADV(p)) 6688 { 6689 if (vim_ispathsep(*p) 6690 && p[1] == '.' 6691 && (p[2] == NUL 6692 || vim_ispathsep(p[2]) 6693 || (p[2] == '.' 6694 && (p[3] == NUL || vim_ispathsep(p[3]))))) 6695 break; 6696 } 6697 6698 /* FullName_save() is slow, don't use it when not needed. */ 6699 if (*p != NUL || !vim_isAbsName(*fnamep)) 6700 { 6701 *fnamep = FullName_save(*fnamep, *p != NUL); 6702 vim_free(*bufp); /* free any allocated file name */ 6703 *bufp = *fnamep; 6704 if (*fnamep == NULL) 6705 return -1; 6706 } 6707 6708 #ifdef MSWIN 6709 # if _WIN32_WINNT >= 0x0500 6710 if (vim_strchr(*fnamep, '~') != NULL) 6711 { 6712 // Expand 8.3 filename to full path. Needed to make sure the same 6713 // file does not have two different names. 6714 // Note: problem does not occur if _WIN32_WINNT < 0x0500. 6715 WCHAR *wfname = enc_to_utf16(*fnamep, NULL); 6716 WCHAR buf[_MAX_PATH]; 6717 6718 if (wfname != NULL) 6719 { 6720 if (GetLongPathNameW(wfname, buf, _MAX_PATH)) 6721 { 6722 char_u *p = utf16_to_enc(buf, NULL); 6723 6724 if (p != NULL) 6725 { 6726 vim_free(*bufp); // free any allocated file name 6727 *bufp = *fnamep = p; 6728 } 6729 } 6730 vim_free(wfname); 6731 } 6732 } 6733 # endif 6734 #endif 6735 /* Append a path separator to a directory. */ 6736 if (mch_isdir(*fnamep)) 6737 { 6738 /* Make room for one or two extra characters. */ 6739 *fnamep = vim_strnsave(*fnamep, (int)STRLEN(*fnamep) + 2); 6740 vim_free(*bufp); /* free any allocated file name */ 6741 *bufp = *fnamep; 6742 if (*fnamep == NULL) 6743 return -1; 6744 add_pathsep(*fnamep); 6745 } 6746 } 6747 6748 /* ":." - path relative to the current directory */ 6749 /* ":~" - path relative to the home directory */ 6750 /* ":8" - shortname path - postponed till after */ 6751 while (src[*usedlen] == ':' 6752 && ((c = src[*usedlen + 1]) == '.' || c == '~' || c == '8')) 6753 { 6754 *usedlen += 2; 6755 if (c == '8') 6756 { 6757 #ifdef MSWIN 6758 has_shortname = 1; /* Postpone this. */ 6759 #endif 6760 continue; 6761 } 6762 pbuf = NULL; 6763 /* Need full path first (use expand_env() to remove a "~/") */ 6764 if (!has_fullname) 6765 { 6766 if (c == '.' && **fnamep == '~') 6767 p = pbuf = expand_env_save(*fnamep); 6768 else 6769 p = pbuf = FullName_save(*fnamep, FALSE); 6770 } 6771 else 6772 p = *fnamep; 6773 6774 has_fullname = 0; 6775 6776 if (p != NULL) 6777 { 6778 if (c == '.') 6779 { 6780 mch_dirname(dirname, MAXPATHL); 6781 s = shorten_fname(p, dirname); 6782 if (s != NULL) 6783 { 6784 *fnamep = s; 6785 if (pbuf != NULL) 6786 { 6787 vim_free(*bufp); /* free any allocated file name */ 6788 *bufp = pbuf; 6789 pbuf = NULL; 6790 } 6791 } 6792 } 6793 else 6794 { 6795 home_replace(NULL, p, dirname, MAXPATHL, TRUE); 6796 /* Only replace it when it starts with '~' */ 6797 if (*dirname == '~') 6798 { 6799 s = vim_strsave(dirname); 6800 if (s != NULL) 6801 { 6802 *fnamep = s; 6803 vim_free(*bufp); 6804 *bufp = s; 6805 } 6806 } 6807 } 6808 vim_free(pbuf); 6809 } 6810 } 6811 6812 tail = gettail(*fnamep); 6813 *fnamelen = (int)STRLEN(*fnamep); 6814 6815 /* ":h" - head, remove "/file_name", can be repeated */ 6816 /* Don't remove the first "/" or "c:\" */ 6817 while (src[*usedlen] == ':' && src[*usedlen + 1] == 'h') 6818 { 6819 valid |= VALID_HEAD; 6820 *usedlen += 2; 6821 s = get_past_head(*fnamep); 6822 while (tail > s && after_pathsep(s, tail)) 6823 MB_PTR_BACK(*fnamep, tail); 6824 *fnamelen = (int)(tail - *fnamep); 6825 #ifdef VMS 6826 if (*fnamelen > 0) 6827 *fnamelen += 1; /* the path separator is part of the path */ 6828 #endif 6829 if (*fnamelen == 0) 6830 { 6831 /* Result is empty. Turn it into "." to make ":cd %:h" work. */ 6832 p = vim_strsave((char_u *)"."); 6833 if (p == NULL) 6834 return -1; 6835 vim_free(*bufp); 6836 *bufp = *fnamep = tail = p; 6837 *fnamelen = 1; 6838 } 6839 else 6840 { 6841 while (tail > s && !after_pathsep(s, tail)) 6842 MB_PTR_BACK(*fnamep, tail); 6843 } 6844 } 6845 6846 /* ":8" - shortname */ 6847 if (src[*usedlen] == ':' && src[*usedlen + 1] == '8') 6848 { 6849 *usedlen += 2; 6850 #ifdef MSWIN 6851 has_shortname = 1; 6852 #endif 6853 } 6854 6855 #ifdef MSWIN 6856 /* 6857 * Handle ":8" after we have done 'heads' and before we do 'tails'. 6858 */ 6859 if (has_shortname) 6860 { 6861 /* Copy the string if it is shortened by :h and when it wasn't copied 6862 * yet, because we are going to change it in place. Avoids changing 6863 * the buffer name for "%:8". */ 6864 if (*fnamelen < (int)STRLEN(*fnamep) || *fnamep == fname_start) 6865 { 6866 p = vim_strnsave(*fnamep, *fnamelen); 6867 if (p == NULL) 6868 return -1; 6869 vim_free(*bufp); 6870 *bufp = *fnamep = p; 6871 } 6872 6873 /* Split into two implementations - makes it easier. First is where 6874 * there isn't a full name already, second is where there is. */ 6875 if (!has_fullname && !vim_isAbsName(*fnamep)) 6876 { 6877 if (shortpath_for_partial(fnamep, bufp, fnamelen) == FAIL) 6878 return -1; 6879 } 6880 else 6881 { 6882 int l = *fnamelen; 6883 6884 /* Simple case, already have the full-name. 6885 * Nearly always shorter, so try first time. */ 6886 if (get_short_pathname(fnamep, bufp, &l) == FAIL) 6887 return -1; 6888 6889 if (l == 0) 6890 { 6891 /* Couldn't find the filename, search the paths. */ 6892 l = *fnamelen; 6893 if (shortpath_for_invalid_fname(fnamep, bufp, &l) == FAIL) 6894 return -1; 6895 } 6896 *fnamelen = l; 6897 } 6898 } 6899 #endif // MSWIN 6900 6901 /* ":t" - tail, just the basename */ 6902 if (src[*usedlen] == ':' && src[*usedlen + 1] == 't') 6903 { 6904 *usedlen += 2; 6905 *fnamelen -= (int)(tail - *fnamep); 6906 *fnamep = tail; 6907 } 6908 6909 /* ":e" - extension, can be repeated */ 6910 /* ":r" - root, without extension, can be repeated */ 6911 while (src[*usedlen] == ':' 6912 && (src[*usedlen + 1] == 'e' || src[*usedlen + 1] == 'r')) 6913 { 6914 /* find a '.' in the tail: 6915 * - for second :e: before the current fname 6916 * - otherwise: The last '.' 6917 */ 6918 if (src[*usedlen + 1] == 'e' && *fnamep > tail) 6919 s = *fnamep - 2; 6920 else 6921 s = *fnamep + *fnamelen - 1; 6922 for ( ; s > tail; --s) 6923 if (s[0] == '.') 6924 break; 6925 if (src[*usedlen + 1] == 'e') /* :e */ 6926 { 6927 if (s > tail) 6928 { 6929 *fnamelen += (int)(*fnamep - (s + 1)); 6930 *fnamep = s + 1; 6931 #ifdef VMS 6932 /* cut version from the extension */ 6933 s = *fnamep + *fnamelen - 1; 6934 for ( ; s > *fnamep; --s) 6935 if (s[0] == ';') 6936 break; 6937 if (s > *fnamep) 6938 *fnamelen = s - *fnamep; 6939 #endif 6940 } 6941 else if (*fnamep <= tail) 6942 *fnamelen = 0; 6943 } 6944 else /* :r */ 6945 { 6946 if (s > tail) /* remove one extension */ 6947 *fnamelen = (int)(s - *fnamep); 6948 } 6949 *usedlen += 2; 6950 } 6951 6952 /* ":s?pat?foo?" - substitute */ 6953 /* ":gs?pat?foo?" - global substitute */ 6954 if (src[*usedlen] == ':' 6955 && (src[*usedlen + 1] == 's' 6956 || (src[*usedlen + 1] == 'g' && src[*usedlen + 2] == 's'))) 6957 { 6958 char_u *str; 6959 char_u *pat; 6960 char_u *sub; 6961 int sep; 6962 char_u *flags; 6963 int didit = FALSE; 6964 6965 flags = (char_u *)""; 6966 s = src + *usedlen + 2; 6967 if (src[*usedlen + 1] == 'g') 6968 { 6969 flags = (char_u *)"g"; 6970 ++s; 6971 } 6972 6973 sep = *s++; 6974 if (sep) 6975 { 6976 /* find end of pattern */ 6977 p = vim_strchr(s, sep); 6978 if (p != NULL) 6979 { 6980 pat = vim_strnsave(s, (int)(p - s)); 6981 if (pat != NULL) 6982 { 6983 s = p + 1; 6984 /* find end of substitution */ 6985 p = vim_strchr(s, sep); 6986 if (p != NULL) 6987 { 6988 sub = vim_strnsave(s, (int)(p - s)); 6989 str = vim_strnsave(*fnamep, *fnamelen); 6990 if (sub != NULL && str != NULL) 6991 { 6992 *usedlen = (int)(p + 1 - src); 6993 s = do_string_sub(str, pat, sub, NULL, flags); 6994 if (s != NULL) 6995 { 6996 *fnamep = s; 6997 *fnamelen = (int)STRLEN(s); 6998 vim_free(*bufp); 6999 *bufp = s; 7000 didit = TRUE; 7001 } 7002 } 7003 vim_free(sub); 7004 vim_free(str); 7005 } 7006 vim_free(pat); 7007 } 7008 } 7009 /* after using ":s", repeat all the modifiers */ 7010 if (didit) 7011 goto repeat; 7012 } 7013 } 7014 7015 if (src[*usedlen] == ':' && src[*usedlen + 1] == 'S') 7016 { 7017 /* vim_strsave_shellescape() needs a NUL terminated string. */ 7018 c = (*fnamep)[*fnamelen]; 7019 if (c != NUL) 7020 (*fnamep)[*fnamelen] = NUL; 7021 p = vim_strsave_shellescape(*fnamep, FALSE, FALSE); 7022 if (c != NUL) 7023 (*fnamep)[*fnamelen] = c; 7024 if (p == NULL) 7025 return -1; 7026 vim_free(*bufp); 7027 *bufp = *fnamep = p; 7028 *fnamelen = (int)STRLEN(p); 7029 *usedlen += 2; 7030 } 7031 7032 return valid; 7033 } 7034 7035 /* 7036 * Perform a substitution on "str" with pattern "pat" and substitute "sub". 7037 * When "sub" is NULL "expr" is used, must be a VAR_FUNC or VAR_PARTIAL. 7038 * "flags" can be "g" to do a global substitute. 7039 * Returns an allocated string, NULL for error. 7040 */ 7041 char_u * 7042 do_string_sub( 7043 char_u *str, 7044 char_u *pat, 7045 char_u *sub, 7046 typval_T *expr, 7047 char_u *flags) 7048 { 7049 int sublen; 7050 regmatch_T regmatch; 7051 int i; 7052 int do_all; 7053 char_u *tail; 7054 char_u *end; 7055 garray_T ga; 7056 char_u *ret; 7057 char_u *save_cpo; 7058 char_u *zero_width = NULL; 7059 7060 /* Make 'cpoptions' empty, so that the 'l' flag doesn't work here */ 7061 save_cpo = p_cpo; 7062 p_cpo = empty_option; 7063 7064 ga_init2(&ga, 1, 200); 7065 7066 do_all = (flags[0] == 'g'); 7067 7068 regmatch.rm_ic = p_ic; 7069 regmatch.regprog = vim_regcomp(pat, RE_MAGIC + RE_STRING); 7070 if (regmatch.regprog != NULL) 7071 { 7072 tail = str; 7073 end = str + STRLEN(str); 7074 while (vim_regexec_nl(®match, str, (colnr_T)(tail - str))) 7075 { 7076 /* Skip empty match except for first match. */ 7077 if (regmatch.startp[0] == regmatch.endp[0]) 7078 { 7079 if (zero_width == regmatch.startp[0]) 7080 { 7081 /* avoid getting stuck on a match with an empty string */ 7082 i = MB_PTR2LEN(tail); 7083 mch_memmove((char_u *)ga.ga_data + ga.ga_len, tail, 7084 (size_t)i); 7085 ga.ga_len += i; 7086 tail += i; 7087 continue; 7088 } 7089 zero_width = regmatch.startp[0]; 7090 } 7091 7092 /* 7093 * Get some space for a temporary buffer to do the substitution 7094 * into. It will contain: 7095 * - The text up to where the match is. 7096 * - The substituted text. 7097 * - The text after the match. 7098 */ 7099 sublen = vim_regsub(®match, sub, expr, tail, FALSE, TRUE, FALSE); 7100 if (ga_grow(&ga, (int)((end - tail) + sublen - 7101 (regmatch.endp[0] - regmatch.startp[0]))) == FAIL) 7102 { 7103 ga_clear(&ga); 7104 break; 7105 } 7106 7107 /* copy the text up to where the match is */ 7108 i = (int)(regmatch.startp[0] - tail); 7109 mch_memmove((char_u *)ga.ga_data + ga.ga_len, tail, (size_t)i); 7110 /* add the substituted text */ 7111 (void)vim_regsub(®match, sub, expr, (char_u *)ga.ga_data 7112 + ga.ga_len + i, TRUE, TRUE, FALSE); 7113 ga.ga_len += i + sublen - 1; 7114 tail = regmatch.endp[0]; 7115 if (*tail == NUL) 7116 break; 7117 if (!do_all) 7118 break; 7119 } 7120 7121 if (ga.ga_data != NULL) 7122 STRCPY((char *)ga.ga_data + ga.ga_len, tail); 7123 7124 vim_regfree(regmatch.regprog); 7125 } 7126 7127 ret = vim_strsave(ga.ga_data == NULL ? str : (char_u *)ga.ga_data); 7128 ga_clear(&ga); 7129 if (p_cpo == empty_option) 7130 p_cpo = save_cpo; 7131 else 7132 /* Darn, evaluating {sub} expression or {expr} changed the value. */ 7133 free_string_option(save_cpo); 7134 7135 return ret; 7136 } 7137 7138 static int 7139 filter_map_one(typval_T *tv, typval_T *expr, int map, int *remp) 7140 { 7141 typval_T rettv; 7142 typval_T argv[3]; 7143 int retval = FAIL; 7144 7145 copy_tv(tv, get_vim_var_tv(VV_VAL)); 7146 argv[0] = *get_vim_var_tv(VV_KEY); 7147 argv[1] = *get_vim_var_tv(VV_VAL); 7148 if (eval_expr_typval(expr, argv, 2, &rettv) == FAIL) 7149 goto theend; 7150 if (map) 7151 { 7152 /* map(): replace the list item value */ 7153 clear_tv(tv); 7154 rettv.v_lock = 0; 7155 *tv = rettv; 7156 } 7157 else 7158 { 7159 int error = FALSE; 7160 7161 /* filter(): when expr is zero remove the item */ 7162 *remp = (tv_get_number_chk(&rettv, &error) == 0); 7163 clear_tv(&rettv); 7164 /* On type error, nothing has been removed; return FAIL to stop the 7165 * loop. The error message was given by tv_get_number_chk(). */ 7166 if (error) 7167 goto theend; 7168 } 7169 retval = OK; 7170 theend: 7171 clear_tv(get_vim_var_tv(VV_VAL)); 7172 return retval; 7173 } 7174 7175 /* 7176 * Implementation of map() and filter(). 7177 */ 7178 void 7179 filter_map(typval_T *argvars, typval_T *rettv, int map) 7180 { 7181 typval_T *expr; 7182 listitem_T *li, *nli; 7183 list_T *l = NULL; 7184 dictitem_T *di; 7185 hashtab_T *ht; 7186 hashitem_T *hi; 7187 dict_T *d = NULL; 7188 blob_T *b = NULL; 7189 int rem; 7190 int todo; 7191 char_u *ermsg = (char_u *)(map ? "map()" : "filter()"); 7192 char_u *arg_errmsg = (char_u *)(map ? N_("map() argument") 7193 : N_("filter() argument")); 7194 int save_did_emsg; 7195 int idx = 0; 7196 7197 if (argvars[0].v_type == VAR_BLOB) 7198 { 7199 if ((b = argvars[0].vval.v_blob) == NULL) 7200 return; 7201 } 7202 else if (argvars[0].v_type == VAR_LIST) 7203 { 7204 if ((l = argvars[0].vval.v_list) == NULL 7205 || (!map && var_check_lock(l->lv_lock, arg_errmsg, TRUE))) 7206 return; 7207 } 7208 else if (argvars[0].v_type == VAR_DICT) 7209 { 7210 if ((d = argvars[0].vval.v_dict) == NULL 7211 || (!map && var_check_lock(d->dv_lock, arg_errmsg, TRUE))) 7212 return; 7213 } 7214 else 7215 { 7216 semsg(_(e_listdictarg), ermsg); 7217 return; 7218 } 7219 7220 expr = &argvars[1]; 7221 /* On type errors, the preceding call has already displayed an error 7222 * message. Avoid a misleading error message for an empty string that 7223 * was not passed as argument. */ 7224 if (expr->v_type != VAR_UNKNOWN) 7225 { 7226 typval_T save_val; 7227 typval_T save_key; 7228 7229 prepare_vimvar(VV_VAL, &save_val); 7230 prepare_vimvar(VV_KEY, &save_key); 7231 7232 // We reset "did_emsg" to be able to detect whether an error 7233 // occurred during evaluation of the expression. 7234 save_did_emsg = did_emsg; 7235 did_emsg = FALSE; 7236 7237 if (argvars[0].v_type == VAR_DICT) 7238 { 7239 ht = &d->dv_hashtab; 7240 hash_lock(ht); 7241 todo = (int)ht->ht_used; 7242 for (hi = ht->ht_array; todo > 0; ++hi) 7243 { 7244 if (!HASHITEM_EMPTY(hi)) 7245 { 7246 int r; 7247 7248 --todo; 7249 di = HI2DI(hi); 7250 if (map && (var_check_lock(di->di_tv.v_lock, 7251 arg_errmsg, TRUE) 7252 || var_check_ro(di->di_flags, 7253 arg_errmsg, TRUE))) 7254 break; 7255 set_vim_var_string(VV_KEY, di->di_key, -1); 7256 r = filter_map_one(&di->di_tv, expr, map, &rem); 7257 clear_tv(get_vim_var_tv(VV_KEY)); 7258 if (r == FAIL || did_emsg) 7259 break; 7260 if (!map && rem) 7261 { 7262 if (var_check_fixed(di->di_flags, arg_errmsg, TRUE) 7263 || var_check_ro(di->di_flags, arg_errmsg, TRUE)) 7264 break; 7265 dictitem_remove(d, di); 7266 } 7267 } 7268 } 7269 hash_unlock(ht); 7270 } 7271 else if (argvars[0].v_type == VAR_BLOB) 7272 { 7273 int i; 7274 typval_T tv; 7275 7276 // set_vim_var_nr() doesn't set the type 7277 set_vim_var_type(VV_KEY, VAR_NUMBER); 7278 7279 for (i = 0; i < b->bv_ga.ga_len; i++) 7280 { 7281 tv.v_type = VAR_NUMBER; 7282 tv.vval.v_number = blob_get(b, i); 7283 set_vim_var_nr(VV_KEY, idx); 7284 if (filter_map_one(&tv, expr, map, &rem) == FAIL || did_emsg) 7285 break; 7286 if (tv.v_type != VAR_NUMBER) 7287 { 7288 emsg(_(e_invalblob)); 7289 break; 7290 } 7291 tv.v_type = VAR_NUMBER; 7292 blob_set(b, i, tv.vval.v_number); 7293 if (!map && rem) 7294 { 7295 char_u *p = (char_u *)argvars[0].vval.v_blob->bv_ga.ga_data; 7296 7297 mch_memmove(p + idx, p + i + 1, 7298 (size_t)b->bv_ga.ga_len - i - 1); 7299 --b->bv_ga.ga_len; 7300 --i; 7301 } 7302 } 7303 } 7304 else // argvars[0].v_type == VAR_LIST 7305 { 7306 // set_vim_var_nr() doesn't set the type 7307 set_vim_var_type(VV_KEY, VAR_NUMBER); 7308 7309 for (li = l->lv_first; li != NULL; li = nli) 7310 { 7311 if (map && var_check_lock(li->li_tv.v_lock, arg_errmsg, TRUE)) 7312 break; 7313 nli = li->li_next; 7314 set_vim_var_nr(VV_KEY, idx); 7315 if (filter_map_one(&li->li_tv, expr, map, &rem) == FAIL 7316 || did_emsg) 7317 break; 7318 if (!map && rem) 7319 listitem_remove(l, li); 7320 ++idx; 7321 } 7322 } 7323 7324 restore_vimvar(VV_KEY, &save_key); 7325 restore_vimvar(VV_VAL, &save_val); 7326 7327 did_emsg |= save_did_emsg; 7328 } 7329 7330 copy_tv(&argvars[0], rettv); 7331 } 7332 7333 #endif /* defined(FEAT_MODIFY_FNAME) || defined(FEAT_EVAL) */ 7334