math.sed revision 1590
11590Srgrimes#
21590Srgrimes#	@(#)math.sed	8.1 (Berkeley) 6/6/93
31590Srgrimes#
41590Srgrimes# Addition and multiplication in sed.
51590Srgrimes# ++ for a limited time only do (expr) too!!!
61590Srgrimes#
71590Srgrimes# Kevin S Braunsdorf, PUCC UNIX Group, ksb@cc.purdue.edu.
81590Srgrimes#
91590Srgrimes# Ex:
101590Srgrimes#	echo "4+7*3" | sed -f %f
111590Srgrimes
121590Srgrimes# make sure the expression is well formed
131590Srgrimess/[ 	]//g
141590Srgrimes/[+*\/-]$/{
151590Srgrimes	a\
161590Srgrimes	poorly formed expression, operator on the end
171590Srgrimes	q
181590Srgrimes}
191590Srgrimes/^[+*\/]/{
201590Srgrimes	a\
211590Srgrimes	poorly formed expression, leading operator
221590Srgrimes	q
231590Srgrimes}
241590Srgrimes
251590Srgrimes# fill hold space with done token
261590Srgrimesx
271590Srgrimess/^.*/done/
281590Srgrimesx
291590Srgrimes
301590Srgrimes# main loop, process operators (*, + and () )
311590Srgrimes: loop
321590Srgrimes/^\+/{
331590Srgrimes	s///
341590Srgrimes	b loop
351590Srgrimes}
361590Srgrimes/^\(.*\)(\([^)]*\))\(.*\)$/{
371590Srgrimes	H
381590Srgrimes	s//\2/
391590Srgrimes	x
401590Srgrimes	s/^\(.*\)\n\(.*\)(\([^()]*\))\(.*\)$/()\2@\4@\1/
411590Srgrimes	x
421590Srgrimes	b loop
431590Srgrimes}
441590Srgrimes/^[0-9]*\*/b mul
451590Srgrimes/^\([0-9]*\)\+\([0-9+*]*\*[0-9]*\)$/{
461590Srgrimes	s//\2+\1/
471590Srgrimes	b loop
481590Srgrimes}
491590Srgrimes/^[0-9]*\+/{
501590Srgrimes	s/$/=/
511590Srgrimes	b add
521590Srgrimes}
531590Srgrimesx
541590Srgrimes/^done$/{
551590Srgrimes	x
561590Srgrimes	p
571590Srgrimes	d
581590Srgrimes}
591590Srgrimes/^()/{
601590Srgrimes	s///
611590Srgrimes	x
621590Srgrimes	G
631590Srgrimes	s/\(.*\)\n\([^@]*\)@\([^@]*\)@\(.*\)/\2\1\3/
641590Srgrimes	x
651590Srgrimes	s/[^@]*@[^@]*@\(.*\)/\1/
661590Srgrimes	x
671590Srgrimes	b loop
681590Srgrimes}
691590Srgrimesi\
701590Srgrimeshelp, stack problem
711590Srgrimesp
721590Srgrimesx
731590Srgrimesp
741590Srgrimesq
751590Srgrimes
761590Srgrimes# turn mul into add until 1*x -> x
771590Srgrimes: mul
781590Srgrimes/^0*1\*/{
791590Srgrimes	s///
801590Srgrimes	b loop
811590Srgrimes}
821590Srgrimes/^\([0-9]*\)0\*/{
831590Srgrimes	s/^\([0-9]*\)0\*\([0-9]*\)/\1*\20/
841590Srgrimes	b mul
851590Srgrimes}
861590Srgrimess/^\([0-9]*\)1\*/\10*/
871590Srgrimess/^\([0-9]*\)2\*/\11*/
881590Srgrimess/^\([0-9]*\)3\*/\12*/
891590Srgrimess/^\([0-9]*\)4\*/\13*/
901590Srgrimess/^\([0-9]*\)5\*/\14*/
911590Srgrimess/^\([0-9]*\)6\*/\15*/
921590Srgrimess/^\([0-9]*\)7\*/\16*/
931590Srgrimess/^\([0-9]*\)8\*/\17*/
941590Srgrimess/^\([0-9]*\)9\*/\18*/
951590Srgrimess/\*\([0-9*]*\)/*\1+\1/
961590Srgrimesb mul
971590Srgrimes
981590Srgrimes# get rid of a plus term until 0+x -> x
991590Srgrimes: add
1001590Srgrimes/^\+\([0-9+*]*\)=/{
1011590Srgrimes	s//\1/
1021590Srgrimes	b loop
1031590Srgrimes}
1041590Srgrimes/^\([0-9*]*\)\+=/{
1051590Srgrimes	s//\1/
1061590Srgrimes	b loop
1071590Srgrimes}
1081590Srgrimes/^\([0-9]*\)\+\([0-9*+]*\)\+=/{
1091590Srgrimes	s//\2+\1/
1101590Srgrimes	b loop
1111590Srgrimes}
1121590Srgrimes/^\([0-9]*\)0\+\([0-9]*\)\([0-9]\)=/{
1131590Srgrimes	s//\1+\2=\3/
1141590Srgrimes	b add
1151590Srgrimes}
1161590Srgrimes/^\([0-9]*\)\([0-9]\)\+\([0-9]*\)0=/{
1171590Srgrimes	s//\1+\3=\2/
1181590Srgrimes	b add
1191590Srgrimes}
1201590Srgrimes/^\([0-9]*\)0\+\([0-9*+]*\)\+\([0-9]*\)\([0-9]\)=/{
1211590Srgrimes	s//\1+\2+\3=\4/
1221590Srgrimes	b add
1231590Srgrimes}
1241590Srgrimes/^\([0-9]*\)\([0-9]\)\+\([0-9*+]*\)\+\([0-9]*\)0=/{
1251590Srgrimes	s//\1+\3+\4=\2/
1261590Srgrimes	b add
1271590Srgrimes}
1281590Srgrimess/^\([0-9]*\)1\+/\10+/
1291590Srgrimess/^\([0-9]*\)2\+/\11+/
1301590Srgrimess/^\([0-9]*\)3\+/\12+/
1311590Srgrimess/^\([0-9]*\)4\+/\13+/
1321590Srgrimess/^\([0-9]*\)5\+/\14+/
1331590Srgrimess/^\([0-9]*\)6\+/\15+/
1341590Srgrimess/^\([0-9]*\)7\+/\16+/
1351590Srgrimess/^\([0-9]*\)8\+/\17+/
1361590Srgrimess/^\([0-9]*\)9\+/\18+/
1371590Srgrimes
1381590Srgrimess/9=\([0-9]*\)$/_=\1/
1391590Srgrimess/8=\([0-9]*\)$/9=\1/
1401590Srgrimess/7=\([0-9]*\)$/8=\1/
1411590Srgrimess/6=\([0-9]*\)$/7=\1/
1421590Srgrimess/5=\([0-9]*\)$/6=\1/
1431590Srgrimess/4=\([0-9]*\)$/5=\1/
1441590Srgrimess/3=\([0-9]*\)$/4=\1/
1451590Srgrimess/2=\([0-9]*\)$/3=\1/
1461590Srgrimess/1=\([0-9]*\)$/2=\1/
1471590Srgrimes/_/{
1481590Srgrimes	s//_0/
1491590Srgrimes	: inc
1501590Srgrimes	s/9_/_0/
1511590Srgrimes	s/8_/9/
1521590Srgrimes	s/7_/8/
1531590Srgrimes	s/6_/7/
1541590Srgrimes	s/5_/6/
1551590Srgrimes	s/4_/5/
1561590Srgrimes	s/3_/4/
1571590Srgrimes	s/2_/3/
1581590Srgrimes	s/1_/2/
1591590Srgrimes	s/0_/1/
1601590Srgrimes	s/\+_/+1/
1611590Srgrimes	/_/b inc
1621590Srgrimes}
1631590Srgrimesb add
164