254 lines
13 KiB
Rexx
Executable File
254 lines
13 KiB
Rexx
Executable File
/*----------------------------------------------------------------------------*/
|
||
/* */
|
||
/* Copyright (c) 1995, 2004 IBM Corporation. All rights reserved. */
|
||
/* Copyright (c) 2005-2014 Rexx Language Association. All rights reserved. */
|
||
/* */
|
||
/* This program and the accompanying materials are made available under */
|
||
/* the terms of the Common Public License v1.0 which accompanies this */
|
||
/* distribution. A copy is also available at the following address: */
|
||
/* https://www.oorexx.org/license.html */
|
||
/* */
|
||
/* Redistribution and use in source and binary forms, with or */
|
||
/* without modification, are permitted provided that the following */
|
||
/* conditions are met: */
|
||
/* */
|
||
/* Redistributions of source code must retain the above copyright */
|
||
/* notice, this list of conditions and the following disclaimer. */
|
||
/* Redistributions in binary form must reproduce the above copyright */
|
||
/* notice, this list of conditions and the following disclaimer in */
|
||
/* the documentation and/or other materials provided with the distribution. */
|
||
/* */
|
||
/* Neither the name of Rexx Language Association nor the names */
|
||
/* of its contributors may be used to endorse or promote products */
|
||
/* derived from this software without specific prior written permission. */
|
||
/* */
|
||
/* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS */
|
||
/* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT */
|
||
/* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS */
|
||
/* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT */
|
||
/* OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, */
|
||
/* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED */
|
||
/* TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, */
|
||
/* OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY */
|
||
/* OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING */
|
||
/* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS */
|
||
/* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */
|
||
/* */
|
||
/*----------------------------------------------------------------------------*/
|
||
/*****************************************************************************/
|
||
/* Name: DRIVES.REX */
|
||
/* Type: Open Object Rexx Script */
|
||
/* */
|
||
/* Description: Sample program to display information about drives using the */
|
||
/* Open Object Rexx utility functions SysDriveMap, SysDriveInfo,*/
|
||
/* SysFileSystemType, SysBootDrive */
|
||
/* */
|
||
/*****************************************************************************/
|
||
|
||
|
||
/*****************************************************************************/
|
||
/* Main Programm */
|
||
/*****************************************************************************/
|
||
parse arg InputDrives -- get the input --
|
||
--
|
||
Drives. = "" -- initialize Drives stem --
|
||
--
|
||
call CheckInput -- check input --
|
||
--
|
||
call InfoParsing -- get and parse the drive data --
|
||
call InfoDisplay "BOX" -- display data with box characters --
|
||
--call InfoDisplay "LINE" -- display data without box characters --
|
||
|
||
exit
|
||
|
||
/*****************************************************************************/
|
||
/* Procedure : InfoParsing */
|
||
/* */
|
||
/* Description : Get the informations of each drive using the Object REXX */
|
||
/* utility functions. */
|
||
/* */
|
||
/* Parameters : EXPOSE: Drives. - stem to hold all drives informations */
|
||
/* */
|
||
/*****************************************************************************/
|
||
InfoParsing: PROCEDURE EXPOSE Drives.
|
||
|
||
UsedDrives = SysDriveMap() -- get all used drives --
|
||
--
|
||
RemoteDrives = SysDriveMap(, 'REMOTE') -- get all remote drives --
|
||
--
|
||
do i = 1 to Drives.0 -- loop over all drives --
|
||
DriveInfo = SysDriveInfo(Drives.i.InputLetter) -- get drive information --
|
||
--
|
||
parse var DriveInfo, -- parse ... --
|
||
Drives.i.OutputLetter, -- drive letter --
|
||
Drives.i.Free, -- free space --
|
||
Drives.i.Total, -- total space --
|
||
Drives.i.Label -- label --
|
||
--
|
||
Drives.i.Label = strip(Drives.i.Label) -- eliminate spaces --
|
||
Drives.i.Free = BeautifyNumber(Drives.i.Free) -- enhance readability of --
|
||
Drives.i.Total = BeautifyNumber(Drives.i.Total) -- the numbers --
|
||
|
||
if Drives.i.OutputLetter = "" & pos(Drives.i.InputLetter, UsedDrives) >0 then do
|
||
-- This is a CD-ROM drive, set the label and the drive letter
|
||
Drives.i.Label = "CD-ROM"
|
||
Drives.i.OutputLetter = Drives.i.InputLetter
|
||
end
|
||
else do
|
||
-- if no available drive set all information data to unknown
|
||
if pos(Drives.i.InputLetter, UsedDrives) = 0 then do
|
||
Drives.i.OutputLetter = Drives.i.InputLetter
|
||
Drives.i.Label = "Unknown-Drive"
|
||
Drives.i.Free = "???"
|
||
Drives.i.Total = "???"
|
||
Drives.i.Location = "???"
|
||
Drives.i.Filesys = "???"
|
||
end
|
||
else do
|
||
-- check for remote or local drive
|
||
if pos(Drives.i.OutputLetter, RemoteDrives) > 0 then
|
||
Drives.i.Location = "remote"
|
||
else
|
||
Drives.i.Location = "local"
|
||
-- get the file system
|
||
Drives.i.Filesys = SysFileSystemType(Drives.i.OutputLetter)
|
||
end
|
||
end
|
||
end
|
||
|
||
return
|
||
|
||
|
||
/*****************************************************************************/
|
||
/* */
|
||
/* Procedure : CheckInput */
|
||
/* */
|
||
/* Description : if no input specified, get all available drives */
|
||
/* parse the input string and ignore all characters which are */
|
||
/* not alphanumeric */
|
||
/* save all alphanumeric characters to "Drives" stem */
|
||
/* */
|
||
/* Parameters : EXPOSE : InputDrives - string from the input */
|
||
/* Drives. - stem for dirves information */
|
||
/* */
|
||
/*****************************************************************************/
|
||
|
||
CheckInput: PROCEDURE EXPOSE InputDrives Drives.
|
||
|
||
|
||
if InputDrives = "" then
|
||
InputDrives = SysDriveMap()
|
||
|
||
InputDrives = translate(InputDrives,' ', ':')
|
||
j = 1
|
||
do i = 1 to length(InputDrives)
|
||
Drive = substr(InputDrives,i,1)
|
||
if datatype(Drive,'A') = 1 then
|
||
if datatype(Drive,'N') = 0 then do
|
||
Drives.j.InputLetter = translate(Drive) || ":"
|
||
Drives.0 = j
|
||
j = j + 1
|
||
end
|
||
end
|
||
|
||
return
|
||
|
||
|
||
/*****************************************************************************/
|
||
/* */
|
||
/* Procedure : BeautifyNumber */
|
||
/* */
|
||
/* Description : Insert dots to the numer for better readability like : */
|
||
/* 2.000.000 instead of 2000000 */
|
||
/* */
|
||
/* Parameters : in : Number - number to be beautified */
|
||
/* return : beautified number */
|
||
/* */
|
||
/*****************************************************************************/
|
||
BeautifyNumber: PROCEDURE
|
||
|
||
use arg Number
|
||
|
||
do i = (length(Number)-3) to 1 by -3
|
||
Number = insert('.', Number, i)
|
||
end
|
||
|
||
return Number
|
||
|
||
|
||
/*****************************************************************************/
|
||
/* */
|
||
/* Procedure : InfoDisplay */
|
||
/* */
|
||
/* Description : Display all drive information in a well formatted form */
|
||
/* */
|
||
/* Parameters : EXPOSE : Drives. - stem which hold all drive information */
|
||
/* in : DisplayType : "BOX" - use box characters */
|
||
/* "" - use box characters */
|
||
/* "LINE" - use '-' */
|
||
/* and '|' */
|
||
/* */
|
||
/*****************************************************************************/
|
||
InfoDisplay: PROCEDURE EXPOSE Drives.
|
||
|
||
use arg DisplayType
|
||
|
||
-- set the lines for drawing in dependency of the dislay type
|
||
if DisplayType = "BOX" | type = "" then do
|
||
-- use box characters to display vertical and horizontal lines
|
||
DisplayType = "BOX"
|
||
HorizontalLine = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ŀ"
|
||
MidleLine = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>Ĵ"
|
||
EndLine = "<EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>"
|
||
Vb = "<EFBFBD>" -- verical bar character
|
||
end
|
||
else do
|
||
-- use '-' and '|' characters to draw vertical and horizontal lines
|
||
HorizontalLine = copies("-", 76)
|
||
Vb = "|"
|
||
end
|
||
|
||
-- display and format the drive information
|
||
say HorizontalLine
|
||
|
||
say Vb || CENTER('Drive' ,5) ||,
|
||
Vb || CENTER('Free' ,16) ||,
|
||
Vb || CENTER('Total',16) ||,
|
||
Vb || CENTER('Label',14) ||,
|
||
Vb || CENTER('Location',8) ||,
|
||
Vb || CENTER('Filesystem',10)||,
|
||
Vb
|
||
|
||
if DisplayType = "BOX" then HorizontalLine = MidleLine
|
||
|
||
say HorizontalLine
|
||
|
||
do i=1 to Drives.0
|
||
say Vb || CENTER(Drives.i.OutputLetter,5)||,
|
||
Vb || right(Drives.i.Free,15) ,
|
||
Vb || RIGHT(Drives.i.Total,15) ,
|
||
Vb LEFT(Drives.i.Label,13) ||,
|
||
Vb LEFT(Drives.i.Location,7) ||,
|
||
Vb LEFT(Drives.i.Filesys,9) ||,
|
||
Vb
|
||
end
|
||
|
||
if DisplayType = "BOX" then HorizontalLine = EndLine
|
||
|
||
say HorizontalLine
|
||
|
||
-- display additional information
|
||
RamDrives = SysDriveMap(,'RAMDISK')
|
||
if RamDrives = "" then RamDrives = "No RAM Drives"
|
||
|
||
say ""
|
||
say "Operating System Version : "SysVersion()
|
||
say "Bootdrive : "SysBootDrive()
|
||
say "Used drives : "SysDriveMap(,'USED')
|
||
say "Local drives : "SysDriveMap(,'LOCAL')
|
||
say "RAM drives : "RamDrives
|
||
say "Remote drives : "SysDriveMap(,'REMOTE')
|
||
say "Drive letters not used : "SysDriveMap(,'FREE')
|
||
|
||
return
|