Home | History | Annotate | Line # | Download | only in TEST
math.sed revision 1.1
      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