2 # @(#)math.sed 8.1 (Berkeley) 6/6/93
4 # Addition and multiplication in sed.
5 # ++ for a limited time only do (expr) too!!!
7 # Kevin S Braunsdorf, PUCC UNIX Group, ksb@cc.purdue.edu.
10 # echo "4+7*3" | sed -f %f
12 # make sure the expression is well formed
16 poorly formed expression, operator on the end
21 poorly formed expression, leading operator
25 # fill hold space with done token
30 # main loop, process operators (*, + and () )
36 /^\(.*\)(\([^)]*\))\(.*\)$/{
40 s/^\(.*\)\n\(.*\)(\([^()]*\))\(.*\)$/()\2@\4@\1/
45 /^\([0-9]*\)\+\([0-9+*]*\*[0-9]*\)$/{
63 s/\(.*\)\n\([^@]*\)@\([^@]*\)@\(.*\)/\2\1\3/
65 s/[^@]*@[^@]*@\(.*\)/\1/
76 # turn mul into add until 1*x -> x
83 s/^\([0-9]*\)0\*\([0-9]*\)/\1*\20/
86 s/^\([0-9]*\)1\*/\10*/
87 s/^\([0-9]*\)2\*/\11*/
88 s/^\([0-9]*\)3\*/\12*/
89 s/^\([0-9]*\)4\*/\13*/
90 s/^\([0-9]*\)5\*/\14*/
91 s/^\([0-9]*\)6\*/\15*/
92 s/^\([0-9]*\)7\*/\16*/
93 s/^\([0-9]*\)8\*/\17*/
94 s/^\([0-9]*\)9\*/\18*/
95 s/\*\([0-9*]*\)/*\1+\1/
98 # get rid of a plus term until 0+x -> x
108 /^\([0-9]*\)\+\([0-9*+]*\)\+=/{
112 /^\([0-9]*\)0\+\([0-9]*\)\([0-9]\)=/{
116 /^\([0-9]*\)\([0-9]\)\+\([0-9]*\)0=/{
120 /^\([0-9]*\)0\+\([0-9*+]*\)\+\([0-9]*\)\([0-9]\)=/{
124 /^\([0-9]*\)\([0-9]\)\+\([0-9*+]*\)\+\([0-9]*\)0=/{
128 s/^\([0-9]*\)1\+/\10+/
129 s/^\([0-9]*\)2\+/\11+/
130 s/^\([0-9]*\)3\+/\12+/
131 s/^\([0-9]*\)4\+/\13+/
132 s/^\([0-9]*\)5\+/\14+/
133 s/^\([0-9]*\)6\+/\15+/
134 s/^\([0-9]*\)7\+/\16+/
135 s/^\([0-9]*\)8\+/\17+/
136 s/^\([0-9]*\)9\+/\18+/
138 s/9=\([0-9]*\)$/_=\1/
139 s/8=\([0-9]*\)$/9=\1/
140 s/7=\([0-9]*\)$/8=\1/
141 s/6=\([0-9]*\)$/7=\1/
142 s/5=\([0-9]*\)$/6=\1/
143 s/4=\([0-9]*\)$/5=\1/
144 s/3=\([0-9]*\)$/4=\1/
145 s/2=\([0-9]*\)$/3=\1/
146 s/1=\([0-9]*\)$/2=\1/