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