Ignore:
Timestamp:
Mar 26, 2018, 10:25:56 PM (7 years ago)
Author:
bird
Message:

kmkbuiltin: funnel output thru output.c (usually via err.c).

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kmk/kmkbuiltin/cat.c

    r3117 r3192  
    9393
    9494
    95 static int usage(FILE *);
    96 static int scanfiles(char *argv[], int cooked);
    97 static int cook_cat(FILE *);
    98 static int raw_cat(int);
     95static int usage(PKMKBUILTINCTX pCtx, int fIsErr);
     96static int scanfiles(PKMKBUILTINCTX pCtx, char *argv[], int cooked);
     97static int cook_cat(PKMKBUILTINCTX pCtx, FILE *);
     98static int raw_cat(PKMKBUILTINCTX pCtx, int);
    9999
    100100#ifndef NO_UDOM_SUPPORT
    101 static int udom_open(const char *path, int flags);
     101static int udom_open(PKMKBUILTINCTX pCtx, const char *path, int flags);
    102102#endif
    103103
    104104int
    105 kmk_builtin_cat(int argc, char *argv[], char **envp)
     105kmk_builtin_cat(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx)
    106106{
    107107        int ch, rc;
     
    112112
    113113        /* kmk: reset getopt and set progname */
    114         g_progname = argv[0];
    115114        opterr = 1;
    116115        optarg = NULL;
     
    118117        optind = 0; /* init */
    119118
    120 #ifdef kmk_builtin_cat /* kmk did this already. */
     119#ifdef KMK_BUILTIN_STANDALONE /* kmk did this already. */
    121120        setlocale(LC_CTYPE, "");
    122 #else
    123         fflush(stdout);
    124121#endif
    125122
     
    142139                        break;
    143140                case 'u':
     141#ifdef KMK_BUILTIN_STANDALONE /* don't allow messing with stdout */
    144142                        setbuf(stdout, NULL);
     143#endif
    145144                        break;
    146145                case 'v':
     
    148147                        break;
    149148                case 261:
    150                         usage(stdout);
     149                        usage(pCtx, 0);
    151150                        return 0;
    152151                case 262:
    153152                        return kbuild_version(argv[0]);
    154153                default:
    155                         return usage(stderr);
     154                        return usage(pCtx, 1);
    156155                }
    157156        argv += optind;
    158157
    159158        if (bflag || eflag || nflag || sflag || tflag || vflag)
    160                 rc = scanfiles(argv, 1);
     159                rc = scanfiles(pCtx, argv, 1);
    161160        else
    162                 rc = scanfiles(argv, 0);
    163 #ifdef kmk_builtin_cat /* only in the external program. */
     161                rc = scanfiles(pCtx, argv, 0);
     162#ifdef KMK_BUILTIN_STANDALONE /* don't allow messing with stdout */
    164163        if (fclose(stdout))
    165                 return err(1, "stdout");
     164                return err(pCtx, 1, "stdout");
    166165#endif
    167166        return rc;
    168167}
    169168
    170 static int
    171 usage(FILE *fp)
    172 {
    173         fprintf(fp, "usage: %s [-benstuv] [file ...]\n"
    174                     "   or: %s --help\n"
    175                     "   or: %s --version\n",
    176                 g_progname, g_progname, g_progname);
     169#ifdef KMK_BUILTIN_STANDALONE
     170int main(int argc, char **argv, char **envp)
     171{
     172    KMKBUILTINCTX Ctx = { "kmk_cat", NULL };
     173    return kmk_builtin_cat(argc, argv, envp, &Ctx);
     174}
     175#endif
     176
     177static int
     178usage(PKMKBUILTINCTX pCtx, int fIsErr)
     179{
     180        kmk_builtin_ctx_printf(pCtx, fIsErr,
     181                               "usage: %s [-benstuv] [file ...]\n"
     182                               "   or: %s --help\n"
     183                               "   or: %s --version\n",
     184                               pCtx->pszProgName, pCtx->pszProgName,
     185                               pCtx->pszProgName);
    177186        return 1;
    178187}
    179188
    180189static int
    181 scanfiles(char *argv[], int cooked)
     190scanfiles(PKMKBUILTINCTX pCtx, char *argv[], int cooked)
    182191{
    183192        int i = 0;
     
    198207#ifndef NO_UDOM_SUPPORT
    199208                        if (fd < 0 && errno == EOPNOTSUPP)
    200                                 fd = udom_open(path, O_RDONLY);
     209                                fd = udom_open(pCtx, path, O_RDONLY);
    201210#endif
    202211                }
    203212                if (fd < 0) {
    204                         warn("%s", path);
     213                        warn(pCtx, "%s", path);
    205214                        rc2 = 1; /* non fatal */
    206215                } else if (cooked) {
    207216                        if (fd == STDIN_FILENO)
    208                                 rc = cook_cat(stdin);
     217                                rc = cook_cat(pCtx, stdin);
    209218                        else {
    210219                                fp = fdopen(fd, "r");
    211                                 rc = cook_cat(fp);
     220                                rc = cook_cat(pCtx, fp);
    212221                                fclose(fp);
    213222                        }
    214223                } else {
    215                         rc = raw_cat(fd);
     224                        rc = raw_cat(pCtx, fd);
    216225                        if (fd != STDIN_FILENO)
    217226                                close(fd);
     
    224233}
    225234
    226 static int
    227 cook_cat(FILE *fp)
     235static int cat_putchar(PKMKBUILTINCTX pCtx, char ch)
     236{
     237#ifndef KMK_BUILTIN_STANDALONE
     238        if (pCtx->pOut) {
     239                output_write_text(pCtx->pOut, 0, &ch, 1);
     240                return 0;
     241        }
     242#endif
     243        return putchar(ch);
     244}
     245
     246static int
     247cook_cat(PKMKBUILTINCTX pCtx, FILE *fp)
    228248{
    229249        int ch, gobble, line, prev;
     
    246266                        }
    247267                        if (nflag && (!bflag || ch != '\n')) {
    248                                 (void)fprintf(stdout, "%6d\t", ++line);
     268                                kmk_builtin_ctx_printf(pCtx, 0, "%6d\t", ++line);
    249269                                if (ferror(stdout))
    250270                                        break;
     
    252272                }
    253273                if (ch == '\n') {
    254                         if (eflag && putchar('$') == EOF)
     274                        if (eflag && cat_putchar(pCtx, '$') == EOF)
    255275                                break;
    256276                } else if (ch == '\t') {
    257277                        if (tflag) {
    258                                 if (putchar('^') == EOF || putchar('I') == EOF)
     278                                if (cat_putchar(pCtx, '^') == EOF || cat_putchar(pCtx, 'I') == EOF)
    259279                                        break;
    260280                                continue;
     
    262282                } else if (vflag) {
    263283                        if (!isascii(ch) && !isprint(ch)) {
    264                                 if (putchar('M') == EOF || putchar('-') == EOF)
     284                                if (cat_putchar(pCtx, 'M') == EOF || cat_putchar(pCtx, '-') == EOF)
    265285                                        break;
    266286                                ch = toascii(ch);
    267287                        }
    268288                        if (iscntrl(ch)) {
    269                                 if (putchar('^') == EOF ||
    270                                     putchar(ch == '\177' ? '?' :
     289                                if (cat_putchar(pCtx, '^') == EOF ||
     290                                    cat_putchar(pCtx, ch == '\177' ? '?' :
    271291                                    ch | 0100) == EOF)
    272292                                        break;
     
    274294                        }
    275295                }
    276                 if (putchar(ch) == EOF)
     296                if (cat_putchar(pCtx, ch) == EOF)
    277297                        break;
    278298        }
    279299        if (ferror(fp)) {
    280                 warn("%s", filename);
     300                warn(pCtx, "%s", filename);
    281301                rc = 1;
    282302                clearerr(fp);
    283303        }
    284304        if (ferror(stdout))
    285                 return err(1, "stdout");
     305                return err(pCtx, 1, "stdout");
    286306        return rc;
    287307}
    288308
    289309static int
    290 raw_cat(int rfd)
     310raw_cat(PKMKBUILTINCTX pCtx, int rfd)
    291311{
    292312        int off, wfd = fileno(stdout);
     
    299319        if (buf == NULL) {
    300320                if (fstat(wfd, &sbuf))
    301                         return err(1, "%s", filename);
     321                        return err(pCtx, 1, "%s", filename);
    302322#ifdef KBUILD_OS_WINDOWS
    303323                bsize = 16384;
     
    306326#endif
    307327                if ((buf = malloc(bsize)) == NULL)
    308                         return err(1, "buffer");
     328                        return err(pCtx, 1, "buffer");
    309329        }
    310330        while ((nr = read(rfd, buf, bsize)) > 0)
    311                 for (off = 0; nr; nr -= nw, off += nw)
    312                         if ((nw = write(wfd, buf + off, (size_t)nr)) < 0)
    313                                 return err(1, "stdout");
     331                for (off = 0; nr; nr -= nw, off += nw) {
     332#ifndef KMK_BUILTIN_STANDALONE
     333                        if (pCtx->pOut)
     334                                nw = output_write_text(pCtx->pOut, 0, buf, nr);
     335                        else
     336#endif
     337                                nw = write(wfd, buf + off, (size_t)nr);
     338                        if (nw < 0)
     339                                return err(pCtx, 1, "stdout");
     340                }
    314341        if (nr < 0) {
    315                 warn("%s", filename);
     342                warn(pCtx, "%s", filename);
    316343                return 1;
    317344        }
     
    322349
    323350static int
    324 udom_open(const char *path, int flags)
     351udom_open(PKMKBUILTINCTX pCtx, const char *path, int flags)
    325352{
    326353        struct sockaddr_un sou;
     
    356383                case O_RDONLY:
    357384                        if (shutdown(fd, SHUT_WR) == -1)
    358                                 warn(NULL);
     385                                warn(pCtx, NULL);
    359386                        break;
    360387                case O_WRONLY:
    361388                        if (shutdown(fd, SHUT_RD) == -1)
    362                                 warn(NULL);
     389                                warn(pCtx, NULL);
    363390                        break;
    364391                default:
     
    370397
    371398#endif
     399
Note: See TracChangeset for help on using the changeset viewer.