#!/usr/local/bin/perl # # ebcalc - 再計算電卓 # # $Date: 1998/01/28 19:38:25 $ # $Revision: 1.1 $ # # 増井俊之 @ ソニーコンピュータサイエンス研究所 # require 'cbreak2.pl'; &cbreak; $| = 1; while(1){ $s = getc; next if $s eq ''; last if $s eq "\003"; &calculator($s); } &cooked; print "\n"; sub calculator { local($_) = @_; if(/[\d\.]/){ if($prev =~ /=/){ $value = $operator = ''; $exp = $rest = '' unless $undomode; } $arg = '' if $prev !~ /[\d\.]/; $arg .= $_; $exp .= $_ unless $undomode; &display($arg); } elsif(/[\010\177]/){ if($prev =~ /[\d\.\010\177]/ && ! $undomode){ if(length($arg) > 0){ chop($arg); &display($arg); } } else { if(! $undomode){ $undomode = 1; $rest = $d = ''; } if($exp =~ /^(.*[^\d\.])?([\d\.]+)([^\d\.]*)$/){ $exp = $1; $rest = $3.$d.$rest; $d = $2; &display($d); } } } elsif(/[\+\*\-\/]/){ if($undomode){ $undomode = 0; $value = $operator = ''; $exp = $arg; $rest = ''; } unless($prev =~ /=/){ $value = $operator ? eval "$value $operator $arg" : $arg; } $operator = $_; $exp .= $_; &display($value); } elsif(/=/){ if(! $undomode){ $value = eval "$value $operator $arg"; $exp .= $_; &display($value); } else { $expbak = $exp; $restbak = $rest; $t = $exp . $arg . $rest; $exp = $rest = $value = $operator = $arg = ''; $undomode = 0; $prev = ''; while($t =~ s/.//){ &calculator($&); } $exp = $expbak; $rest = $restbak; $undomode = 1; } } elsif(/c/i){ $value = $operator = ''; $exp = $rest = ''; $undomode = 0; &display(0); } $prev = $_; } sub display { local($v) = @_; print "$v\n"; }