#!/usr/bin/perl
# -*- perl -*-
# Copyright 2001 DJ Delorie <dj@delorie.com>

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;
