165 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Sed
		
	
	
	
	
	
			
		
		
	
	
			165 lines
		
	
	
		
			2.3 KiB
		
	
	
	
		
			Sed
		
	
	
	
	
	
#
 | 
						|
#	from: @(#)math.sed	8.1 (Berkeley) 6/6/93
 | 
						|
#	$NetBSD: math.sed,v 1.3 1997/01/09 20:21:36 tls Exp $
 | 
						|
#
 | 
						|
# Addition and multiplication in sed.
 | 
						|
# ++ for a limited time only do (expr) too!!!
 | 
						|
#
 | 
						|
# Kevin S Braunsdorf, PUCC UNIX Group, ksb@cc.purdue.edu.
 | 
						|
#
 | 
						|
# Ex:
 | 
						|
#	echo "4+7*3" | sed -f %f
 | 
						|
 | 
						|
# make sure the expression is well formed
 | 
						|
s/[ 	]//g
 | 
						|
/[+*\/-]$/{
 | 
						|
	a\
 | 
						|
	poorly formed expression, operator on the end
 | 
						|
	q
 | 
						|
}
 | 
						|
/^[+*\/]/{
 | 
						|
	a\
 | 
						|
	poorly formed expression, leading operator
 | 
						|
	q
 | 
						|
}
 | 
						|
 | 
						|
# fill hold space with done token
 | 
						|
x
 | 
						|
s/^.*/done/
 | 
						|
x
 | 
						|
 | 
						|
# main loop, process operators (*, + and () )
 | 
						|
: loop
 | 
						|
/^\+/{
 | 
						|
	s///
 | 
						|
	b loop
 | 
						|
}
 | 
						|
/^\(.*\)(\([^)]*\))\(.*\)$/{
 | 
						|
	H
 | 
						|
	s//\2/
 | 
						|
	x
 | 
						|
	s/^\(.*\)\n\(.*\)(\([^()]*\))\(.*\)$/()\2@\4@\1/
 | 
						|
	x
 | 
						|
	b loop
 | 
						|
}
 | 
						|
/^[0-9]*\*/b mul
 | 
						|
/^\([0-9]*\)\+\([0-9+*]*\*[0-9]*\)$/{
 | 
						|
	s//\2+\1/
 | 
						|
	b loop
 | 
						|
}
 | 
						|
/^[0-9]*\+/{
 | 
						|
	s/$/=/
 | 
						|
	b add
 | 
						|
}
 | 
						|
x
 | 
						|
/^done$/{
 | 
						|
	x
 | 
						|
	p
 | 
						|
	d
 | 
						|
}
 | 
						|
/^()/{
 | 
						|
	s///
 | 
						|
	x
 | 
						|
	G
 | 
						|
	s/\(.*\)\n\([^@]*\)@\([^@]*\)@\(.*\)/\2\1\3/
 | 
						|
	x
 | 
						|
	s/[^@]*@[^@]*@\(.*\)/\1/
 | 
						|
	x
 | 
						|
	b loop
 | 
						|
}
 | 
						|
i\
 | 
						|
help, stack problem
 | 
						|
p
 | 
						|
x
 | 
						|
p
 | 
						|
q
 | 
						|
 | 
						|
# turn mul into add until 1*x -> x
 | 
						|
: mul
 | 
						|
/^0*1\*/{
 | 
						|
	s///
 | 
						|
	b loop
 | 
						|
}
 | 
						|
/^\([0-9]*\)0\*/{
 | 
						|
	s/^\([0-9]*\)0\*\([0-9]*\)/\1*\20/
 | 
						|
	b mul
 | 
						|
}
 | 
						|
s/^\([0-9]*\)1\*/\10*/
 | 
						|
s/^\([0-9]*\)2\*/\11*/
 | 
						|
s/^\([0-9]*\)3\*/\12*/
 | 
						|
s/^\([0-9]*\)4\*/\13*/
 | 
						|
s/^\([0-9]*\)5\*/\14*/
 | 
						|
s/^\([0-9]*\)6\*/\15*/
 | 
						|
s/^\([0-9]*\)7\*/\16*/
 | 
						|
s/^\([0-9]*\)8\*/\17*/
 | 
						|
s/^\([0-9]*\)9\*/\18*/
 | 
						|
s/\*\([0-9*]*\)/*\1+\1/
 | 
						|
b mul
 | 
						|
 | 
						|
# get rid of a plus term until 0+x -> x
 | 
						|
: add
 | 
						|
/^\+\([0-9+*]*\)=/{
 | 
						|
	s//\1/
 | 
						|
	b loop
 | 
						|
}
 | 
						|
/^\([0-9*]*\)\+=/{
 | 
						|
	s//\1/
 | 
						|
	b loop
 | 
						|
}
 | 
						|
/^\([0-9]*\)\+\([0-9*+]*\)\+=/{
 | 
						|
	s//\2+\1/
 | 
						|
	b loop
 | 
						|
}
 | 
						|
/^\([0-9]*\)0\+\([0-9]*\)\([0-9]\)=/{
 | 
						|
	s//\1+\2=\3/
 | 
						|
	b add
 | 
						|
}
 | 
						|
/^\([0-9]*\)\([0-9]\)\+\([0-9]*\)0=/{
 | 
						|
	s//\1+\3=\2/
 | 
						|
	b add
 | 
						|
}
 | 
						|
/^\([0-9]*\)0\+\([0-9*+]*\)\+\([0-9]*\)\([0-9]\)=/{
 | 
						|
	s//\1+\2+\3=\4/
 | 
						|
	b add
 | 
						|
}
 | 
						|
/^\([0-9]*\)\([0-9]\)\+\([0-9*+]*\)\+\([0-9]*\)0=/{
 | 
						|
	s//\1+\3+\4=\2/
 | 
						|
	b add
 | 
						|
}
 | 
						|
s/^\([0-9]*\)1\+/\10+/
 | 
						|
s/^\([0-9]*\)2\+/\11+/
 | 
						|
s/^\([0-9]*\)3\+/\12+/
 | 
						|
s/^\([0-9]*\)4\+/\13+/
 | 
						|
s/^\([0-9]*\)5\+/\14+/
 | 
						|
s/^\([0-9]*\)6\+/\15+/
 | 
						|
s/^\([0-9]*\)7\+/\16+/
 | 
						|
s/^\([0-9]*\)8\+/\17+/
 | 
						|
s/^\([0-9]*\)9\+/\18+/
 | 
						|
 | 
						|
s/9=\([0-9]*\)$/_=\1/
 | 
						|
s/8=\([0-9]*\)$/9=\1/
 | 
						|
s/7=\([0-9]*\)$/8=\1/
 | 
						|
s/6=\([0-9]*\)$/7=\1/
 | 
						|
s/5=\([0-9]*\)$/6=\1/
 | 
						|
s/4=\([0-9]*\)$/5=\1/
 | 
						|
s/3=\([0-9]*\)$/4=\1/
 | 
						|
s/2=\([0-9]*\)$/3=\1/
 | 
						|
s/1=\([0-9]*\)$/2=\1/
 | 
						|
/_/{
 | 
						|
	s//_0/
 | 
						|
	: inc
 | 
						|
	s/9_/_0/
 | 
						|
	s/8_/9/
 | 
						|
	s/7_/8/
 | 
						|
	s/6_/7/
 | 
						|
	s/5_/6/
 | 
						|
	s/4_/5/
 | 
						|
	s/3_/4/
 | 
						|
	s/2_/3/
 | 
						|
	s/1_/2/
 | 
						|
	s/0_/1/
 | 
						|
	s/\+_/+1/
 | 
						|
	/_/b inc
 | 
						|
}
 | 
						|
b add
 |