summaryrefslogtreecommitdiff
path: root/ACE/MPC/modules/WinVersionTranslator.pm
blob: ff82a7d2a3ed47b62860c1653996f293aa134b97 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package WinVersionTranslator;

# ************************************************************
# Description   : Translate the version value for Windows.
#                 Windows can not handle letters in the version
#                 and truncates anything after \d+\.\d+.  We
#                 will convert letters to numbers, retain
#                 trailing numbers and everything else will be
#                 converted to a zero.
#
#                 ex. 1.4.3  => 1.403
#                     1.4a.5 => 1.4005
#                     1.4b.4 => 1.4104
#
# Author        : Chad Elliott
# Create Date   : 10/7/2004
# ************************************************************

# ************************************************************
# Pragmas
# ************************************************************

use strict;

# ************************************************************
# Subroutine Section
# ************************************************************

sub translate {
  my $version = shift;

  ## See if the version contains something other than numbers followed by
  ## a decimal point and numbers.
  if ($version =~ /^(\d+\.\d+)([^\d].*)$/) {
    $version = $1;
    my $post = $2;
    my $length = length($post);

    ## Convert the non-conforming value to all numbers
    for(my $i = 0; $i < $length; ++$i) {
      my $ch = substr($post, $i, 1);
      if ($ch =~ /[a-z]/i) {
        my $digit = ord(lc($ch)) - ord('a');
        $version .= $digit;
      }
      elsif ($ch =~ /\d/) {
        $version .= $ch;
      }
      else {
        $version .= '0';
      }
    }

    ## If we have a good version number we need to make sure that the
    ## minor version number does not exceed the value of a short unsigned
    ## integer.
    if ($version =~ /(\d+)\.(\d+)/) {
      my($major, $minor) = ($1, $2);
      $minor =~ s/^\d+\.//;
      while($minor > 65535) {
        $minor = substr($minor, 0, length($minor) - 1);
      }
      $version = $major . '.' . $minor;
    }
  }
  return $version;
}

1;