1*1258a77dSderaadt# $OpenBSD: math.sed,v 1.2 1996/06/26 05:39:10 deraadt Exp $ 2df930be7Sderaadt# 3df930be7Sderaadt# from: @(#)math.sed 8.1 (Berkeley) 6/6/93 4df930be7Sderaadt# 5df930be7Sderaadt# Addition and multiplication in sed. 6df930be7Sderaadt# ++ for a limited time only do (expr) too!!! 7df930be7Sderaadt# 8df930be7Sderaadt# Kevin S Braunsdorf, PUCC UNIX Group, ksb@cc.purdue.edu. 9df930be7Sderaadt# 10df930be7Sderaadt# Ex: 11df930be7Sderaadt# echo "4+7*3" | sed -f %f 12df930be7Sderaadt 13df930be7Sderaadt# make sure the expression is well formed 14df930be7Sderaadts/[ ]//g 15df930be7Sderaadt/[+*\/-]$/{ 16df930be7Sderaadt a\ 17df930be7Sderaadt poorly formed expression, operator on the end 18df930be7Sderaadt q 19df930be7Sderaadt} 20df930be7Sderaadt/^[+*\/]/{ 21df930be7Sderaadt a\ 22df930be7Sderaadt poorly formed expression, leading operator 23df930be7Sderaadt q 24df930be7Sderaadt} 25df930be7Sderaadt 26df930be7Sderaadt# fill hold space with done token 27df930be7Sderaadtx 28df930be7Sderaadts/^.*/done/ 29df930be7Sderaadtx 30df930be7Sderaadt 31df930be7Sderaadt# main loop, process operators (*, + and () ) 32df930be7Sderaadt: loop 33df930be7Sderaadt/^\+/{ 34df930be7Sderaadt s/// 35df930be7Sderaadt b loop 36df930be7Sderaadt} 37df930be7Sderaadt/^\(.*\)(\([^)]*\))\(.*\)$/{ 38df930be7Sderaadt H 39df930be7Sderaadt s//\2/ 40df930be7Sderaadt x 41df930be7Sderaadt s/^\(.*\)\n\(.*\)(\([^()]*\))\(.*\)$/()\2@\4@\1/ 42df930be7Sderaadt x 43df930be7Sderaadt b loop 44df930be7Sderaadt} 45df930be7Sderaadt/^[0-9]*\*/b mul 46df930be7Sderaadt/^\([0-9]*\)\+\([0-9+*]*\*[0-9]*\)$/{ 47df930be7Sderaadt s//\2+\1/ 48df930be7Sderaadt b loop 49df930be7Sderaadt} 50df930be7Sderaadt/^[0-9]*\+/{ 51df930be7Sderaadt s/$/=/ 52df930be7Sderaadt b add 53df930be7Sderaadt} 54df930be7Sderaadtx 55df930be7Sderaadt/^done$/{ 56df930be7Sderaadt x 57df930be7Sderaadt p 58df930be7Sderaadt d 59df930be7Sderaadt} 60df930be7Sderaadt/^()/{ 61df930be7Sderaadt s/// 62df930be7Sderaadt x 63df930be7Sderaadt G 64df930be7Sderaadt s/\(.*\)\n\([^@]*\)@\([^@]*\)@\(.*\)/\2\1\3/ 65df930be7Sderaadt x 66df930be7Sderaadt s/[^@]*@[^@]*@\(.*\)/\1/ 67df930be7Sderaadt x 68df930be7Sderaadt b loop 69df930be7Sderaadt} 70df930be7Sderaadti\ 71df930be7Sderaadthelp, stack problem 72df930be7Sderaadtp 73df930be7Sderaadtx 74df930be7Sderaadtp 75df930be7Sderaadtq 76df930be7Sderaadt 77df930be7Sderaadt# turn mul into add until 1*x -> x 78df930be7Sderaadt: mul 79df930be7Sderaadt/^0*1\*/{ 80df930be7Sderaadt s/// 81df930be7Sderaadt b loop 82df930be7Sderaadt} 83df930be7Sderaadt/^\([0-9]*\)0\*/{ 84df930be7Sderaadt s/^\([0-9]*\)0\*\([0-9]*\)/\1*\20/ 85df930be7Sderaadt b mul 86df930be7Sderaadt} 87df930be7Sderaadts/^\([0-9]*\)1\*/\10*/ 88df930be7Sderaadts/^\([0-9]*\)2\*/\11*/ 89df930be7Sderaadts/^\([0-9]*\)3\*/\12*/ 90df930be7Sderaadts/^\([0-9]*\)4\*/\13*/ 91df930be7Sderaadts/^\([0-9]*\)5\*/\14*/ 92df930be7Sderaadts/^\([0-9]*\)6\*/\15*/ 93df930be7Sderaadts/^\([0-9]*\)7\*/\16*/ 94df930be7Sderaadts/^\([0-9]*\)8\*/\17*/ 95df930be7Sderaadts/^\([0-9]*\)9\*/\18*/ 96df930be7Sderaadts/\*\([0-9*]*\)/*\1+\1/ 97df930be7Sderaadtb mul 98df930be7Sderaadt 99df930be7Sderaadt# get rid of a plus term until 0+x -> x 100df930be7Sderaadt: add 101df930be7Sderaadt/^\+\([0-9+*]*\)=/{ 102df930be7Sderaadt s//\1/ 103df930be7Sderaadt b loop 104df930be7Sderaadt} 105df930be7Sderaadt/^\([0-9*]*\)\+=/{ 106df930be7Sderaadt s//\1/ 107df930be7Sderaadt b loop 108df930be7Sderaadt} 109df930be7Sderaadt/^\([0-9]*\)\+\([0-9*+]*\)\+=/{ 110df930be7Sderaadt s//\2+\1/ 111df930be7Sderaadt b loop 112df930be7Sderaadt} 113df930be7Sderaadt/^\([0-9]*\)0\+\([0-9]*\)\([0-9]\)=/{ 114df930be7Sderaadt s//\1+\2=\3/ 115df930be7Sderaadt b add 116df930be7Sderaadt} 117df930be7Sderaadt/^\([0-9]*\)\([0-9]\)\+\([0-9]*\)0=/{ 118df930be7Sderaadt s//\1+\3=\2/ 119df930be7Sderaadt b add 120df930be7Sderaadt} 121df930be7Sderaadt/^\([0-9]*\)0\+\([0-9*+]*\)\+\([0-9]*\)\([0-9]\)=/{ 122df930be7Sderaadt s//\1+\2+\3=\4/ 123df930be7Sderaadt b add 124df930be7Sderaadt} 125df930be7Sderaadt/^\([0-9]*\)\([0-9]\)\+\([0-9*+]*\)\+\([0-9]*\)0=/{ 126df930be7Sderaadt s//\1+\3+\4=\2/ 127df930be7Sderaadt b add 128df930be7Sderaadt} 129df930be7Sderaadts/^\([0-9]*\)1\+/\10+/ 130df930be7Sderaadts/^\([0-9]*\)2\+/\11+/ 131df930be7Sderaadts/^\([0-9]*\)3\+/\12+/ 132df930be7Sderaadts/^\([0-9]*\)4\+/\13+/ 133df930be7Sderaadts/^\([0-9]*\)5\+/\14+/ 134df930be7Sderaadts/^\([0-9]*\)6\+/\15+/ 135df930be7Sderaadts/^\([0-9]*\)7\+/\16+/ 136df930be7Sderaadts/^\([0-9]*\)8\+/\17+/ 137df930be7Sderaadts/^\([0-9]*\)9\+/\18+/ 138df930be7Sderaadt 139df930be7Sderaadts/9=\([0-9]*\)$/_=\1/ 140df930be7Sderaadts/8=\([0-9]*\)$/9=\1/ 141df930be7Sderaadts/7=\([0-9]*\)$/8=\1/ 142df930be7Sderaadts/6=\([0-9]*\)$/7=\1/ 143df930be7Sderaadts/5=\([0-9]*\)$/6=\1/ 144df930be7Sderaadts/4=\([0-9]*\)$/5=\1/ 145df930be7Sderaadts/3=\([0-9]*\)$/4=\1/ 146df930be7Sderaadts/2=\([0-9]*\)$/3=\1/ 147df930be7Sderaadts/1=\([0-9]*\)$/2=\1/ 148df930be7Sderaadt/_/{ 149df930be7Sderaadt s//_0/ 150df930be7Sderaadt : inc 151df930be7Sderaadt s/9_/_0/ 152df930be7Sderaadt s/8_/9/ 153df930be7Sderaadt s/7_/8/ 154df930be7Sderaadt s/6_/7/ 155df930be7Sderaadt s/5_/6/ 156df930be7Sderaadt s/4_/5/ 157df930be7Sderaadt s/3_/4/ 158df930be7Sderaadt s/2_/3/ 159df930be7Sderaadt s/1_/2/ 160df930be7Sderaadt s/0_/1/ 161df930be7Sderaadt s/\+_/+1/ 162df930be7Sderaadt /_/b inc 163df930be7Sderaadt} 164df930be7Sderaadtb add 165