comparison liboctave/file-ops.cc @ 10252:2fcc927a8757

liboctave/file-ops.h: avoid gnulib #define for canonicalize_file_name
author John W. Eaton <jwe@octave.org>
date Wed, 03 Feb 2010 03:42:08 -0500
parents 2d47356a7a1a
children 323c9cbbd02a
comparison
equal deleted inserted replaced
10251:28e5a5f826bc 10252:2fcc927a8757
357 ? dir + file 357 ? dir + file
358 : dir + dir_sep_char () + file); 358 : dir + dir_sep_char () + file);
359 } 359 }
360 360
361 361
362 std::string
363 file_ops::canonicalize_file_name (const std::string& name)
364 {
365 std::string msg;
366 return canonicalize_file_name (name, msg);
367 }
368
369 std::string
370 file_ops::canonicalize_file_name (const std::string& name, std::string& msg)
371 {
372 msg = std::string ();
373
374 std::string retval;
375
376 #if defined (HAVE_CANONICALIZE_FILE_NAME)
377
378 char *tmp = ::canonicalize_file_name (name.c_str ());
379
380 if (tmp)
381 {
382 retval = tmp;
383 free (tmp);
384 }
385
386 #elif defined (HAVE_RESOLVEPATH)
387
388 #if !defined (errno)
389 extern int errno;
390 #endif
391
392 #if !defined (__set_errno)
393 # define __set_errno(Val) errno = (Val)
394 #endif
395
396 if (name.empty ())
397 {
398 __set_errno (ENOENT);
399 return retval;
400 }
401
402 // All known hosts with resolvepath (e.g. Solaris 7) don't turn
403 // relative names into absolute ones, so prepend the working
404 // directory if the path is not absolute.
405
406 std::string absolute_name = octave_env::make_absolute (name);
407
408 size_t resolved_size = absolute_name.length ();
409
410 while (true)
411 {
412 resolved_size = 2 * resolved_size + 1;
413
414 OCTAVE_LOCAL_BUFFER (char, resolved, resolved_size);
415
416 int resolved_len
417 = resolvepath (absolute_name.c_str (), resolved, resolved_size);
418
419 if (resolved_len < 0)
420 break;
421
422 if (resolved_len < resolved_size)
423 {
424 retval = resolved;
425 break;
426 }
427 }
428
429 #elif defined (__WIN32__)
430
431 int n = 1024;
432
433 std::string win_path (n, '\0');
434
435 while (true)
436 {
437 int status = GetFullPathName (name.c_str (), n, &win_path[0], 0);
438
439 if (status == 0)
440 break;
441 else if (status < n)
442 {
443 win_path.resize (status);
444 retval = win_path;
445 break;
446 }
447 else
448 {
449 n *= 2;
450 win_path.resize (n);
451 }
452 }
453
454 #elif defined (HAVE_REALPATH)
455
456 #if !defined (__set_errno)
457 # define __set_errno(Val) errno = (Val)
458 #endif
459
460 if (name.empty ())
461 {
462 __set_errno (ENOENT);
463 return retval;
464 }
465
466 OCTAVE_LOCAL_BUFFER (char, buf, PATH_MAX);
467
468 if (::realpath (name.c_str (), buf))
469 retval = buf;
470
471 #else
472
473 // FIXME -- provide replacement here...
474 retval = name;
475
476 #endif
477
478 if (retval.empty ())
479 {
480 using namespace std;
481 msg = strerror (errno);
482 }
483
484 return retval;
485 }
486
487 int 362 int
488 octave_mkdir (const std::string& nm, mode_t md) 363 octave_mkdir (const std::string& nm, mode_t md)
489 { 364 {
490 std::string msg; 365 std::string msg;
491 return octave_mkdir (nm, md, msg); 366 return octave_mkdir (nm, md, msg);
820 msg = strerror (errno); 695 msg = strerror (errno);
821 } 696 }
822 697
823 return retval; 698 return retval;
824 } 699 }
700
701 std::string
702 octave_canonicalize_file_name (const std::string& name)
703 {
704 std::string msg;
705 return octave_canonicalize_file_name (name, msg);
706 }
707
708 std::string
709 octave_canonicalize_file_name (const std::string& name, std::string& msg)
710 {
711 msg = std::string ();
712
713 std::string retval;
714
715 #if defined (HAVE_CANONICALIZE_FILE_NAME)
716
717 char *tmp = ::canonicalize_file_name (name.c_str ());
718
719 if (tmp)
720 {
721 retval = tmp;
722 free (tmp);
723 }
724
725 #elif defined (HAVE_RESOLVEPATH)
726
727 #if !defined (errno)
728 extern int errno;
729 #endif
730
731 #if !defined (__set_errno)
732 # define __set_errno(Val) errno = (Val)
733 #endif
734
735 if (name.empty ())
736 {
737 __set_errno (ENOENT);
738 return retval;
739 }
740
741 // All known hosts with resolvepath (e.g. Solaris 7) don't turn
742 // relative names into absolute ones, so prepend the working
743 // directory if the path is not absolute.
744
745 std::string absolute_name = octave_env::make_absolute (name);
746
747 size_t resolved_size = absolute_name.length ();
748
749 while (true)
750 {
751 resolved_size = 2 * resolved_size + 1;
752
753 OCTAVE_LOCAL_BUFFER (char, resolved, resolved_size);
754
755 int resolved_len
756 = resolvepath (absolute_name.c_str (), resolved, resolved_size);
757
758 if (resolved_len < 0)
759 break;
760
761 if (resolved_len < resolved_size)
762 {
763 retval = resolved;
764 break;
765 }
766 }
767
768 #elif defined (__WIN32__)
769
770 int n = 1024;
771
772 std::string win_path (n, '\0');
773
774 while (true)
775 {
776 int status = GetFullPathName (name.c_str (), n, &win_path[0], 0);
777
778 if (status == 0)
779 break;
780 else if (status < n)
781 {
782 win_path.resize (status);
783 retval = win_path;
784 break;
785 }
786 else
787 {
788 n *= 2;
789 win_path.resize (n);
790 }
791 }
792
793 #elif defined (HAVE_REALPATH)
794
795 #if !defined (__set_errno)
796 # define __set_errno(Val) errno = (Val)
797 #endif
798
799 if (name.empty ())
800 {
801 __set_errno (ENOENT);
802 return retval;
803 }
804
805 OCTAVE_LOCAL_BUFFER (char, buf, PATH_MAX);
806
807 if (::realpath (name.c_str (), buf))
808 retval = buf;
809
810 #else
811
812 // FIXME -- provide replacement here...
813 retval = name;
814
815 #endif
816
817 if (retval.empty ())
818 {
819 using namespace std;
820 msg = strerror (errno);
821 }
822
823 return retval;
824 }
825