mhonarc-users

Re: NT and MHonArc

1997-09-11 16:10:18
With 5.003 the special variable $^O was introduced.  It's existance (for
older perls) and the NT specific value could be used to determine the
operation system.

Of course, this breaks Perl 4 compatibility.  For Perl 5, I
got the starts of module for dealing with OS dependent stuff.
The current module is attached to this message.

##---------------------------------------------------------------------------##
##  File:
##      @(#)  OSUtil.pm 1.2 96/11/20 @(#)
##  Author:
##      Earl Hood       ehood(_at_)medusa(_dot_)acs(_dot_)uci(_dot_)edu
##  Description:
##      A module for setting varaibles and defining routines
##      to help in OS specific type tasks.
##
##  Note:
##      Mac and VMS are probably not supported correctly.  Any
##      contributions welcome.
##---------------------------------------------------------------------------##
##    Copyright (C) 1996        Earl Hood, 
ehood(_at_)medusa(_dot_)acs(_dot_)uci(_dot_)edu
##
##    This program is free software; you can redistribute it and/or modify
##    it under the terms of the GNU General Public License as published by
##    the Free Software Foundation; either version 2 of the License, or
##    (at your option) any later version.
##
##    This program is distributed in the hope that it will be useful,
##    but WITHOUT ANY WARRANTY; without even the implied warranty of
##    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
##    GNU General Public License for more details.
##
##    You should have received a copy of the GNU General Public License
##    along with this program; if not, write to the Free Software
##    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
##---------------------------------------------------------------------------##

package OSUtil;

use vars qw($VERSION @ISA @EXPORT);
use Config;

use Exporter ();
@ISA = qw( Exporter );

$VERSION = "0.01";

@EXPORT = qw( &CLinit
              $MSDOS $MACOS $UNIX $VMS $WINDOWS
              $DIRSEP $DIRSEPRX $CURDIR
              $PROG $PATHSEP
              $OSType
            );

@EXPORT_OK = qw( &path_join &path_split &is_absolute_path);

##---------------------------------------------------------------------------##
##      BEGIN block.
##
##      Variables set:
##
##          $MSDOS      => Set to 1 if running under MS-DOS/Windows
##          $MACOS      => Set to 1 if running under Mac
##          $UNIX       => Set to 1 if running under Unix
##          $VMS        => Set to 1 if running under VMS
##          $WINDOWS    => Set to 1 if running under Windows
##          $DIRSEP     => Directory separator character
##          $DIRSEPRX   => Directory separator character for use in
##                         regular expressions.
##          $CURDIR     => Value representing current directory
##          $PROG       => Program name with leading pathname component
##                         stripped off.
##          $PATHSEP    => Recommend separator for a list of paths.
##
##      Notes:
##          Do not know what to do about VMS.  Currently treat it
##          like Unix.  Mac stuff may be incorrect.
##
BEGIN {
    %DirSep = (
        macos   => ':',
        msdos   => '\\',
        unix    => '/',
        vms     => '/', # ??
        windows => '\\',
    );
    %CurDir = (
        macos   => ':', # ??
        msdos   => '.',
        unix    => '.',
        vms     => '.', # ??
        windows => '.',
    );
    %PathSep = (
        macos   => ';', # ??
        msdos   => ';',
        unix    => ':',
        vms     => ':', # ??
        windows => ';',
    );

    my $dontknow = 0;

    ## Init variables
    $MACOS      = 0;    $MSDOS  = 0;
    $UNIX       = 0;    $VMS    = 0;
    $WINDOWS    = 0;
    $DIRSEP     = '/';  $CURDIR = '.';
    $PATHSEP    = ':';

    ## See if ostype can be determined from osname in Config
    $_ = $Config{'osname'};
    if (/mac/i) {
        $MACOS = 1;
        $OSType = 'macos';
    } elsif (/vms/i) {
        $VMS = 1;
        $OSType = 'vms';
    } elsif (/msdos/i) {
        $MSDOS = 1;
        $OSType = 'msdos';
    } elsif (/mswin/i) {
        $WINDOWS = 1;  $MSDOS = 1;
        $OSType = 'windows';
    } elsif (/unix/i or
             /aix/i or
             /dynix/i or
             /hpux/i or
             /solaris/i or
             /sunos/i or
             /ultrix/i or
             /linux/i) {
        $UNIX = 1;
        $OSType = 'unix';
    } else {
        $dontknow = 1;
    }

    ## If we do not know now what the ostype is, make a guess.
    if ($dontknow) {
        my($tmp);

        ## MSDOG/Windoze
        if (($tmp = $ENV{'COMSPEC'}) and
            ($tmp =~ /[a-zA-Z]:\\/) and
            (-e $tmp)) {

            $MSDOS = 1;
            if ($tmp =~ /win/i) {
                $WINDOWS = 1;
                $OSType = 'windows';
            } else {
                $OSType = 'msdos';
            }

        ## MacOS
        } elsif (defined($MacPerl::Version)) {
            $MACOS = 1;
            $OSType = 'macos';

        ## Unix (fallback case)
        } else {
            $UNIX = 1;
            $OSType = 'unix';
        }
    }

    ## Set other variables
    $DIRSEP = $DirSep{$OSType};
    $CURDIR = $CurDir{$OSType};
    $PATHSEP = $PathSep{$OSType};
    ($DIRSEPRX = $DIRSEP) =~ s/(\W)/\\$1/g;

    ##  Store name of program
    ($PROG = $0) =~ s%.*[$DIRSEPRX]%%o;

    ##  Flag to prompt for command-line options on a Mac
    $MacCLPrompt = 1;
}

##---------------------------------------------------------------------------##
##      CLinit() initializes @ARGV.  Currently, it does nothing under
##      MSDOS and Unix.
##
##      If running under a Mac and the script is a droplet, command-line
##      options will be prompted for if $MacCLPrompt is set to a
##      non-zero value.
##
sub CLinit {

    ##  Ask for command-line options if script is a Mac droplet
    ##          Code taken from the MacPerl FAQ
    ##
    if ($MacCLPrompt && ( $MacPerl::Version =~ /Application$/ )) {

        # we're running from the app
        my( $cmdLine, @args );
        $cmdLine = &MacPerl::Ask( "Enter command line options:" );
        require "shellwords.pl";
        @args = &shellwords( $cmdLine );
        unshift( @::ARGV, @args );
    }
}

##---------------------------------------------------------------------------##
##      path_join takes an array of path components and returns a string
##      with components joined together by the directoy separator.
##
sub path_join {
    join($DIRSEP, @_);
}

##---------------------------------------------------------------------------##
##      path_split takes a string representing a pathname and splits
##      it into an array of components.  The pathname is interpreted
##      with respect to the OS we are running under.
##
sub path_split {
    split(/$DIRSEPRX/o, $_[0]);
}

##---------------------------------------------------------------------------##
##      is_absolute_path() returns true if a string is an absolute path
##
sub is_absolute_path {

    if ($MSDOS or $WINDOWS) {   ## Path starts with a drive letter
        return $_[0] =~ /^[a-z]:/i;
    }
    if ($MACOS) {               ## Not sure about Mac
        return $_[0] =~ /^$DIRSEPRX/o;
    }
    if ($VMS) {                 ## Not sure about VMS
        return $_[0] =~ /^\w+:/i;
    }
    $_[0] =~ /^$DIRSEPRX/o;     ## Unix
}

##---------------------------------------------------------------------------##
1;
        --ewh
<Prev in Thread] Current Thread [Next in Thread>