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