comparison libinterp/octave-value/ov-fcn-inline.cc @ 20615:729a85dafba8

use new string_value method to handle value extraction errors * ov-class.cc, ov-classdef.cc, ov-fcn-handle.cc, ov-fcn-inline.cc, ov.cc, pt-idx.cc: Use new string_value method.
author John W. Eaton <jwe@octave.org>
date Thu, 08 Oct 2015 17:55:57 -0400
parents f90c8372b7ba
children
comparison
equal deleted inserted replaced
20614:10ec79b47808 20615:729a85dafba8
679 679
680 int nargin = args.length (); 680 int nargin = args.length ();
681 681
682 if (nargin > 0) 682 if (nargin > 0)
683 { 683 {
684 if (args(0).is_string ()) 684 std::string fun = args(0).string_value ("inline: STR argument must be a string");
685
686 string_vector fargs;
687
688 if (nargin == 1)
685 { 689 {
686 std::string fun = args(0).string_value (); 690 bool is_arg = false;
687 string_vector fargs; 691 bool in_string = false;
688 692 std::string tmp_arg;
689 if (nargin == 1) 693 size_t i = 0;
694 size_t fun_length = fun.length ();
695
696 while (i < fun_length)
690 { 697 {
691 bool is_arg = false; 698 bool terminate_arg = false;
692 bool in_string = false; 699 char c = fun[i++];
693 std::string tmp_arg; 700
694 size_t i = 0; 701 if (in_string)
695 size_t fun_length = fun.length ();
696
697 while (i < fun_length)
698 { 702 {
699 bool terminate_arg = false; 703 if (c == '\'' || c == '\"')
700 char c = fun[i++]; 704 in_string = false;
701 705 }
702 if (in_string) 706 else if (c == '\'' || c == '\"')
703 { 707 {
704 if (c == '\'' || c == '\"') 708 in_string = true;
705 in_string = false; 709 if (is_arg)
706 } 710 terminate_arg = true;
707 else if (c == '\'' || c == '\"') 711 }
708 { 712 else if (! isalpha (c) && c != '_')
709 in_string = true; 713 if (! is_arg)
710 if (is_arg) 714 continue;
711 terminate_arg = true; 715 else if (isdigit (c))
712 } 716 tmp_arg.append (1, c);
713 else if (! isalpha (c) && c != '_') 717 else
714 if (! is_arg) 718 {
715 continue; 719 // Before we do anything remove trailing whitespaces.
716 else if (isdigit (c)) 720 while (i < fun_length && isspace (c))
717 tmp_arg.append (1, c); 721 c = fun[i++];
722
723 // Do we have a variable or a function?
724 if (c != '(')
725 terminate_arg = true;
718 else 726 else
719 { 727 {
720 // Before we do anything remove trailing whitespaces. 728 tmp_arg = std::string ();
721 while (i < fun_length && isspace (c)) 729 is_arg = false;
722 c = fun[i++];
723
724 // Do we have a variable or a function?
725 if (c != '(')
726 terminate_arg = true;
727 else
728 {
729 tmp_arg = std::string ();
730 is_arg = false;
731 }
732 } 730 }
733 else if (! is_arg) 731 }
732 else if (! is_arg)
733 {
734 if (c == 'e' || c == 'E')
734 { 735 {
735 if (c == 'e' || c == 'E') 736 // possible number in exponent form, not arg
736 { 737 if (isdigit (fun[i])
737 // possible number in exponent form, not arg 738 || fun[i] == '-' || fun[i] == '+')
738 if (isdigit (fun[i]) 739 continue;
739 || fun[i] == '-' || fun[i] == '+')
740 continue;
741 }
742 is_arg = true;
743 tmp_arg.append (1, c);
744 } 740 }
745 else 741 is_arg = true;
742 tmp_arg.append (1, c);
743 }
744 else
745 {
746 tmp_arg.append (1, c);
747 }
748
749 if (terminate_arg || (i == fun_length && is_arg))
750 {
751 bool have_arg = false;
752
753 for (int j = 0; j < fargs.numel (); j++)
754 if (tmp_arg == fargs (j))
755 {
756 have_arg = true;
757 break;
758 }
759
760 if (! have_arg && tmp_arg != "i" && tmp_arg != "j"
761 && tmp_arg != "NaN" && tmp_arg != "nan"
762 && tmp_arg != "Inf" && tmp_arg != "inf"
763 && tmp_arg != "NA" && tmp_arg != "pi"
764 && tmp_arg != "e" && tmp_arg != "eps")
765 fargs.append (tmp_arg);
766
767 tmp_arg = std::string ();
768 is_arg = false;
769 }
770 }
771
772 // Sort the arguments into ascii order.
773 fargs.sort ();
774
775 if (fargs.numel () == 0)
776 fargs.append (std::string ("x"));
777
778 }
779 else if (nargin == 2 && args(1).is_numeric_type ())
780 {
781 if (! args(1).is_scalar_type ())
782 {
783 error ("inline: N must be an integer");
784 return retval;
785 }
786
787 int n = args(1).int_value ();
788
789 if (! error_state)
790 {
791 if (n >= 0)
792 {
793 fargs.resize (n+1);
794
795 fargs(0) = "x";
796
797 for (int i = 1; i < n+1; i++)
746 { 798 {
747 tmp_arg.append (1, c); 799 std::ostringstream buf;
748 } 800 buf << "P" << i;
749 801 fargs(i) = buf.str ();
750 if (terminate_arg || (i == fun_length && is_arg))
751 {
752 bool have_arg = false;
753
754 for (int j = 0; j < fargs.numel (); j++)
755 if (tmp_arg == fargs (j))
756 {
757 have_arg = true;
758 break;
759 }
760
761 if (! have_arg && tmp_arg != "i" && tmp_arg != "j"
762 && tmp_arg != "NaN" && tmp_arg != "nan"
763 && tmp_arg != "Inf" && tmp_arg != "inf"
764 && tmp_arg != "NA" && tmp_arg != "pi"
765 && tmp_arg != "e" && tmp_arg != "eps")
766 fargs.append (tmp_arg);
767
768 tmp_arg = std::string ();
769 is_arg = false;
770 }
771 }
772
773 // Sort the arguments into ascii order.
774 fargs.sort ();
775
776 if (fargs.numel () == 0)
777 fargs.append (std::string ("x"));
778
779 }
780 else if (nargin == 2 && args(1).is_numeric_type ())
781 {
782 if (! args(1).is_scalar_type ())
783 {
784 error ("inline: N must be an integer");
785 return retval;
786 }
787
788 int n = args(1).int_value ();
789
790 if (! error_state)
791 {
792 if (n >= 0)
793 {
794 fargs.resize (n+1);
795
796 fargs(0) = "x";
797
798 for (int i = 1; i < n+1; i++)
799 {
800 std::ostringstream buf;
801 buf << "P" << i;
802 fargs(i) = buf.str ();
803 }
804 }
805 else
806 {
807 error ("inline: N must be a positive integer or zero");
808 return retval;
809 } 802 }
810 } 803 }
811 else 804 else
812 { 805 {
813 error ("inline: N must be an integer"); 806 error ("inline: N must be a positive integer or zero");
814 return retval; 807 return retval;
815 } 808 }
816 } 809 }
817 else 810 else
818 { 811 {
819 fargs.resize (nargin - 1); 812 error ("inline: N must be an integer");
820 813 return retval;
821 for (int i = 1; i < nargin; i++)
822 {
823 if (args(i).is_string ())
824 {
825 std::string s = args(i).string_value ();
826 fargs(i-1) = s;
827 }
828 else
829 {
830 error ("inline: expecting string arguments");
831 return retval;
832 }
833 }
834 } 814 }
835
836 retval = octave_value (new octave_fcn_inline (fun, fargs));
837 } 815 }
838 else 816 else
839 error ("inline: STR argument must be a string"); 817 {
818 fargs.resize (nargin - 1);
819
820 for (int i = 1; i < nargin; i++)
821 {
822 std::string s = args(i).string_value ("inline: expecting string arguments");
823 fargs(i-1) = s;
824 }
825 }
826
827 retval = octave_value (new octave_fcn_inline (fun, fargs));
840 } 828 }
841 else 829 else
842 print_usage (); 830 print_usage ();
843 831
844 return retval; 832 return retval;