Home | History | Annotate | Line # | Download | only in TEST
      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