URI: 
       bc: Adapt sbase style - sbase - suckless unix tools
  HTML git clone git://git.suckless.org/sbase
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
   DIR commit 14796edb26a2cdfa29cb78b0f934d620d5fd11dd
   DIR parent 33ac9371b8f5ef9c3d80c443f91ea42c5a8778d4
  HTML Author: Roberto E. Vargas Caballero <k0ga@shike2.net>
       Date:   Sat, 22 Nov 2025 11:52:02 +0100
       
       bc: Adapt sbase style
       
       Diffstat:
         M bc.y                                |      48 ++++++++++++++++---------------
         M config.mk                           |       1 +
       
       2 files changed, 26 insertions(+), 23 deletions(-)
       ---
   DIR diff --git a/bc.y b/bc.y
       @@ -1,4 +1,5 @@
        %{
       +#define _XOPEN_SOURCE
        #include <unistd.h>
        
        #include <ctype.h>
       @@ -10,6 +11,7 @@
        #include <string.h>
        
        #include "arg.h"
       +#include "util.h"
        
        #define DIGITS   "0123456789ABCDEF"
        
       @@ -44,7 +46,7 @@ static char *ary(char *);
        static void writeout(char *);
        
        static size_t used;
       -static char yytext[BUFSIZ], buff[BUFSIZ];
       +static char *yytext, *buff;
        static int lineno, nerr;
        static jmp_buf recover;
        static int nested;
       @@ -247,8 +249,7 @@ writeout(char *s)
                return;
                
        err:
       -        perror("bc:writing to dc");
       -        exit(1);
       +        eprintf("bc:writing to dc:");
        }
        
        static char *
       @@ -259,14 +260,12 @@ code(char *fmt, ...)
                size_t n, room;
        
                va_start(va, fmt);
       -        room = sizeof(buff) - used;
       +        room = BUFSIZ - used;
                n = vsnprintf(buff+used, room, fmt, va);
                va_end(va);
        
       -        if (n < 0 || n >= room) {
       -                fprintf(stderr, "bc: unable to code requested operation\n");
       -                exit(1);
       -        }
       +        if (n < 0 || n >= room)
       +                eprintf("bc: unable to code requested operation\n");
        
                s = buff + used;
                used += n + 1;
       @@ -426,14 +425,14 @@ iden(int ch)
                char *bp;
        
                ungetc(ch, stdin);
       -        for (bp = yytext; bp < &yytext[sizeof(yytext)]; ++bp) {
       +        for (bp = yytext; bp < &yytext[BUFSIZ]; ++bp) {
                        ch = getchar();
                        if (!islower(ch))
                                break;
                        *bp = ch;
                }
        
       -        if (bp == &yytext[sizeof(yytext)])
       +        if (bp == &yytext[BUFSIZ])
                        yyerror("too long token");
                *bp = '\0';
                ungetc(ch, stdin);
       @@ -458,7 +457,7 @@ digits(char *bp)
                int ch;
                char *digits = DIGITS, *p;
        
       -        while (bp < &yytext[sizeof(yytext)]) {
       +        while (bp < &yytext[BUFSIZ]) {
                        ch = getchar();
                        p = strchr(digits, ch);
                        if (!p)
       @@ -466,7 +465,7 @@ digits(char *bp)
                        *bp++ = ch;
                }
        
       -        if (bp == &yytext[sizeof(yytext)])
       +        if (bp == &yytext[BUFSIZ])
                        return NULL;
                ungetc(ch, stdin);
        
       @@ -493,7 +492,7 @@ number(int ch)
                        goto toolong;
        
        end:
       -        if (bp ==  &yytext[sizeof(yytext)])
       +        if (bp ==  &yytext[BUFSIZ])
                        goto toolong;
                *bp = '\0';
                yylval.str = yytext;
       @@ -509,13 +508,13 @@ string(int ch)
        {
                char *bp;
        
       -        for (bp = yytext; bp < &yytext[sizeof(yytext)]; ++bp) {
       +        for (bp = yytext; bp < &yytext[BUFSIZ]; ++bp) {
                        if ((ch = getchar()) == '"')
                                break;
                        *bp = ch;
                }
        
       -        if (bp == &yytext[sizeof(yytext)])
       +        if (bp == &yytext[BUFSIZ])
                        yyerror("bc:too long string");
                *bp = '\0';
                yylval.str = yytext;
       @@ -628,15 +627,12 @@ spawn(void)
                int fds[2];
                char errmsg[] = "bc:error execing dc\n";
        
       -        if (pipe(fds) < 0) {
       -                perror("bc:creating pipe");
       -                exit(1);
       -        }
       +        if (pipe(fds) < 0)
       +                eprintf("bc:creating pipe:");
        
                switch (fork()) {
                case -1:
       -                perror("bc:forking dc");
       -                exit(1);
       +                eprintf("bc:forking dc:");
                case 0:
                        close(1);
                        dup(fds[1]);
       @@ -659,6 +655,13 @@ spawn(void)
        static void
        init(void)
        {
       +        nested = used = 0;
       +        if (!yytext)
       +                yytext = malloc(BUFSIZ);
       +        if (!buff)
       +                buff = malloc(BUFSIZ);
       +        if (!yytext || !buff)
       +                eprintf("bc: out of memory\n");
        }
        
        static int
       @@ -674,8 +677,7 @@ run(void)
        static void
        usage(void)
        {
       -        fputs("usage: bc [-cdls]\n", stderr);
       -        exit(1);
       +        eprintf("usage: %s [-cdls]\n", argv0);
        }
        
        int
   DIR diff --git a/config.mk b/config.mk
       @@ -14,5 +14,6 @@ RANLIB = ranlib
        SMAKE = $(MAKE)
        
        # -lrt might be needed on some systems
       +# -DYYDEBUG adds more debug info when yacc is involved
        # CFLAGS   =
        # LDFLAGS  =