Mercurial > octave
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 } |