release 1.09.6
[descalc.git] / unitconv.pm
1 # unit convertor for DCT, by Shiar
2
3 # 1.09.1 2004-10-02 23:05 - moved %unit specs from 1.9 main
4 # 1.09.2 2004-10-11 22:05 - all code moved here as well
5
6 use strict;
7 use utf8;
8
9 my %unit;
10
11 {
12 my $i = 0;
13 $unit{$_->[0]} = { name=>$_->[0], type=>$i, val=>$_->[1] }
14 for map {$i++; @$_} (
15         [
16                 ['m', 1],
17                 ['cm', .01],
18                 ['mm', .001],
19                 ['km', 1000],
20                 ['ft', .3048],
21                 ['in', .0254],
22                 ['yd', .9144],
23                 ['mile', 1609.344],
24                 ['nmile', 1852],
25                 ['lyr', 9.46052840488e+15],
26                 ['mil', 2.54e-5],
27         #               _m _cm _mm _yd _ft _in _Mpc _pc _lyr _au _km _mi
28         #               _nmi _miUS _chain _rd _fath _ftUS _Mil _μ _Å _fermi
29         ], # lengths
30         [
31                 ['m^3', 1],
32                 ['cm^3', 1e-6],
33                 ['ft^3', .028316846592],
34                 ['in^3', 1.6387064e-5],
35         ], # volume
36 );
37 } # create unit table
38
39 $action{_m} = [0, sub {print "test\n"}];
40
41 push @{ $hook{precmd} }, sub {
42         if ($_ =~ /^_/) {{
43                 $_ = $unit{substr $_, 1} or next;
44                 if (exists $val{unit} and $val{unit}{type}==$_->{type}) {
45                         unshift @stack, $val{i} if defined $val{i};
46                         $stack[0] *= delete($val{unit})->{val} / $_->{val};
47                         showstack();
48                         %val = (i=>undef, frac=>0);
49                 } # convert
50                 else {
51                         $val{unit} = $_;
52                 } # set source unit
53                 return 1;
54         }} # conversion
55 }; # precmd
56
57 push @{ $hook{showentry} }, sub {
58         exists $val{unit} && '_'.$val{unit}{name};
59 }; # showentry
60
61 1;
62