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