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