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