#!/usr/bin/perl # -*- perl -*- # Copyright 2001 DJ Delorie push(@INC, split(':', $ENV{'PATH'})); push(@INC, "/home/apache/bin"); require "cgi-lib.pl"; &ReadParse; $| = 1; # Internally everything is in inches $units_name = ""; $units_scale = 1; $fracdenom = 32; sub frac { my ($val) = @_; my $rv; if ($units_scale != 1) { $v = sprintf("%.2f", $val * $units_scale); $v =~ s/\.?0*$//; return sprintf("%s %s", $v, $units_name); } my $inch = int($val); my $sx = int(($val - $inch + 1/($fracdenom*2+1)) * $fracdenom); my $d = $fracdenom; if ($sx == $d) { $sx = 0; $inch ++; } while ($sx && $sx % 2 == 0) { $sx = $sx/2; $d /= 2; } if ($inch && $sx) { $rv = "$inch ${sx}/$d\""; } elsif ($inch) { $rv ="$inch\""; } else { $rv = "${sx}/$d\""; } if ($val > 12) { my $feet = int($val / 12.0); $val -= $feet * 12.0; if ($val > 1.0/$fracdenom) { $rv .= sprintf(" (%d' %s)", $feet, &frac($val)); } else { $rv .= sprintf(" (%d')", $feet); } } return $rv; } %units_scale = ("in", 1, "mm", 25.4, "cm", 2.54); sub unfrac { my($val) = @_; $val =~ s/[\r\n\s\t]+/ /g; $val =~ s/^ //; $val =~ s/ $//; if ($val =~ m@([^a-z]*)([a-z]*)$@) { ($val,$new_units) = ($1,$2); if ($units_scale{$new_units}) { $units_name = $new_units; $units_scale = $units_scale{$new_units}; } } if ($val =~ m@(-?\d+)[-+ ](\d+)/(\d+)@) { ($i, $n, $d) = ($1, $2, $3); } elsif ($val =~ m@(-?\d+)/(\d+)@) { ($i, $n, $d) = (0, $1, $2); } else { ($i, $n, $d) = ($val, 0, 1); } if ($d == 0) { $n = 0; $d = 1; } return ($i + $n / $d) / $units_scale; } 1;