math.sed revision 1590
11590Srgrimes# 21590Srgrimes# @(#)math.sed 8.1 (Berkeley) 6/6/93 31590Srgrimes# 41590Srgrimes# Addition and multiplication in sed. 51590Srgrimes# ++ for a limited time only do (expr) too!!! 61590Srgrimes# 71590Srgrimes# Kevin S Braunsdorf, PUCC UNIX Group, ksb@cc.purdue.edu. 81590Srgrimes# 91590Srgrimes# Ex: 101590Srgrimes# echo "4+7*3" | sed -f %f 111590Srgrimes 121590Srgrimes# make sure the expression is well formed 131590Srgrimess/[ ]//g 141590Srgrimes/[+*\/-]$/{ 151590Srgrimes a\ 161590Srgrimes poorly formed expression, operator on the end 171590Srgrimes q 181590Srgrimes} 191590Srgrimes/^[+*\/]/{ 201590Srgrimes a\ 211590Srgrimes poorly formed expression, leading operator 221590Srgrimes q 231590Srgrimes} 241590Srgrimes 251590Srgrimes# fill hold space with done token 261590Srgrimesx 271590Srgrimess/^.*/done/ 281590Srgrimesx 291590Srgrimes 301590Srgrimes# main loop, process operators (*, + and () ) 311590Srgrimes: loop 321590Srgrimes/^\+/{ 331590Srgrimes s/// 341590Srgrimes b loop 351590Srgrimes} 361590Srgrimes/^\(.*\)(\([^)]*\))\(.*\)$/{ 371590Srgrimes H 381590Srgrimes s//\2/ 391590Srgrimes x 401590Srgrimes s/^\(.*\)\n\(.*\)(\([^()]*\))\(.*\)$/()\2@\4@\1/ 411590Srgrimes x 421590Srgrimes b loop 431590Srgrimes} 441590Srgrimes/^[0-9]*\*/b mul 451590Srgrimes/^\([0-9]*\)\+\([0-9+*]*\*[0-9]*\)$/{ 461590Srgrimes s//\2+\1/ 471590Srgrimes b loop 481590Srgrimes} 491590Srgrimes/^[0-9]*\+/{ 501590Srgrimes s/$/=/ 511590Srgrimes b add 521590Srgrimes} 531590Srgrimesx 541590Srgrimes/^done$/{ 551590Srgrimes x 561590Srgrimes p 571590Srgrimes d 581590Srgrimes} 591590Srgrimes/^()/{ 601590Srgrimes s/// 611590Srgrimes x 621590Srgrimes G 631590Srgrimes s/\(.*\)\n\([^@]*\)@\([^@]*\)@\(.*\)/\2\1\3/ 641590Srgrimes x 651590Srgrimes s/[^@]*@[^@]*@\(.*\)/\1/ 661590Srgrimes x 671590Srgrimes b loop 681590Srgrimes} 691590Srgrimesi\ 701590Srgrimeshelp, stack problem 711590Srgrimesp 721590Srgrimesx 731590Srgrimesp 741590Srgrimesq 751590Srgrimes 761590Srgrimes# turn mul into add until 1*x -> x 771590Srgrimes: mul 781590Srgrimes/^0*1\*/{ 791590Srgrimes s/// 801590Srgrimes b loop 811590Srgrimes} 821590Srgrimes/^\([0-9]*\)0\*/{ 831590Srgrimes s/^\([0-9]*\)0\*\([0-9]*\)/\1*\20/ 841590Srgrimes b mul 851590Srgrimes} 861590Srgrimess/^\([0-9]*\)1\*/\10*/ 871590Srgrimess/^\([0-9]*\)2\*/\11*/ 881590Srgrimess/^\([0-9]*\)3\*/\12*/ 891590Srgrimess/^\([0-9]*\)4\*/\13*/ 901590Srgrimess/^\([0-9]*\)5\*/\14*/ 911590Srgrimess/^\([0-9]*\)6\*/\15*/ 921590Srgrimess/^\([0-9]*\)7\*/\16*/ 931590Srgrimess/^\([0-9]*\)8\*/\17*/ 941590Srgrimess/^\([0-9]*\)9\*/\18*/ 951590Srgrimess/\*\([0-9*]*\)/*\1+\1/ 961590Srgrimesb mul 971590Srgrimes 981590Srgrimes# get rid of a plus term until 0+x -> x 991590Srgrimes: add 1001590Srgrimes/^\+\([0-9+*]*\)=/{ 1011590Srgrimes s//\1/ 1021590Srgrimes b loop 1031590Srgrimes} 1041590Srgrimes/^\([0-9*]*\)\+=/{ 1051590Srgrimes s//\1/ 1061590Srgrimes b loop 1071590Srgrimes} 1081590Srgrimes/^\([0-9]*\)\+\([0-9*+]*\)\+=/{ 1091590Srgrimes s//\2+\1/ 1101590Srgrimes b loop 1111590Srgrimes} 1121590Srgrimes/^\([0-9]*\)0\+\([0-9]*\)\([0-9]\)=/{ 1131590Srgrimes s//\1+\2=\3/ 1141590Srgrimes b add 1151590Srgrimes} 1161590Srgrimes/^\([0-9]*\)\([0-9]\)\+\([0-9]*\)0=/{ 1171590Srgrimes s//\1+\3=\2/ 1181590Srgrimes b add 1191590Srgrimes} 1201590Srgrimes/^\([0-9]*\)0\+\([0-9*+]*\)\+\([0-9]*\)\([0-9]\)=/{ 1211590Srgrimes s//\1+\2+\3=\4/ 1221590Srgrimes b add 1231590Srgrimes} 1241590Srgrimes/^\([0-9]*\)\([0-9]\)\+\([0-9*+]*\)\+\([0-9]*\)0=/{ 1251590Srgrimes s//\1+\3+\4=\2/ 1261590Srgrimes b add 1271590Srgrimes} 1281590Srgrimess/^\([0-9]*\)1\+/\10+/ 1291590Srgrimess/^\([0-9]*\)2\+/\11+/ 1301590Srgrimess/^\([0-9]*\)3\+/\12+/ 1311590Srgrimess/^\([0-9]*\)4\+/\13+/ 1321590Srgrimess/^\([0-9]*\)5\+/\14+/ 1331590Srgrimess/^\([0-9]*\)6\+/\15+/ 1341590Srgrimess/^\([0-9]*\)7\+/\16+/ 1351590Srgrimess/^\([0-9]*\)8\+/\17+/ 1361590Srgrimess/^\([0-9]*\)9\+/\18+/ 1371590Srgrimes 1381590Srgrimess/9=\([0-9]*\)$/_=\1/ 1391590Srgrimess/8=\([0-9]*\)$/9=\1/ 1401590Srgrimess/7=\([0-9]*\)$/8=\1/ 1411590Srgrimess/6=\([0-9]*\)$/7=\1/ 1421590Srgrimess/5=\([0-9]*\)$/6=\1/ 1431590Srgrimess/4=\([0-9]*\)$/5=\1/ 1441590Srgrimess/3=\([0-9]*\)$/4=\1/ 1451590Srgrimess/2=\([0-9]*\)$/3=\1/ 1461590Srgrimess/1=\([0-9]*\)$/2=\1/ 1471590Srgrimes/_/{ 1481590Srgrimes s//_0/ 1491590Srgrimes : inc 1501590Srgrimes s/9_/_0/ 1511590Srgrimes s/8_/9/ 1521590Srgrimes s/7_/8/ 1531590Srgrimes s/6_/7/ 1541590Srgrimes s/5_/6/ 1551590Srgrimes s/4_/5/ 1561590Srgrimes s/3_/4/ 1571590Srgrimes s/2_/3/ 1581590Srgrimes s/1_/2/ 1591590Srgrimes s/0_/1/ 1601590Srgrimes s/\+_/+1/ 1611590Srgrimes /_/b inc 1621590Srgrimes} 1631590Srgrimesb add 164