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\