package Statistics::R::Win32; use strict; use warnings; use File::Spec (); use File::DosGlob (); use Env qw( @PATH $PROGRAMFILES ); use vars qw{@ISA @EXPORT}; BEGIN { @ISA = 'Exporter'; @EXPORT = qw{ win32_path_adjust win32_space_quote win32_space_escape win32_double_bs }; } our $PROG = 'R'; =head1 NAME Statistics::R::Win32 - Helper functions for Statistics::R on MS Windows platforms =head1 DESCRIPTION Helper functions to deal with environment variables and escape file paths on MS Windows platforms. =head1 SYNOPSIS if ( $^O =~ m/^(?:.*?win32|dos)$/i ) { require Statistics::R::Win32; } =head1 METHODS =over 4 =item win32_path_adjust( ) Looks for paths where R could be installed, e.g. C:\Program Files (x86)\R-2.1\bin and add it to the PATH environment variable. =item win32_space_quote( ) Takes a path and return a path that is surrounded by double-quotes if the path contains whitespaces. Example: C:\Program Files\R\bin\x64 becomes "C:\Program Files\R\bin\x64" =item win32_space_escape( ) Takes a path and return a path where spaces have been escaped by a backslash. contains whitespaces. Example: C:\Program Files\R\bin\x64 becomes C:\Program\ Files\R\bin\x64 =item win32_double_bs Takes a path and return a path where each backslash was replaced by two backslashes. Example: C:\Program Files\R\bin\x64 becomes C:\\Program Files\\R\\bin\\x64 =back =head1 SEE ALSO =over 4 =item * L =back =head1 AUTHORS Florent Angly Eflorent.angly@gmail.comE (2011 rewrite) Graciliano M. P. Egm@virtuasites.com.brE (original code) =head1 MAINTAINER Brian Cassidy Ebricas@cpan.orgE =head1 COPYRIGHT & LICENSE This program is free software; you can redistribute it and/or modify it under the same terms as Perl itself. =head1 BUGS All complex software has bugs lurking in it, and this program is no exception. If you find a bug, please report it on the CPAN Tracker of Statistics::R: L Bug reports, suggestions and patches are welcome. The Statistics::R code is developed on Github (L) and is under Git revision control. To get the latest revision, run: git clone git@github.com:bricas/statistics-r.git =cut # Adjust PATH environment variable when this module is loaded. win32_path_adjust(); # Find potential R directories in the Windows Program Files folder and # add them to the PATH environment variable. sub win32_path_adjust { # Find potential R directories, e.g. C:\Program Files (x86)\R-2.1\bin # or C:\Program Files\R\bin\x64 my @prog_file_dirs; if (defined $PROGRAMFILES) { push @prog_file_dirs, $PROGRAMFILES; # e.g. C:\Program Files (x86) my ($programfiles_2) = ($PROGRAMFILES =~ m/^(.*) \(/); # e.g. C:\Program Files if ( defined $programfiles_2 and $programfiles_2 ne $PROGRAMFILES ) { push @prog_file_dirs, $programfiles_2; } } # Append R directories to PATH push @PATH, grep { -d $_ } map { # Order is important File::Spec->catdir( $_, 'bin', 'x64' ), File::Spec->catdir( $_, 'bin' ), $_, } map { File::DosGlob::glob( win32_space_escape( win32_double_bs($_) ) ) } map { File::Spec->catdir( $_, $PROG, "$PROG-*" ), File::Spec->catdir( $_, "$PROG-*" ), File::Spec->catdir( $_, $PROG ), } grep { -d $_ } @prog_file_dirs; return 1; } sub win32_space_quote { # Quote a path if it contains whitespaces my $path = shift; $path = '"'.$path.'"' if $path =~ /\s/; return $path; } sub win32_space_escape { # Escape spaces with a single backslash my $path = shift; $path =~ s/ /\\ /g; return $path; } sub win32_double_bs { # Double the backslashes my $path = shift; $path =~ s/\\/\\\\/g; return $path; } 1;