comparison src/evalfunc.c @ 17744:4a3dca734d36 v8.1.1869

patch 8.1.1869: code for the argument list is spread out commit https://github.com/vim/vim/commit/4ad62155a1015751a6645aaecd94b02c94c8934b Author: Bram Moolenaar <Bram@vim.org> Date: Sat Aug 17 14:38:55 2019 +0200 patch 8.1.1869: code for the argument list is spread out Problem: Code for the argument list is spread out. Solution: Put argument list code in arglist.c. (Yegappan Lakshmanan, closes #4819)
author Bram Moolenaar <Bram@vim.org>
date Sat, 17 Aug 2019 14:45:04 +0200
parents 1726c2db81bf
children a7afcea6f40a
comparison
equal deleted inserted replaced
17743:4ca7a477f326 17744:4a3dca734d36
33 #endif 33 #endif
34 static void f_add(typval_T *argvars, typval_T *rettv); 34 static void f_add(typval_T *argvars, typval_T *rettv);
35 static void f_and(typval_T *argvars, typval_T *rettv); 35 static void f_and(typval_T *argvars, typval_T *rettv);
36 static void f_append(typval_T *argvars, typval_T *rettv); 36 static void f_append(typval_T *argvars, typval_T *rettv);
37 static void f_appendbufline(typval_T *argvars, typval_T *rettv); 37 static void f_appendbufline(typval_T *argvars, typval_T *rettv);
38 static void f_argc(typval_T *argvars, typval_T *rettv);
39 static void f_argidx(typval_T *argvars, typval_T *rettv);
40 static void f_arglistid(typval_T *argvars, typval_T *rettv);
41 static void f_argv(typval_T *argvars, typval_T *rettv);
42 #ifdef FEAT_FLOAT 38 #ifdef FEAT_FLOAT
43 static void f_asin(typval_T *argvars, typval_T *rettv); 39 static void f_asin(typval_T *argvars, typval_T *rettv);
44 static void f_atan(typval_T *argvars, typval_T *rettv); 40 static void f_atan(typval_T *argvars, typval_T *rettv);
45 static void f_atan2(typval_T *argvars, typval_T *rettv); 41 static void f_atan2(typval_T *argvars, typval_T *rettv);
46 #endif 42 #endif
1494 lnum = tv_get_lnum_buf(&argvars[1], buf); 1490 lnum = tv_get_lnum_buf(&argvars[1], buf);
1495 set_buffer_lines(buf, lnum, TRUE, &argvars[2], rettv); 1491 set_buffer_lines(buf, lnum, TRUE, &argvars[2], rettv);
1496 } 1492 }
1497 } 1493 }
1498 1494
1499 /*
1500 * "argc([window id])" function
1501 */
1502 static void
1503 f_argc(typval_T *argvars, typval_T *rettv)
1504 {
1505 win_T *wp;
1506
1507 if (argvars[0].v_type == VAR_UNKNOWN)
1508 // use the current window
1509 rettv->vval.v_number = ARGCOUNT;
1510 else if (argvars[0].v_type == VAR_NUMBER
1511 && tv_get_number(&argvars[0]) == -1)
1512 // use the global argument list
1513 rettv->vval.v_number = GARGCOUNT;
1514 else
1515 {
1516 // use the argument list of the specified window
1517 wp = find_win_by_nr_or_id(&argvars[0]);
1518 if (wp != NULL)
1519 rettv->vval.v_number = WARGCOUNT(wp);
1520 else
1521 rettv->vval.v_number = -1;
1522 }
1523 }
1524
1525 /*
1526 * "argidx()" function
1527 */
1528 static void
1529 f_argidx(typval_T *argvars UNUSED, typval_T *rettv)
1530 {
1531 rettv->vval.v_number = curwin->w_arg_idx;
1532 }
1533
1534 /*
1535 * "arglistid()" function
1536 */
1537 static void
1538 f_arglistid(typval_T *argvars, typval_T *rettv)
1539 {
1540 win_T *wp;
1541
1542 rettv->vval.v_number = -1;
1543 wp = find_tabwin(&argvars[0], &argvars[1], NULL);
1544 if (wp != NULL)
1545 rettv->vval.v_number = wp->w_alist->id;
1546 }
1547
1548 /*
1549 * Get the argument list for a given window
1550 */
1551 static void
1552 get_arglist_as_rettv(aentry_T *arglist, int argcount, typval_T *rettv)
1553 {
1554 int idx;
1555
1556 if (rettv_list_alloc(rettv) == OK && arglist != NULL)
1557 for (idx = 0; idx < argcount; ++idx)
1558 list_append_string(rettv->vval.v_list,
1559 alist_name(&arglist[idx]), -1);
1560 }
1561
1562 /*
1563 * "argv(nr)" function
1564 */
1565 static void
1566 f_argv(typval_T *argvars, typval_T *rettv)
1567 {
1568 int idx;
1569 aentry_T *arglist = NULL;
1570 int argcount = -1;
1571
1572 if (argvars[0].v_type != VAR_UNKNOWN)
1573 {
1574 if (argvars[1].v_type == VAR_UNKNOWN)
1575 {
1576 arglist = ARGLIST;
1577 argcount = ARGCOUNT;
1578 }
1579 else if (argvars[1].v_type == VAR_NUMBER
1580 && tv_get_number(&argvars[1]) == -1)
1581 {
1582 arglist = GARGLIST;
1583 argcount = GARGCOUNT;
1584 }
1585 else
1586 {
1587 win_T *wp = find_win_by_nr_or_id(&argvars[1]);
1588
1589 if (wp != NULL)
1590 {
1591 /* Use the argument list of the specified window */
1592 arglist = WARGLIST(wp);
1593 argcount = WARGCOUNT(wp);
1594 }
1595 }
1596
1597 rettv->v_type = VAR_STRING;
1598 rettv->vval.v_string = NULL;
1599 idx = tv_get_number_chk(&argvars[0], NULL);
1600 if (arglist != NULL && idx >= 0 && idx < argcount)
1601 rettv->vval.v_string = vim_strsave(alist_name(&arglist[idx]));
1602 else if (idx == -1)
1603 get_arglist_as_rettv(arglist, argcount, rettv);
1604 }
1605 else
1606 get_arglist_as_rettv(ARGLIST, ARGCOUNT, rettv);
1607 }
1608
1609 #ifdef FEAT_FLOAT 1495 #ifdef FEAT_FLOAT
1610 /* 1496 /*
1611 * "asin()" function 1497 * "asin()" function
1612 */ 1498 */
1613 static void 1499 static void