sbase

suckless unix tools
git clone git://git.suckless.org/sbase
Log | Files | Refs | README | LICENSE

commit c759756d2e47cf2737949d0007937e467a4825eb
parent fee2f025d0e921966786fc8b0212f55674d35469
Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
Date:   Tue, 25 Nov 2025 11:21:47 +0100

bc: Implement the . operand

While it is not specified in POSIX, all the bc implementations since
70's store the last expression in the dot variable which can be used
in later experssions.

Diffstat:
Mbc.y | 12+++++++++++-
1 file changed, 11 insertions(+), 1 deletion(-)

diff --git a/bc.y b/bc.y @@ -70,6 +70,7 @@ int cflag, dflag, lflag, sflag; %token <str> STRING NUMBER %token <str> EQOP '+' '-' '*' '/' '%' '^' INCDEC %token HOME LOOP +%token DOT %token EQ %token LE %token GE @@ -204,6 +205,7 @@ expr : nexpr nexpr : NUMBER {$$ = code(" %s", $1);} | ID {$$ = code("l%s", var($1));} + | DOT {$$ = code("l.");} | SCALE {$$ = code("K");} | IBASE {$$ = code("I");} | OBASE {$$ = code("O");} @@ -567,6 +569,8 @@ follow(int next, int yes, int no) static int operand(int ch) { + int peekc; + switch (ch) { case '\n': case '{': @@ -578,6 +582,12 @@ operand(int ch) case ',': case ';': return ch; + case '.': + peekc = ungetc(getchar(), stdin); + if (strchr(DIGITS, peekc)) + return number(ch); + yylval.str = "."; + return DOT; case '"': return string(ch); case '*': @@ -643,7 +653,7 @@ repeat: yyerror("invalid input character"); } else if (islower(ch)) { return iden(ch); - } else if (ch == '.' || strchr(DIGITS, ch)) { + } else if (strchr(DIGITS, ch)) { return number(ch); } else { if (ch == '/') {