VirtualBox

Changeset 3218 in kBuild


Ignore:
Timestamp:
Mar 30, 2018 10:23:13 PM (7 years ago)
Author:
bird
Message:

kmk_cat: converted to getopt_r and got rid of all static variables.

File:
1 edited

Legend:

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

    r3192 r3218  
    4747#include <sys/cdefs.h>
    4848__FBSDID("$FreeBSD: src/bin/cat/cat.c,v 1.32 2005/01/10 08:39:20 imp Exp $");
    49 #else
     49#endif
     50
     51/*********************************************************************************************************************************
     52*   Header Files                                                                                                                 *
     53*********************************************************************************************************************************/
     54#define FAKES_NO_GETOPT_H /* bird */
    5055#define NO_UDOM_SUPPORT /* kmk */
    51 #endif
    52 
    5356#include "config.h"
    5457#ifndef _MSC_VER
     
    7174#include <unistd.h>
    7275#include <stddef.h>
    73 #include "getopt.h"
     76#include "getopt_r.h"
    7477#ifdef __sun__
    7578# include "solfakes.h"
     
    8184
    8285
    83 int bflag, eflag, nflag, sflag, tflag, vflag;
    84 /*int rval;*/
    85 const char *filename;
    86 
     86/*********************************************************************************************************************************
     87*   Structures and Typedefs                                                                                                      *
     88*********************************************************************************************************************************/
     89typedef struct CATINSTANCE
     90{
     91    PKMKBUILTINCTX pCtx;
     92    int bflag, eflag, nflag, sflag, tflag, vflag;
     93    /*int rval;*/
     94    const char *filename;
     95    /* function level statics from raw_cat (needs freeing): */
     96    size_t bsize;
     97    char *buf;
     98} CATINSTANCE;
     99
     100
     101/*********************************************************************************************************************************
     102*   Global Variables                                                                                                             *
     103*********************************************************************************************************************************/
    87104static struct option long_options[] =
    88105{
     
    94111
    95112static int usage(PKMKBUILTINCTX pCtx, int fIsErr);
    96 static int scanfiles(PKMKBUILTINCTX pCtx, char *argv[], int cooked);
    97 static int cook_cat(PKMKBUILTINCTX pCtx, FILE *);
    98 static int raw_cat(PKMKBUILTINCTX pCtx, int);
     113static int scanfiles(CATINSTANCE *pThis, char *argv[], int cooked);
     114static int cook_cat(CATINSTANCE *pThis, FILE *);
     115static int raw_cat(CATINSTANCE *pThis, int);
    99116
    100117#ifndef NO_UDOM_SUPPORT
     
    105122kmk_builtin_cat(int argc, char **argv, char **envp, PKMKBUILTINCTX pCtx)
    106123{
     124        struct getopt_state_r gos;
     125        CATINSTANCE This;
    107126        int ch, rc;
    108127
    109128        /* kmk: reinitialize globals */
    110         bflag = eflag = nflag = sflag = tflag = vflag = 0;
    111         filename = NULL;
    112 
    113         /* kmk: reset getopt and set progname */
    114         opterr = 1;
    115         optarg = NULL;
    116         optopt = 0;
    117         optind = 0; /* init */
    118 
    119 #ifdef KMK_BUILTIN_STANDALONE /* kmk did this already. */
    120         setlocale(LC_CTYPE, "");
    121 #endif
    122 
    123         while ((ch = getopt_long(argc, argv, "benstuv", long_options, NULL)) != -1)
     129        This.pCtx = pCtx;
     130        This.bflag = This.eflag = This.nflag = This.sflag = This.tflag = This.vflag = 0;
     131        This.filename = NULL;
     132        This.bsize = 0;
     133        This.buf = 0;
     134
     135        getopt_initialize_r(&gos, argc, argv, "benstuv", long_options, envp, pCtx);
     136        while ((ch = getopt_long_r(&gos, NULL)) != -1)
    124137                switch (ch) {
    125138                case 'b':
    126                         bflag = nflag = 1;      /* -b implies -n */
     139                        This.bflag = This.nflag = 1;    /* -b implies -n */
    127140                        break;
    128141                case 'e':
    129                         eflag = vflag = 1;      /* -e implies -v */
     142                        This.eflag = This.vflag = 1;    /* -e implies -v */
    130143                        break;
    131144                case 'n':
    132                         nflag = 1;
     145                        This.nflag = 1;
    133146                        break;
    134147                case 's':
    135                         sflag = 1;
     148                        This.sflag = 1;
    136149                        break;
    137150                case 't':
    138                         tflag = vflag = 1;      /* -t implies -v */
     151                        This.tflag = This.vflag = 1;    /* -t implies -v */
    139152                        break;
    140153                case 'u':
     
    144157                        break;
    145158                case 'v':
    146                         vflag = 1;
     159                        This.vflag = 1;
    147160                        break;
    148161                case 261:
     
    154167                        return usage(pCtx, 1);
    155168                }
    156         argv += optind;
    157 
    158         if (bflag || eflag || nflag || sflag || tflag || vflag)
    159                 rc = scanfiles(pCtx, argv, 1);
     169        argv += gos.optind;
     170
     171        if (This.bflag || This.eflag || This.nflag || This.sflag || This.tflag || This.vflag)
     172                rc = scanfiles(&This, argv, 1);
    160173        else
    161                 rc = scanfiles(pCtx, argv, 0);
     174                rc = scanfiles(&This, argv, 0);
     175        if (This.buf) {
     176                free(This.buf);
     177                This.buf = NULL;
     178        }
    162179#ifdef KMK_BUILTIN_STANDALONE /* don't allow messing with stdout */
    163180        if (fclose(stdout))
     
    170187int main(int argc, char **argv, char **envp)
    171188{
    172     KMKBUILTINCTX Ctx = { "kmk_cat", NULL };
    173     return kmk_builtin_cat(argc, argv, envp, &Ctx);
     189        KMKBUILTINCTX Ctx = { "kmk_cat", NULL };
     190        setlocale(LC_CTYPE, "");
     191        return kmk_builtin_cat(argc, argv, envp, &Ctx);
    174192}
    175193#endif
     
    188206
    189207static int
    190 scanfiles(PKMKBUILTINCTX pCtx, char *argv[], int cooked)
     208scanfiles(CATINSTANCE *pThis, char *argv[], int cooked)
    191209{
    192210        int i = 0;
     
    200218
    201219                if (path == NULL || strcmp(path, "-") == 0) {
    202                         filename = "stdin";
     220                        pThis->filename = "stdin";
    203221                        fd = STDIN_FILENO;
    204222                } else {
    205                         filename = path;
     223                        pThis->filename = path;
    206224                        fd = open(path, O_RDONLY);
    207225#ifndef NO_UDOM_SUPPORT
    208226                        if (fd < 0 && errno == EOPNOTSUPP)
    209                                 fd = udom_open(pCtx, path, O_RDONLY);
     227                                fd = udom_open(pThis, path, O_RDONLY);
    210228#endif
    211229                }
    212230                if (fd < 0) {
    213                         warn(pCtx, "%s", path);
     231                        warn(pThis->pCtx, "%s", path);
    214232                        rc2 = 1; /* non fatal */
    215233                } else if (cooked) {
    216234                        if (fd == STDIN_FILENO)
    217                                 rc = cook_cat(pCtx, stdin);
     235                                rc = cook_cat(pThis, stdin);
    218236                        else {
    219237                                fp = fdopen(fd, "r");
    220                                 rc = cook_cat(pCtx, fp);
     238                                rc = cook_cat(pThis, fp);
    221239                                fclose(fp);
    222240                        }
    223241                } else {
    224                         rc = raw_cat(pCtx, fd);
     242                        rc = raw_cat(pThis, fd);
    225243                        if (fd != STDIN_FILENO)
    226244                                close(fd);
     
    233251}
    234252
    235 static int cat_putchar(PKMKBUILTINCTX pCtx, char ch)
     253static int
     254cat_putchar(PKMKBUILTINCTX pCtx, char ch)
    236255{
    237256#ifndef KMK_BUILTIN_STANDALONE
     
    245264
    246265static int
    247 cook_cat(PKMKBUILTINCTX pCtx, FILE *fp)
     266cook_cat(CATINSTANCE *pThis, FILE *fp)
    248267{
    249268        int ch, gobble, line, prev;
     
    257276        for (prev = '\n'; (ch = getc(fp)) != EOF; prev = ch) {
    258277                if (prev == '\n') {
    259                         if (sflag) {
     278                        if (pThis->sflag) {
    260279                                if (ch == '\n') {
    261280                                        if (gobble)
     
    265284                                        gobble = 0;
    266285                        }
    267                         if (nflag && (!bflag || ch != '\n')) {
    268                                 kmk_builtin_ctx_printf(pCtx, 0, "%6d\t", ++line);
     286                        if (pThis->nflag && (!pThis->bflag || ch != '\n')) {
     287                                kmk_builtin_ctx_printf(pThis->pCtx, 0, "%6d\t", ++line);
    269288                                if (ferror(stdout))
    270289                                        break;
     
    272291                }
    273292                if (ch == '\n') {
    274                         if (eflag && cat_putchar(pCtx, '$') == EOF)
     293                        if (pThis->eflag && cat_putchar(pThis->pCtx, '$') == EOF)
    275294                                break;
    276295                } else if (ch == '\t') {
    277                         if (tflag) {
    278                                 if (cat_putchar(pCtx, '^') == EOF || cat_putchar(pCtx, 'I') == EOF)
     296                        if (pThis->tflag) {
     297                                if (cat_putchar(pThis->pCtx, '^') == EOF || cat_putchar(pThis->pCtx, 'I') == EOF)
    279298                                        break;
    280299                                continue;
    281300                        }
    282                 } else if (vflag) {
     301                } else if (pThis->vflag) {
    283302                        if (!isascii(ch) && !isprint(ch)) {
    284                                 if (cat_putchar(pCtx, 'M') == EOF || cat_putchar(pCtx, '-') == EOF)
     303                                if (cat_putchar(pThis->pCtx, 'M') == EOF || cat_putchar(pThis->pCtx, '-') == EOF)
    285304                                        break;
    286305                                ch = toascii(ch);
    287306                        }
    288307                        if (iscntrl(ch)) {
    289                                 if (cat_putchar(pCtx, '^') == EOF ||
    290                                     cat_putchar(pCtx, ch == '\177' ? '?' :
     308                                if (cat_putchar(pThis->pCtx, '^') == EOF ||
     309                                    cat_putchar(pThis->pCtx, ch == '\177' ? '?' :
    291310                                    ch | 0100) == EOF)
    292311                                        break;
     
    294313                        }
    295314                }
    296                 if (cat_putchar(pCtx, ch) == EOF)
     315                if (cat_putchar(pThis->pCtx, ch) == EOF)
    297316                        break;
    298317        }
    299318        if (ferror(fp)) {
    300                 warn(pCtx, "%s", filename);
     319                warn(pThis->pCtx, "%s", pThis->filename);
    301320                rc = 1;
    302321                clearerr(fp);
    303322        }
    304323        if (ferror(stdout))
    305                 return err(pCtx, 1, "stdout");
     324                return err(pThis->pCtx, 1, "stdout");
    306325        return rc;
    307326}
    308327
    309328static int
    310 raw_cat(PKMKBUILTINCTX pCtx, int rfd)
     329raw_cat(CATINSTANCE *pThis, int rfd)
    311330{
    312331        int off, wfd = fileno(stdout);
    313332        ssize_t nr, nw;
    314         static size_t bsize;
    315         static char *buf = NULL;
    316         struct stat sbuf;
    317333
    318334        wfd = fileno(stdout);
    319         if (buf == NULL) {
     335        if (pThis->buf == NULL) {
     336                struct stat sbuf;
    320337                if (fstat(wfd, &sbuf))
    321                         return err(pCtx, 1, "%s", filename);
     338                        return err(pThis->pCtx, 1, "%s", pThis->filename);
    322339#ifdef KBUILD_OS_WINDOWS
    323                 bsize = 16384;
     340                pThis->bsize = 16384;
    324341#else
    325                 bsize = MAX(sbuf.st_blksize, 1024);
    326 #endif
    327                 if ((buf = malloc(bsize)) == NULL)
    328                         return err(pCtx, 1, "buffer");
    329         }
    330         while ((nr = read(rfd, buf, bsize)) > 0)
     342                pThis->bsize = MAX(sbuf.st_blksize, 1024);
     343#endif
     344                if ((pThis->buf = malloc(pThis->bsize)) == NULL)
     345                        return err(pThis->pCtx, 1, "buffer");
     346        }
     347        while ((nr = read(rfd, pThis->buf, pThis->bsize)) > 0)
    331348                for (off = 0; nr; nr -= nw, off += nw) {
    332349#ifndef KMK_BUILTIN_STANDALONE
    333                         if (pCtx->pOut)
    334                                 nw = output_write_text(pCtx->pOut, 0, buf, nr);
     350                        if (pThis->pCtx->pOut)
     351                                nw = output_write_text(pThis->pCtx->pOut, 0, pThis->buf + off, nr);
    335352                        else
    336353#endif
    337                                 nw = write(wfd, buf + off, (size_t)nr);
     354                                nw = write(wfd, pThis->buf + off, (size_t)nr);
    338355                        if (nw < 0)
    339                                 return err(pCtx, 1, "stdout");
     356                                return err(pThis->pCtx, 1, "stdout");
    340357                }
    341358        if (nr < 0) {
    342                 warn(pCtx, "%s", filename);
     359                warn(pThis->pCtx, "%s", pThis->filename);
    343360                return 1;
    344361        }
     
    349366
    350367static int
    351 udom_open(PKMKBUILTINCTX pCtx, const char *path, int flags)
     368udom_open(CATINSTANCE *pThis, const char *path, int flags)
    352369{
    353370        struct sockaddr_un sou;
     
    383400                case O_RDONLY:
    384401                        if (shutdown(fd, SHUT_WR) == -1)
    385                                 warn(pCtx, NULL);
     402                                warn(pThis->pCtx, NULL);
    386403                        break;
    387404                case O_WRONLY:
    388405                        if (shutdown(fd, SHUT_RD) == -1)
    389                                 warn(pCtx, NULL);
     406                                warn(pThis->pCtx, NULL);
    390407                        break;
    391408                default:
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette