MayaChemTools

   1 package ConversionsUtil;
   2 #
   3 # $RCSfile: ConversionsUtil.pm,v $
   4 # $Date: 2015/02/28 20:47:02 $
   5 # $Revision: 1.22 $
   6 #
   7 # Author: Manish Sud <msud@san.rr.com>
   8 #
   9 # Copyright (C) 2015 Manish Sud. All rights reserved.
  10 #
  11 # This file is part of MayaChemTools.
  12 #
  13 # MayaChemTools is free software; you can redistribute it and/or modify it under
  14 # the terms of the GNU Lesser General Public License as published by the Free
  15 # Software Foundation; either version 3 of the License, or (at your option) any
  16 # later version.
  17 #
  18 # MayaChemTools is distributed in the hope that it will be useful, but without
  19 # any warranty; without even the implied warranty of merchantability of fitness
  20 # for a particular purpose.  See the GNU Lesser General Public License for more
  21 # details.
  22 #
  23 # You should have received a copy of the GNU Lesser General Public License
  24 # along with MayaChemTools; if not, see <http://www.gnu.org/licenses/> or
  25 # write to the Free Software Foundation Inc., 59 Temple Place, Suite 330,
  26 # Boston, MA, 02111-1307, USA.
  27 #
  28 
  29 use strict;
  30 use Exporter;
  31 use Constants;
  32 
  33 use vars qw(@ISA @EXPORT @EXPORT_OK %EXPORT_TAGS);
  34 
  35 @ISA = qw(Exporter);
  36 
  37 # Groups of conversion functions...
  38 my(@MathConversions) = qw(DegreesToRadians RadiansToDegrees);
  39 my(@NumericBaseConversions) = qw(BinaryToDecimal DecimalToBinary HexadecimalToDecimal DecimalToHexadecimal OctalToDecimal DecimalToOctal BinaryToHexadecimal HexadecimalToBinary HexadecimalToOctal OctalToHexadecimal StringToBinary StringToHexadecimal);
  40 
  41 # Export all conversion functions...
  42 @EXPORT = (@MathConversions, @NumericBaseConversions);
  43 @EXPORT_OK = qw();
  44 
  45 %EXPORT_TAGS = (
  46                 math => [@MathConversions],
  47                 all  => [@EXPORT, @EXPORT_OK]
  48                );
  49 
  50 
  51 # Degrees to radians...
  52 sub DegreesToRadians ($;$) {
  53   my($Degrees, $IgnoreWrap) = @_;
  54   my($Radians, $WrapValue);
  55 
  56   $WrapValue = (defined($IgnoreWrap) && $IgnoreWrap) ? 0 : 1;
  57   if ($Degrees > 360 && $WrapValue) {
  58     $Degrees = $Degrees % 360;
  59   }
  60   $Radians = ($Degrees * TwoPi) / 360;
  61 
  62   return $Radians;
  63 }
  64 
  65 # Radians to degrees...
  66 sub RadiansToDegrees ($;$) {
  67   my($Radians, $IgnoreWrap) = @_;
  68   my($Degrees, $WrapValue);
  69 
  70   $WrapValue = (defined($IgnoreWrap) && $IgnoreWrap) ? 0 : 1;
  71   $Degrees = ($Radians * 360) / TwoPi;
  72   if ($Degrees > 360 && $WrapValue) {
  73     $Degrees = $Degrees % 360;
  74   }
  75 
  76   return $Degrees;
  77 }
  78 
  79 # Convert a binary string to a decimal number...
  80 sub BinaryToDecimal ($) {
  81   my($Value) = @_;
  82 
  83   if ($Value !~ /^0b/) {
  84     $Value = "0b${Value}";
  85   }
  86   return _ConvertToDecimal($Value);
  87 }
  88 
  89 # Convert a decimal number into a binary string...
  90 sub DecimalToBinary ($) {
  91   my($Value) = @_;
  92 
  93   return sprintf("%b", $Value);
  94 }
  95 
  96 # Convert a hexadecimal string to a decimal number...
  97 sub HexadecimalToDecimal ($) {
  98   my($Value) = @_;
  99 
 100   if ($Value !~ /^0x/) {
 101     $Value = "0x${Value}";
 102   }
 103   return _ConvertToDecimal($Value);
 104 }
 105 
 106 # Convert a decimal number into a hexadecimal string...
 107 sub DecimalToHexadecimal ($) {
 108   my($Value) = @_;
 109 
 110   return sprintf("%x", $Value);
 111 }
 112 
 113 # Convert an octal string to a decimal number...
 114 sub OctalToDecimal ($) {
 115   my($Value) = @_;
 116 
 117   if ($Value !~ /^0/) {
 118     $Value = "0${Value}";
 119   }
 120   return _ConvertToDecimal($Value);
 121 }
 122 
 123 # Convert a decimal number into an octal string...
 124 sub DecimalToOctal ($) {
 125   my($Value) = @_;
 126 
 127   return sprintf("%o", $Value);
 128 }
 129 
 130 # Convert string into a binary string. Going from left to right, two ways of arranging bits
 131 # inside each byte are available: Most Significat Bits (MSB) first or Least Significat Bits (LSB)
 132 # first. Default is MSB corresponding to  descending bits order (PerlSpeak) inside each
 133 # each packed byte (Most singificat bits first).
 134 #
 135 sub StringToBinary ($;$) {
 136   my($Value, $UseReverseBitOrder) = @_;
 137   my($BinTemplate);
 138 
 139   $BinTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'b*' : 'B*';
 140   return unpack($BinTemplate, $Value);
 141 }
 142 
 143 # Convert string into a hexadecimal string. Two ways of arranging nybbles (pair of 4 bits in each
 144 # byte) are available: high nybbles first or low nybbles first. Default is MSB corresponding to high
 145 # nybbles (PerlSpeak) first. Low and high nybbles correspond to pair of a low and high four bits in a byte.
 146 #
 147 sub StringToHexadecimal ($;$) {
 148   my($Value, $UseReverseBitOrder) = @_;
 149   my($HexTemplate);
 150 
 151   $HexTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'h*' : 'H*';
 152   return unpack($HexTemplate, $Value);
 153 }
 154 
 155 # Convert a binary string into a hexadecimal string...
 156 #
 157 sub BinaryToHexadecimal ($;$) {
 158   my($Value, $UseReverseBitOrder) = @_;
 159   my($BinTemplate, $HexTemplate);
 160 
 161   $BinTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'b*' : 'B*';
 162   $HexTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'h*' : 'H*';
 163 
 164   return unpack($HexTemplate, pack($BinTemplate, $Value));
 165 }
 166 
 167 # Convert a hexadecimal string into a binary string...
 168 #
 169 sub HexadecimalToBinary ($;$) {
 170   my($Value, $UseReverseBitOrder) = @_;
 171   my($BinTemplate, $HexTemplate);
 172 
 173   $BinTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'b*' : 'B*';
 174   $HexTemplate = (defined($UseReverseBitOrder) && $UseReverseBitOrder) ? 'h*' : 'H*';
 175 
 176   return unpack($BinTemplate, pack($HexTemplate, $Value));
 177 }
 178 
 179 # Convert a hexadecimal string into a octal string...
 180 #
 181 sub HexadecimalToOctal {
 182   my($Hexadecimal) = @_;
 183 
 184   return DecimalToOctal(HexadecimalToDecimal($Hexadecimal));
 185 }
 186 
 187 # Convert a octal string into a hexadecimal string...
 188 #
 189 sub OctalToHexadecimal {
 190   my($Octal) = @_;
 191 
 192   return DecimalToHexadecimal(OctalToDecimal($Octal));
 193 }
 194 
 195 # Use Perl oct function to convert binary, octal or hexadecimal strings into decimal numbers.
 196 sub _ConvertToDecimal ($) {
 197   my($Value) = @_;
 198 
 199   return ($Value =~ /^0/) ? oct($Value) : $Value;
 200 }
 201