Mercurial > vim
comparison src/evalfunc.c @ 17377:cb008de2a6ec v8.1.1687
patch 8.1.1687: the evalfunc.c file is too big
commit https://github.com/vim/vim/commit/ecaa70ea29c269dd0dabd3cd5acdfa0ce42ccd54
Author: Bram Moolenaar <Bram@vim.org>
Date: Sun Jul 14 14:55:39 2019 +0200
patch 8.1.1687: the evalfunc.c file is too big
Problem: The evalfunc.c file is too big.
Solution: Move testing support to a separate file.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Sun, 14 Jul 2019 15:00:05 +0200 |
parents | 9843fbfa0ee5 |
children | dfd87ef822aa |
comparison
equal
deleted
inserted
replaced
17376:da3299b8b5c0 | 17377:cb008de2a6ec |
---|---|
39 static void f_appendbufline(typval_T *argvars, typval_T *rettv); | 39 static void f_appendbufline(typval_T *argvars, typval_T *rettv); |
40 static void f_argc(typval_T *argvars, typval_T *rettv); | 40 static void f_argc(typval_T *argvars, typval_T *rettv); |
41 static void f_argidx(typval_T *argvars, typval_T *rettv); | 41 static void f_argidx(typval_T *argvars, typval_T *rettv); |
42 static void f_arglistid(typval_T *argvars, typval_T *rettv); | 42 static void f_arglistid(typval_T *argvars, typval_T *rettv); |
43 static void f_argv(typval_T *argvars, typval_T *rettv); | 43 static void f_argv(typval_T *argvars, typval_T *rettv); |
44 static void f_assert_beeps(typval_T *argvars, typval_T *rettv); | |
45 static void f_assert_equal(typval_T *argvars, typval_T *rettv); | |
46 static void f_assert_equalfile(typval_T *argvars, typval_T *rettv); | |
47 static void f_assert_exception(typval_T *argvars, typval_T *rettv); | |
48 static void f_assert_fails(typval_T *argvars, typval_T *rettv); | |
49 static void f_assert_false(typval_T *argvars, typval_T *rettv); | |
50 static void f_assert_inrange(typval_T *argvars, typval_T *rettv); | |
51 static void f_assert_match(typval_T *argvars, typval_T *rettv); | |
52 static void f_assert_notequal(typval_T *argvars, typval_T *rettv); | |
53 static void f_assert_notmatch(typval_T *argvars, typval_T *rettv); | |
54 static void f_assert_report(typval_T *argvars, typval_T *rettv); | |
55 static void f_assert_true(typval_T *argvars, typval_T *rettv); | |
56 #ifdef FEAT_FLOAT | 44 #ifdef FEAT_FLOAT |
57 static void f_asin(typval_T *argvars, typval_T *rettv); | 45 static void f_asin(typval_T *argvars, typval_T *rettv); |
58 static void f_atan(typval_T *argvars, typval_T *rettv); | 46 static void f_atan(typval_T *argvars, typval_T *rettv); |
59 static void f_atan2(typval_T *argvars, typval_T *rettv); | 47 static void f_atan2(typval_T *argvars, typval_T *rettv); |
60 #endif | 48 #endif |
394 static void f_tabpagenr(typval_T *argvars, typval_T *rettv); | 382 static void f_tabpagenr(typval_T *argvars, typval_T *rettv); |
395 static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv); | 383 static void f_tabpagewinnr(typval_T *argvars, typval_T *rettv); |
396 static void f_taglist(typval_T *argvars, typval_T *rettv); | 384 static void f_taglist(typval_T *argvars, typval_T *rettv); |
397 static void f_tagfiles(typval_T *argvars, typval_T *rettv); | 385 static void f_tagfiles(typval_T *argvars, typval_T *rettv); |
398 static void f_tempname(typval_T *argvars, typval_T *rettv); | 386 static void f_tempname(typval_T *argvars, typval_T *rettv); |
399 static void f_test_alloc_fail(typval_T *argvars, typval_T *rettv); | |
400 static void f_test_autochdir(typval_T *argvars, typval_T *rettv); | |
401 static void f_test_feedinput(typval_T *argvars, typval_T *rettv); | |
402 static void f_test_getvalue(typval_T *argvars, typval_T *rettv); | |
403 static void f_test_option_not_set(typval_T *argvars, typval_T *rettv); | |
404 static void f_test_override(typval_T *argvars, typval_T *rettv); | |
405 static void f_test_refcount(typval_T *argvars, typval_T *rettv); | |
406 static void f_test_garbagecollect_now(typval_T *argvars, typval_T *rettv); | |
407 static void f_test_garbagecollect_soon(typval_T *argvars, typval_T *rettv); | |
408 static void f_test_ignore_error(typval_T *argvars, typval_T *rettv); | |
409 static void f_test_null_blob(typval_T *argvars, typval_T *rettv); | |
410 #ifdef FEAT_JOB_CHANNEL | |
411 static void f_test_null_channel(typval_T *argvars, typval_T *rettv); | |
412 #endif | |
413 static void f_test_null_dict(typval_T *argvars, typval_T *rettv); | |
414 #ifdef FEAT_JOB_CHANNEL | |
415 static void f_test_null_job(typval_T *argvars, typval_T *rettv); | |
416 #endif | |
417 static void f_test_null_list(typval_T *argvars, typval_T *rettv); | |
418 static void f_test_null_partial(typval_T *argvars, typval_T *rettv); | |
419 static void f_test_null_string(typval_T *argvars, typval_T *rettv); | |
420 #ifdef FEAT_GUI | |
421 static void f_test_scrollbar(typval_T *argvars, typval_T *rettv); | |
422 #endif | |
423 #ifdef FEAT_MOUSE | |
424 static void f_test_setmouse(typval_T *argvars, typval_T *rettv); | |
425 #endif | |
426 static void f_test_settime(typval_T *argvars, typval_T *rettv); | |
427 #ifdef FEAT_FLOAT | 387 #ifdef FEAT_FLOAT |
428 static void f_tan(typval_T *argvars, typval_T *rettv); | 388 static void f_tan(typval_T *argvars, typval_T *rettv); |
429 static void f_tanh(typval_T *argvars, typval_T *rettv); | 389 static void f_tanh(typval_T *argvars, typval_T *rettv); |
430 #endif | 390 #endif |
431 #ifdef FEAT_TIMERS | 391 #ifdef FEAT_TIMERS |
1607 } | 1567 } |
1608 else | 1568 else |
1609 get_arglist_as_rettv(ARGLIST, ARGCOUNT, rettv); | 1569 get_arglist_as_rettv(ARGLIST, ARGCOUNT, rettv); |
1610 } | 1570 } |
1611 | 1571 |
1612 /* | |
1613 * "assert_beeps(cmd [, error])" function | |
1614 */ | |
1615 static void | |
1616 f_assert_beeps(typval_T *argvars, typval_T *rettv) | |
1617 { | |
1618 rettv->vval.v_number = assert_beeps(argvars); | |
1619 } | |
1620 | |
1621 /* | |
1622 * "assert_equal(expected, actual[, msg])" function | |
1623 */ | |
1624 static void | |
1625 f_assert_equal(typval_T *argvars, typval_T *rettv) | |
1626 { | |
1627 rettv->vval.v_number = assert_equal_common(argvars, ASSERT_EQUAL); | |
1628 } | |
1629 | |
1630 /* | |
1631 * "assert_equalfile(fname-one, fname-two)" function | |
1632 */ | |
1633 static void | |
1634 f_assert_equalfile(typval_T *argvars, typval_T *rettv) | |
1635 { | |
1636 rettv->vval.v_number = assert_equalfile(argvars); | |
1637 } | |
1638 | |
1639 /* | |
1640 * "assert_notequal(expected, actual[, msg])" function | |
1641 */ | |
1642 static void | |
1643 f_assert_notequal(typval_T *argvars, typval_T *rettv) | |
1644 { | |
1645 rettv->vval.v_number = assert_equal_common(argvars, ASSERT_NOTEQUAL); | |
1646 } | |
1647 | |
1648 /* | |
1649 * "assert_exception(string[, msg])" function | |
1650 */ | |
1651 static void | |
1652 f_assert_exception(typval_T *argvars, typval_T *rettv) | |
1653 { | |
1654 rettv->vval.v_number = assert_exception(argvars); | |
1655 } | |
1656 | |
1657 /* | |
1658 * "assert_fails(cmd [, error[, msg]])" function | |
1659 */ | |
1660 static void | |
1661 f_assert_fails(typval_T *argvars, typval_T *rettv) | |
1662 { | |
1663 rettv->vval.v_number = assert_fails(argvars); | |
1664 } | |
1665 | |
1666 /* | |
1667 * "assert_false(actual[, msg])" function | |
1668 */ | |
1669 static void | |
1670 f_assert_false(typval_T *argvars, typval_T *rettv) | |
1671 { | |
1672 rettv->vval.v_number = assert_bool(argvars, FALSE); | |
1673 } | |
1674 | |
1675 /* | |
1676 * "assert_inrange(lower, upper[, msg])" function | |
1677 */ | |
1678 static void | |
1679 f_assert_inrange(typval_T *argvars, typval_T *rettv) | |
1680 { | |
1681 rettv->vval.v_number = assert_inrange(argvars); | |
1682 } | |
1683 | |
1684 /* | |
1685 * "assert_match(pattern, actual[, msg])" function | |
1686 */ | |
1687 static void | |
1688 f_assert_match(typval_T *argvars, typval_T *rettv) | |
1689 { | |
1690 rettv->vval.v_number = assert_match_common(argvars, ASSERT_MATCH); | |
1691 } | |
1692 | |
1693 /* | |
1694 * "assert_notmatch(pattern, actual[, msg])" function | |
1695 */ | |
1696 static void | |
1697 f_assert_notmatch(typval_T *argvars, typval_T *rettv) | |
1698 { | |
1699 rettv->vval.v_number = assert_match_common(argvars, ASSERT_NOTMATCH); | |
1700 } | |
1701 | |
1702 /* | |
1703 * "assert_report(msg)" function | |
1704 */ | |
1705 static void | |
1706 f_assert_report(typval_T *argvars, typval_T *rettv) | |
1707 { | |
1708 rettv->vval.v_number = assert_report(argvars); | |
1709 } | |
1710 | |
1711 /* | |
1712 * "assert_true(actual[, msg])" function | |
1713 */ | |
1714 static void | |
1715 f_assert_true(typval_T *argvars, typval_T *rettv) | |
1716 { | |
1717 rettv->vval.v_number = assert_bool(argvars, TRUE); | |
1718 } | |
1719 | |
1720 #ifdef FEAT_FLOAT | 1572 #ifdef FEAT_FLOAT |
1721 /* | 1573 /* |
1722 * "asin()" function | 1574 * "asin()" function |
1723 */ | 1575 */ |
1724 static void | 1576 static void |
13545 rettv->vval.v_float = 0.0; | 13397 rettv->vval.v_float = 0.0; |
13546 } | 13398 } |
13547 #endif | 13399 #endif |
13548 | 13400 |
13549 /* | 13401 /* |
13550 * "test_alloc_fail(id, countdown, repeat)" function | |
13551 */ | |
13552 static void | |
13553 f_test_alloc_fail(typval_T *argvars, typval_T *rettv UNUSED) | |
13554 { | |
13555 if (argvars[0].v_type != VAR_NUMBER | |
13556 || argvars[0].vval.v_number <= 0 | |
13557 || argvars[1].v_type != VAR_NUMBER | |
13558 || argvars[1].vval.v_number < 0 | |
13559 || argvars[2].v_type != VAR_NUMBER) | |
13560 emsg(_(e_invarg)); | |
13561 else | |
13562 { | |
13563 alloc_fail_id = argvars[0].vval.v_number; | |
13564 if (alloc_fail_id >= aid_last) | |
13565 emsg(_(e_invarg)); | |
13566 alloc_fail_countdown = argvars[1].vval.v_number; | |
13567 alloc_fail_repeat = argvars[2].vval.v_number; | |
13568 did_outofmem_msg = FALSE; | |
13569 } | |
13570 } | |
13571 | |
13572 /* | |
13573 * "test_autochdir()" | |
13574 */ | |
13575 static void | |
13576 f_test_autochdir(typval_T *argvars UNUSED, typval_T *rettv UNUSED) | |
13577 { | |
13578 #if defined(FEAT_AUTOCHDIR) | |
13579 test_autochdir = TRUE; | |
13580 #endif | |
13581 } | |
13582 | |
13583 /* | |
13584 * "test_feedinput()" | |
13585 */ | |
13586 static void | |
13587 f_test_feedinput(typval_T *argvars, typval_T *rettv UNUSED) | |
13588 { | |
13589 #ifdef USE_INPUT_BUF | |
13590 char_u *val = tv_get_string_chk(&argvars[0]); | |
13591 | |
13592 if (val != NULL) | |
13593 { | |
13594 trash_input_buf(); | |
13595 add_to_input_buf_csi(val, (int)STRLEN(val)); | |
13596 } | |
13597 #endif | |
13598 } | |
13599 | |
13600 /* | |
13601 * "test_getvalue({name})" function | |
13602 */ | |
13603 static void | |
13604 f_test_getvalue(typval_T *argvars, typval_T *rettv) | |
13605 { | |
13606 if (argvars[0].v_type != VAR_STRING) | |
13607 emsg(_(e_invarg)); | |
13608 else | |
13609 { | |
13610 char_u *name = tv_get_string(&argvars[0]); | |
13611 | |
13612 if (STRCMP(name, (char_u *)"need_fileinfo") == 0) | |
13613 rettv->vval.v_number = need_fileinfo; | |
13614 else | |
13615 semsg(_(e_invarg2), name); | |
13616 } | |
13617 } | |
13618 | |
13619 /* | |
13620 * "test_option_not_set({name})" function | |
13621 */ | |
13622 static void | |
13623 f_test_option_not_set(typval_T *argvars, typval_T *rettv UNUSED) | |
13624 { | |
13625 char_u *name = (char_u *)""; | |
13626 | |
13627 if (argvars[0].v_type != VAR_STRING) | |
13628 emsg(_(e_invarg)); | |
13629 else | |
13630 { | |
13631 name = tv_get_string(&argvars[0]); | |
13632 if (reset_option_was_set(name) == FAIL) | |
13633 semsg(_(e_invarg2), name); | |
13634 } | |
13635 } | |
13636 | |
13637 /* | |
13638 * "test_override({name}, {val})" function | |
13639 */ | |
13640 static void | |
13641 f_test_override(typval_T *argvars, typval_T *rettv UNUSED) | |
13642 { | |
13643 char_u *name = (char_u *)""; | |
13644 int val; | |
13645 static int save_starting = -1; | |
13646 | |
13647 if (argvars[0].v_type != VAR_STRING | |
13648 || (argvars[1].v_type) != VAR_NUMBER) | |
13649 emsg(_(e_invarg)); | |
13650 else | |
13651 { | |
13652 name = tv_get_string(&argvars[0]); | |
13653 val = (int)tv_get_number(&argvars[1]); | |
13654 | |
13655 if (STRCMP(name, (char_u *)"redraw") == 0) | |
13656 disable_redraw_for_testing = val; | |
13657 else if (STRCMP(name, (char_u *)"redraw_flag") == 0) | |
13658 ignore_redraw_flag_for_testing = val; | |
13659 else if (STRCMP(name, (char_u *)"char_avail") == 0) | |
13660 disable_char_avail_for_testing = val; | |
13661 else if (STRCMP(name, (char_u *)"starting") == 0) | |
13662 { | |
13663 if (val) | |
13664 { | |
13665 if (save_starting < 0) | |
13666 save_starting = starting; | |
13667 starting = 0; | |
13668 } | |
13669 else | |
13670 { | |
13671 starting = save_starting; | |
13672 save_starting = -1; | |
13673 } | |
13674 } | |
13675 else if (STRCMP(name, (char_u *)"nfa_fail") == 0) | |
13676 nfa_fail_for_testing = val; | |
13677 else if (STRCMP(name, (char_u *)"no_query_mouse") == 0) | |
13678 no_query_mouse_for_testing = val; | |
13679 else if (STRCMP(name, (char_u *)"no_wait_return") == 0) | |
13680 no_wait_return = val; | |
13681 else if (STRCMP(name, (char_u *)"ALL") == 0) | |
13682 { | |
13683 disable_char_avail_for_testing = FALSE; | |
13684 disable_redraw_for_testing = FALSE; | |
13685 ignore_redraw_flag_for_testing = FALSE; | |
13686 nfa_fail_for_testing = FALSE; | |
13687 no_query_mouse_for_testing = FALSE; | |
13688 if (save_starting >= 0) | |
13689 { | |
13690 starting = save_starting; | |
13691 save_starting = -1; | |
13692 } | |
13693 } | |
13694 else | |
13695 semsg(_(e_invarg2), name); | |
13696 } | |
13697 } | |
13698 | |
13699 /* | |
13700 * "test_refcount({expr})" function | |
13701 */ | |
13702 static void | |
13703 f_test_refcount(typval_T *argvars, typval_T *rettv) | |
13704 { | |
13705 int retval = -1; | |
13706 | |
13707 switch (argvars[0].v_type) | |
13708 { | |
13709 case VAR_UNKNOWN: | |
13710 case VAR_NUMBER: | |
13711 case VAR_FLOAT: | |
13712 case VAR_SPECIAL: | |
13713 case VAR_STRING: | |
13714 break; | |
13715 case VAR_JOB: | |
13716 #ifdef FEAT_JOB_CHANNEL | |
13717 if (argvars[0].vval.v_job != NULL) | |
13718 retval = argvars[0].vval.v_job->jv_refcount - 1; | |
13719 #endif | |
13720 break; | |
13721 case VAR_CHANNEL: | |
13722 #ifdef FEAT_JOB_CHANNEL | |
13723 if (argvars[0].vval.v_channel != NULL) | |
13724 retval = argvars[0].vval.v_channel->ch_refcount - 1; | |
13725 #endif | |
13726 break; | |
13727 case VAR_FUNC: | |
13728 if (argvars[0].vval.v_string != NULL) | |
13729 { | |
13730 ufunc_T *fp; | |
13731 | |
13732 fp = find_func(argvars[0].vval.v_string); | |
13733 if (fp != NULL) | |
13734 retval = fp->uf_refcount; | |
13735 } | |
13736 break; | |
13737 case VAR_PARTIAL: | |
13738 if (argvars[0].vval.v_partial != NULL) | |
13739 retval = argvars[0].vval.v_partial->pt_refcount - 1; | |
13740 break; | |
13741 case VAR_BLOB: | |
13742 if (argvars[0].vval.v_blob != NULL) | |
13743 retval = argvars[0].vval.v_blob->bv_refcount - 1; | |
13744 break; | |
13745 case VAR_LIST: | |
13746 if (argvars[0].vval.v_list != NULL) | |
13747 retval = argvars[0].vval.v_list->lv_refcount - 1; | |
13748 break; | |
13749 case VAR_DICT: | |
13750 if (argvars[0].vval.v_dict != NULL) | |
13751 retval = argvars[0].vval.v_dict->dv_refcount - 1; | |
13752 break; | |
13753 } | |
13754 | |
13755 rettv->v_type = VAR_NUMBER; | |
13756 rettv->vval.v_number = retval; | |
13757 | |
13758 } | |
13759 | |
13760 /* | |
13761 * "test_garbagecollect_now()" function | |
13762 */ | |
13763 static void | |
13764 f_test_garbagecollect_now(typval_T *argvars UNUSED, typval_T *rettv UNUSED) | |
13765 { | |
13766 /* This is dangerous, any Lists and Dicts used internally may be freed | |
13767 * while still in use. */ | |
13768 garbage_collect(TRUE); | |
13769 } | |
13770 | |
13771 /* | |
13772 * "test_garbagecollect_soon()" function | |
13773 */ | |
13774 static void | |
13775 f_test_garbagecollect_soon(typval_T *argvars UNUSED, typval_T *rettv UNUSED) | |
13776 { | |
13777 may_garbage_collect = TRUE; | |
13778 } | |
13779 | |
13780 /* | |
13781 * "test_ignore_error()" function | |
13782 */ | |
13783 static void | |
13784 f_test_ignore_error(typval_T *argvars, typval_T *rettv UNUSED) | |
13785 { | |
13786 ignore_error_for_testing(tv_get_string(&argvars[0])); | |
13787 } | |
13788 | |
13789 static void | |
13790 f_test_null_blob(typval_T *argvars UNUSED, typval_T *rettv) | |
13791 { | |
13792 rettv->v_type = VAR_BLOB; | |
13793 rettv->vval.v_blob = NULL; | |
13794 } | |
13795 | |
13796 #ifdef FEAT_JOB_CHANNEL | |
13797 static void | |
13798 f_test_null_channel(typval_T *argvars UNUSED, typval_T *rettv) | |
13799 { | |
13800 rettv->v_type = VAR_CHANNEL; | |
13801 rettv->vval.v_channel = NULL; | |
13802 } | |
13803 #endif | |
13804 | |
13805 static void | |
13806 f_test_null_dict(typval_T *argvars UNUSED, typval_T *rettv) | |
13807 { | |
13808 rettv_dict_set(rettv, NULL); | |
13809 } | |
13810 | |
13811 #ifdef FEAT_JOB_CHANNEL | |
13812 static void | |
13813 f_test_null_job(typval_T *argvars UNUSED, typval_T *rettv) | |
13814 { | |
13815 rettv->v_type = VAR_JOB; | |
13816 rettv->vval.v_job = NULL; | |
13817 } | |
13818 #endif | |
13819 | |
13820 static void | |
13821 f_test_null_list(typval_T *argvars UNUSED, typval_T *rettv) | |
13822 { | |
13823 rettv_list_set(rettv, NULL); | |
13824 } | |
13825 | |
13826 static void | |
13827 f_test_null_partial(typval_T *argvars UNUSED, typval_T *rettv) | |
13828 { | |
13829 rettv->v_type = VAR_PARTIAL; | |
13830 rettv->vval.v_partial = NULL; | |
13831 } | |
13832 | |
13833 static void | |
13834 f_test_null_string(typval_T *argvars UNUSED, typval_T *rettv) | |
13835 { | |
13836 rettv->v_type = VAR_STRING; | |
13837 rettv->vval.v_string = NULL; | |
13838 } | |
13839 | |
13840 #ifdef FEAT_GUI | |
13841 static void | |
13842 f_test_scrollbar(typval_T *argvars, typval_T *rettv UNUSED) | |
13843 { | |
13844 char_u *which; | |
13845 long value; | |
13846 int dragging; | |
13847 scrollbar_T *sb = NULL; | |
13848 | |
13849 if (argvars[0].v_type != VAR_STRING | |
13850 || (argvars[1].v_type) != VAR_NUMBER | |
13851 || (argvars[2].v_type) != VAR_NUMBER) | |
13852 { | |
13853 emsg(_(e_invarg)); | |
13854 return; | |
13855 } | |
13856 which = tv_get_string(&argvars[0]); | |
13857 value = tv_get_number(&argvars[1]); | |
13858 dragging = tv_get_number(&argvars[2]); | |
13859 | |
13860 if (STRCMP(which, "left") == 0) | |
13861 sb = &curwin->w_scrollbars[SBAR_LEFT]; | |
13862 else if (STRCMP(which, "right") == 0) | |
13863 sb = &curwin->w_scrollbars[SBAR_RIGHT]; | |
13864 else if (STRCMP(which, "hor") == 0) | |
13865 sb = &gui.bottom_sbar; | |
13866 if (sb == NULL) | |
13867 { | |
13868 semsg(_(e_invarg2), which); | |
13869 return; | |
13870 } | |
13871 gui_drag_scrollbar(sb, value, dragging); | |
13872 # ifndef USE_ON_FLY_SCROLL | |
13873 // need to loop through normal_cmd() to handle the scroll events | |
13874 exec_normal(FALSE, TRUE, FALSE); | |
13875 # endif | |
13876 } | |
13877 #endif | |
13878 | |
13879 #ifdef FEAT_MOUSE | |
13880 static void | |
13881 f_test_setmouse(typval_T *argvars, typval_T *rettv UNUSED) | |
13882 { | |
13883 mouse_row = (time_t)tv_get_number(&argvars[0]) - 1; | |
13884 mouse_col = (time_t)tv_get_number(&argvars[1]) - 1; | |
13885 } | |
13886 #endif | |
13887 | |
13888 static void | |
13889 f_test_settime(typval_T *argvars, typval_T *rettv UNUSED) | |
13890 { | |
13891 time_for_testing = (time_t)tv_get_number(&argvars[0]); | |
13892 } | |
13893 | |
13894 /* | |
13895 * Get a callback from "arg". It can be a Funcref or a function name. | 13402 * Get a callback from "arg". It can be a Funcref or a function name. |
13896 * When "arg" is zero return an empty string. | 13403 * When "arg" is zero return an empty string. |
13897 * "cb_name" is not allocated. | 13404 * "cb_name" is not allocated. |
13898 * "cb_name" is set to NULL for an invalid argument. | 13405 * "cb_name" is set to NULL for an invalid argument. |
13899 */ | 13406 */ |