comparison liboctave/system/file-ops.cc @ 18066:9f6c9f3f1b62

Use gnulib version of canonicalize_file_name across all systems. * configure.ac: Remove check for canonicalize_file_name since it is guaranteed to be supplied by gnulib. * file-ops.cc (octave_canonicalize_file_name): Simplify function by eliminating #ifdef tree and just using gnulib version of function.
author Rik <rik@octave.org>
date Tue, 03 Dec 2013 13:45:46 -0800
parents 49a5a4be04a1
children 073fbe7e6a3a
comparison
equal deleted inserted replaced
18065:5cc67f929d06 18066:9f6c9f3f1b62
687 { 687 {
688 msg = std::string (); 688 msg = std::string ();
689 689
690 std::string retval; 690 std::string retval;
691 691
692 #if defined (HAVE_CANONICALIZE_FILE_NAME)
693
694 char *tmp = gnulib::canonicalize_file_name (name.c_str ()); 692 char *tmp = gnulib::canonicalize_file_name (name.c_str ());
695 693
696 if (tmp) 694 if (tmp)
697 { 695 {
698 retval = tmp; 696 retval = tmp;
699 free (tmp); 697 free (tmp);
700 } 698 }
701 699
702 #elif defined (HAVE_RESOLVEPATH)
703
704 #if !defined (errno)
705 extern int errno;
706 #endif
707
708 #if !defined (__set_errno)
709 # define __set_errno(Val) errno = (Val)
710 #endif
711
712 if (name.empty ())
713 {
714 __set_errno (ENOENT);
715 return retval;
716 }
717
718 // All known hosts with resolvepath (e.g. Solaris 7) don't turn
719 // relative names into absolute ones, so prepend the working
720 // directory if the path is not absolute.
721
722 std::string absolute_name = octave_env::make_absolute (name);
723
724 size_t resolved_size = absolute_name.length ();
725
726 while (true)
727 {
728 resolved_size = 2 * resolved_size + 1;
729
730 OCTAVE_LOCAL_BUFFER (char, resolved, resolved_size);
731
732 int resolved_len
733 = resolvepath (absolute_name.c_str (), resolved, resolved_size);
734
735 if (resolved_len < 0)
736 break;
737
738 if (resolved_len < resolved_size)
739 {
740 retval = resolved;
741 break;
742 }
743 }
744
745 #elif defined (__WIN32__)
746
747 int n = 1024;
748
749 std::string win_path (n, '\0');
750
751 while (true)
752 {
753 int status = GetFullPathName (name.c_str (), n, &win_path[0], 0);
754
755 if (status == 0)
756 break;
757 else if (status < n)
758 {
759 win_path.resize (status);
760 retval = win_path;
761 break;
762 }
763 else
764 {
765 n *= 2;
766 win_path.resize (n);
767 }
768 }
769
770 #elif defined (HAVE_REALPATH)
771
772 #if !defined (__set_errno)
773 # define __set_errno(Val) errno = (Val)
774 #endif
775
776 if (name.empty ())
777 {
778 __set_errno (ENOENT);
779 return retval;
780 }
781
782 OCTAVE_LOCAL_BUFFER (char, buf, PATH_MAX);
783
784 if (::realpath (name.c_str (), buf))
785 retval = buf;
786
787 #else
788
789 // FIXME: provide replacement here...
790 retval = name;
791
792 #endif
793
794 if (retval.empty ()) 700 if (retval.empty ())
795 msg = gnulib::strerror (errno); 701 msg = gnulib::strerror (errno);
796 702
797 return retval; 703 return retval;
798 } 704 }