diff --git a/2015/burton/.gitignore b/2015/burton/.gitignore index f03258bcc..1d4bbc4fe 100644 --- a/2015/burton/.gitignore +++ b/2015/burton/.gitignore @@ -1,6 +1,12 @@ # # sort with: sort -d -u *.dSYM +calc +calc.alt +ecalc +ecalc.alt +eprog +eprog.alt indent indent.c indent.o diff --git a/2015/burton/Makefile b/2015/burton/Makefile index 80be53abc..3b8fc644c 100644 --- a/2015/burton/Makefile +++ b/2015/burton/Makefile @@ -63,7 +63,7 @@ CDEFINE= # Include files that are needed to compile # -CINCLUDE= +CINCLUDE= -include libgen.h # Optimization # @@ -114,10 +114,10 @@ PROG= prog # OBJ= ${PROG}.o DATA= -TARGET= ${PROG} +TARGET= ${PROG} eprog # ALT_OBJ= ${PROG}.alt.o -ALT_TARGET= ${PROG}.alt +ALT_TARGET= ${PROG}.alt eprog.alt ################# @@ -134,6 +134,11 @@ all: data ${TARGET} ${PROG}: ${PROG}.c ${CC} ${CFLAGS} $< -o $@ ${LDFLAGS} + ${CP} -f $@ calc + +eprog: ${PROG} + ${CP} -f ${PROG} $@ + ${CP} -f ${PROG} ecalc # alternative executable # @@ -143,6 +148,12 @@ alt: data ${ALT_TARGET} ${PROG}.alt: ${PROG}.alt.c ${CC} ${CFLAGS} $< -o $@ ${LDFLAGS} +eprog.alt: ${PROG}.alt + ${CP} -f ${PROG}.alt $@ + ${CP} -f ${PROG}.alt ecalc.alt + + + # data files # data: ${DATA} diff --git a/2015/burton/README.md b/2015/burton/README.md index 4b7e29cbf..c3be78857 100644 --- a/2015/burton/README.md +++ b/2015/burton/README.md @@ -223,7 +223,7 @@ If the program name begins with an `e`, it echoes `stdin` to `stdout`. This allows for a convenient test suite: ```sh -ln -s prog eprog +ln -sf prog eprog PATH=. eprog < test.in | diff - test.out ``` diff --git a/2015/burton/calc.1 b/2015/burton/calc.1 index 5e6ac4b71..ba929e103 100644 --- a/2015/burton/calc.1 +++ b/2015/burton/calc.1 @@ -11,18 +11,20 @@ The result is printed on as both a decimal value and its hex equivalent. Results are presented as 32-bit values, displaying as 64-bits only if necessary. If the program name begins with -.I e +.B e the input is also copied to .BR stdout . .BR stdin is read if there are no arguments. .PP Constants may be decimal, octal or hex. -There are 26 registers, initialized to zero, named A-Z; the most recent result is always remembered in the register -.IR . +There are 26 registers, initialized to zero, named +.B A-Z\c +; the most recent result is always remembered in the register +.BR . (dot). Assignments are silent; the character -.IR $ +.I $ will print a table of the non-zero registers. .PP All input is case-insensitive. @@ -30,7 +32,7 @@ Semicolons and/or newlines separate statements. Whitespace is ignored, except newlines cannot occur within expressions. Comments are introduced with .I # -and extend through the following newline. +and extend through the end of the line. .PP Operator precedence is as found in Go: OR and XOR are treated as additive, SHIFTing and AND are multiplicative. @@ -45,45 +47,48 @@ Supported operations in decreasing precedence: forced precedence .TQ .B \- + ! ~ ? -unary plus/minus, not, compl, byteswap +unary minus/plus, not, compl, byte-swap .TQ .B * / % & << >> >>> -mul, div, mod, bitand, shift: left, right, unsigned right +mul, div, mod, bitand, left shift, right shift, unsigned right shift .TQ .B + \- | ^ add, sub, bitor, xor .TQ .B = -assignment ([a-z] = expr) +assignment (\c +.I [a-z] = expr\c +) .SH EXAMPLES .PP -Display the decimal value of 0x42: +Display the decimal value of +.BR 0x42 : .sp .RS .ft B -$ calc 0x42 +calc 0x42 .br -66 0x00000042 .ft R +66 0x00000042 .RE .PP What is the mask value for 22 bits? .sp .RS .ft B -$ calc '1<<22-1' +calc '1<<22-1' .br -4194303 0x003fffff .ft R +4194303 0x003fffff .RE .PP What is the integer value of byte-swapped 0x11223344? .RS .ft B -$ calc ?0x11223344 +calc ?0x11223344 .br -1144201745 0x44332211 .ft R +1144201745 0x44332211 .RE .PP Some canned expressions: diff --git a/2015/burton/calc.man b/2015/burton/calc.man deleted file mode 100644 index d2124dd0d..000000000 --- a/2015/burton/calc.man +++ /dev/null @@ -1,78 +0,0 @@ -NAME - calc - an integer expression calculator that outputs in both hex and decimal - -SYNOPSIS - calc [expr] - -DESCRIPTION - calc presents a simple signed integer expression calculator. - The result is printed on stdout as both a decimal value and its hex equivalent. - Results are presented as 32-bit values, displaying as 64-bits only if necessary. - If the program name begins with 'e', the input is also copied to stdout. - stdin is read if there are no arguments. - - Constants may be decimal, octal or hex. - There are 26 registers, initialized to zero, named A-Z; - the most recent result is always remembered in the register '.' (dot). - Assignments are silent; the character '$' will print a table of the non-zero registers. - - All input is case-insensitive. - Semicolons and/or newlines separate statements. - Whitespace is ignored, except newlines cannot occur within expressions. - Comments are introduced with '#' and extend through the following newline. - - Operator precedence is as found in Go: - OR and XOR are treated as additive, SHIFTing and AND are multiplicative. - This allows a more natural expression without parentheses, - as in `a&0xff | b<<8'. - - Supported operations in decreasing precedence: - - () forced precedence - - + ! ~ ? unary plus/minus, not, compl, byteswap - * / % & << >> >>> mul, div, mod, bitand, shift: left, right, unsigned right - + - | ^ add, sub, bitor, xor - = assignment ([a-z] = expr) - -EXAMPLES - Display the decimal value of 0x42 - - $ calc 0x42 - 66 0x00000042 - - What is the mask value for 22 bits? - - $ calc '1<<22-1' - 4194303 0x003fffff - - What is the integer value of byte-swapped 0x11223344? - - $ calc ?0x11223344 - 1144201745 0x44332211 - - Some canned expressions: - - cat <> 32 # signed shift - -1 >>> 32 # unsigned shift - ! - -BUGS - An assignment with certain types of syntax error will replace the registers with a - partial evaluation: - - calc 'a = 1; a; a = 3 4; a' - 1 0x00000001 - syntax error - 3 0x00000003 - - Command line expressions longer than 64 characters will give a syntax error. - -SEE ALSO - https://golang.org/ diff --git a/2015/burton/prog.alt.c b/2015/burton/prog.alt.c index cd11d1b3e..a6cfbd1ab 100644 --- a/2015/burton/prog.alt.c +++ b/2015/burton/prog.alt.c @@ -87,7 +87,8 @@ I H long long Z; n>>a ?h(n)<>a ):h(n):g(n); } Q main(Q x - ,L**K){ V*A; q(K); W(w())** + ,L**K){ V*A; *K=basename( + *K); q(K); W(w())** K-c*c-b||p(B),_i(!setjmp(l)?T=B ,M(((A=(*o=m()==c-~s&&(j=a|T[-b])&& s-m()==~s)?&o[j-a*u]:(T=B,&_)),*A=F()) diff --git a/2015/burton/prog.c b/2015/burton/prog.c index 056dfe777..e82630cb7 100644 --- a/2015/burton/prog.c +++ b/2015/burton/prog.c @@ -87,7 +87,8 @@ I H long long Z; n>>a ?h(n)<>a ):h(n):g(n); } Q main(Q x - ,L**K){ V*A; q(K); W(w())** + ,L**K){V*A; *K=basename( + *K);q(K); W(w())** K-c*c-b||p(B),_i(!setjmp(l)?T=B ,M(((A=(*o=m()==c-~s&&(j=a|T[-b])&& c-m()==-c)?&o[j-a*u]:(T=B,&_)),*A=F()) diff --git a/2015/burton/try.sh b/2015/burton/try.sh index f6a86e480..e57857cdb 100755 --- a/2015/burton/try.sh +++ b/2015/burton/try.sh @@ -15,11 +15,11 @@ make CC="$CC" all >/dev/null || exit 1 # clear screen after compilation so that only the entry is shown clear -echo "$ ./prog '?0x3343<<2'" 1>&2 -./prog '?0x3343<<2' +echo "$ ./calc '?0x3343<<2'" 1>&2 +./calc '?0x3343<<2' -echo "$ echo '?0x3343<<2' | ./prog" 1>&2 -echo '?0x3343<<2' | ./prog +echo "$ echo '?0x3343<<2' | ./ecalc" 1>&2 +echo '?0x3343<<2' | ./ecalc echo "$ grep '[0-9]' prog.c" 1>&2 @@ -27,9 +27,9 @@ read -r -n 1 -p "Press any key to continue (notice how there are no digits!): " echo 1>&2 grep -c '[0-9]' prog.c -read -r -n 1 -p "Press any key to run: ./prog < test.in: " +read -r -n 1 -p "Press any key to run: ./calc < test.in: " echo 1>&2 -./prog < test.in +./calc < test.in echo 1>&2 read -r -n 1 -p "Press any key to show try.this.txt: " @@ -37,11 +37,19 @@ echo 1>&2 cat try.this.txt echo 1>&2 -read -r -n 1 -p "Press any key to run: ./prog < try.this.txt: " +read -r -n 1 -p "Press any key to run: ./calc < try.this.txt: " echo 1>&2 -./prog < try.this.txt +./calc < try.this.txt read -r -n 1 -p "Press any key to show the hex value of 42: " echo 1>&2 -echo "$ ./prog 42" 1>&2 -./prog 42 +echo "$ ./calc 42" 1>&2 +./calc 42 + +read -r -n 1 -p "Press any key to run: ./calc '1<<22-1' (show mask value for 22 bits): " +echo 1>&2 +./calc '1<<22-1' + +read -r -n 1 -p "Press any key to run: ./calc ?0x11223344 (byte-swapped value of 0x11223344): " +echo 1>&2 +./calc ?0x11223344 diff --git a/2015/burton/try.this.txt b/2015/burton/try.this.txt index a251a55d1..3dd0a5e85 100644 --- a/2015/burton/try.this.txt +++ b/2015/burton/try.this.txt @@ -4,3 +4,13 @@ a << 16 + b a=0xdeadbeef b=0xcafe a << 16 + b + +# multiple assignments +a=32;n=10;c=50;m=100;$ +7+7/7+7*7-7 # pedmas +m|a-a*3 # convenient precedence +?(1<<14|1<<9)-1<<4-1<<3 +57005<<16+48879 +-1 >> 32 # signed shift +-1 >>> 32 # unsigned shift +! diff --git a/thanks-for-help.md b/thanks-for-help.md index 2e971e747..b5dd9b260 100644 --- a/thanks-for-help.md +++ b/thanks-for-help.md @@ -3798,10 +3798,43 @@ output. ## [2015/endoh3](/2015/burton/prog.c) ([README.md](/2015/burton/README.md])) -[Cody](#cody) added the [try.sh](/2015/burton/try.sh) script. This involved + +[Cody](#cody) fixed the code so one can make use of the echo feature, where the +first character of the filename starts with `e`. The only way it would work +before that is if one did something like: + +```sh +ln -sf prog eprog +PATH=$PATH:. ; eprog '...' +``` + +since otherwise the first character would not be `e` but rather a dot +(`./eprog`). This was done by adding to the Makefile `-include libgen.h` and +adding to `main()` after the variable declaration (`V*A;`) the code: + +```c +*K=basename(*K); +``` + +This was done for both the [prog.c](/2015/burton/prog.c) and +[prog.alt.c](/2015/burton/prog.alt.c). The Makefile was also updated to build +`eprog` and `eprog.alt` to make use of the feature more easily. Each is a new +target (first in `TARGET` and second in `ALT_TARGET`) which have a prerequisite +of `${PROG}` and `${PROG}.alt` respectively and which copies `prog` and +`prog.alt` to `eprog` and `eprog.alt` respectively. With these changes now one +can easily use the echo feature the author implemented. + +Cody also added the [try.sh](/2015/burton/try.sh) script. This involved adding a text file, [try.this.txt](/2015/burton/try.this.txt). +Cody also added [calc.1](/2015/burton/calc.1) in place of `calc.man` to have +proper formatting (in the style of `man(1)`). The `calc.man` was removed so as +to not have to maintain two copies of the same text. +Cody updated the Makefile to copy the `prog` to `calc` and `prog.alt` to +`calc.alt`. `ecalc` and `ecalc.alt` also work. This is because the program is +called `calc` and is in documentation including the man page. Thus one only need +add a `./` to the commands in the man page/README.md. ## [2015/endoh3](/2015/dogon/prog.c) ([README.md](/2015/dogon/README.md]))