Mercurial > octave-nkf
comparison src/ov-usr-fcn.cc @ 4700:ca3a1d687bba
[project @ 2004-01-21 03:28:31 by jwe]
author | jwe |
---|---|
date | Wed, 21 Jan 2004 03:28:32 +0000 |
parents | bd2067547b40 |
children | e1b71baef20c |
comparison
equal
deleted
inserted
replaced
4699:5e2c68946f30 | 4700:ca3a1d687bba |
---|---|
559 octave_user_function::install_automatic_vars (void) | 559 octave_user_function::install_automatic_vars (void) |
560 { | 560 { |
561 if (sym_tab) | 561 if (sym_tab) |
562 { | 562 { |
563 argn_sr = sym_tab->lookup ("argn", true); | 563 argn_sr = sym_tab->lookup ("argn", true); |
564 nargin_sr = sym_tab->lookup ("nargin", true); | 564 nargin_sr = sym_tab->lookup ("__nargin__", true); |
565 nargout_sr = sym_tab->lookup ("nargout", true); | 565 nargout_sr = sym_tab->lookup ("__nargout__", true); |
566 | 566 |
567 if (takes_varargs ()) | 567 if (takes_varargs ()) |
568 varargin_sr = sym_tab->lookup ("varargin", true); | 568 varargin_sr = sym_tab->lookup ("varargin", true); |
569 } | 569 } |
570 } | 570 } |
589 for (int i = 0; i < n; i++) | 589 for (int i = 0; i < n; i++) |
590 varargin(0,i) = va_args(i); | 590 varargin(0,i) = va_args(i); |
591 | 591 |
592 varargin_sr->define (varargin); | 592 varargin_sr->define (varargin); |
593 } | 593 } |
594 } | |
595 | |
596 DEFUN (nargin, args, , | |
597 "-*- texinfo -*-\n\ | |
598 @deftypefn {Built-in Function} {} nargin ()\n\ | |
599 @deftypefnx {Built-in Function} {} nargin (@var{fcn_name})\n\ | |
600 Within a function, return the number of arguments passed to the function.\n\ | |
601 At the top level, return the number of command line arguments passed to\n\ | |
602 Octave. If called with the optional argument @var{fcn_name}, return the\n\ | |
603 maximum number of arguments the named function can accept, or -1 if the\n\ | |
604 function accepts a variable number of arguments.\n\ | |
605 @end deftypefn") | |
606 { | |
607 octave_value retval; | |
608 | |
609 int nargin = args.length (); | |
610 | |
611 if (nargin == 1) | |
612 { | |
613 std::string fname = args(0).string_value (); | |
614 | |
615 if (! error_state) | |
616 { | |
617 octave_user_function *fcn = lookup_user_function (fname); | |
618 | |
619 if (fcn) | |
620 { | |
621 if (fcn->takes_varargs ()) | |
622 retval = -1; | |
623 else | |
624 { | |
625 tree_parameter_list *param_list = fcn->parameter_list (); | |
626 | |
627 retval = param_list ? param_list->length () : 0; | |
628 } | |
629 } | |
630 else | |
631 error ("nargin: invalid function"); | |
632 } | |
633 else | |
634 error ("nargin: expecting string as first argument"); | |
635 } | |
636 else if (nargin == 0) | |
637 { | |
638 symbol_record *sr = curr_sym_tab->lookup ("__nargin__"); | |
639 | |
640 retval = sr ? sr->def () : 0; | |
641 } | |
642 else | |
643 print_usage ("nargin"); | |
644 | |
645 return retval; | |
646 } | |
647 | |
648 DEFUN (nargout, args, , | |
649 "-*- texinfo -*-\n\ | |
650 @deftypefn {Built-in Function} {} nargout ()\n\ | |
651 @deftypefnx {Built-in Function} {} nargout (@var{fcn_name})\n\ | |
652 Within a function, return the number of values the caller expects to\n\ | |
653 receive. If called with the optional argument @var{fcn_name}, return the\n\ | |
654 maximum number of values the named function can produce, or -1 if the\n\ | |
655 function can produce a variable number of values.\n\ | |
656 \n\ | |
657 For example,\n\ | |
658 \n\ | |
659 @example\n\ | |
660 f ()\n\ | |
661 @end example\n\ | |
662 \n\ | |
663 @noindent\n\ | |
664 will cause @code{nargout} to return 0 inside the function code{f} and\n\ | |
665 \n\ | |
666 @example\n\ | |
667 [s, t] = f ()\n\ | |
668 @end example\n\ | |
669 \n\ | |
670 @noindent\n\ | |
671 will cause @code{nargout} to return 2 inside the function\n\ | |
672 @code{f}.\n\ | |
673 \n\ | |
674 At the top level, @code{nargout} is undefined.\n\ | |
675 @end deftypefn") | |
676 { | |
677 octave_value retval; | |
678 | |
679 int nargin = args.length (); | |
680 | |
681 if (nargin == 1) | |
682 { | |
683 std::string fname = args(0).string_value (); | |
684 | |
685 if (! error_state) | |
686 { | |
687 octave_user_function *fcn = lookup_user_function (fname); | |
688 | |
689 if (fcn) | |
690 { | |
691 if (fcn->takes_var_return ()) | |
692 retval = -1; | |
693 else | |
694 { | |
695 tree_parameter_list *ret_list = fcn->return_list (); | |
696 | |
697 retval = ret_list ? ret_list->length () : 0; | |
698 } | |
699 } | |
700 else | |
701 error ("nargout: invalid function"); | |
702 } | |
703 else | |
704 error ("nargout: expecting string as first argument"); | |
705 } | |
706 else if (nargin == 0) | |
707 { | |
708 if (! at_top_level ()) | |
709 { | |
710 symbol_record *sr = curr_sym_tab->lookup ("__nargout__"); | |
711 | |
712 retval = sr ? sr->def () : 0; | |
713 } | |
714 else | |
715 error ("nargout: invalid call at top level"); | |
716 } | |
717 else | |
718 print_usage ("nargout"); | |
719 | |
720 return retval; | |
594 } | 721 } |
595 | 722 |
596 DEFUNX ("va_arg", Fva_arg, args, , | 723 DEFUNX ("va_arg", Fva_arg, args, , |
597 "-*- texinfo -*-\n\ | 724 "-*- texinfo -*-\n\ |
598 @deftypefn {Built-in Function} {} va_arg ()\n\ | 725 @deftypefn {Built-in Function} {} va_arg ()\n\ |