VirtualBox

Changeset 1198 in kBuild for trunk/src/kash


Ignore:
Timestamp:
Oct 6, 2007 9:19:19 PM (17 years ago)
Author:
bird
Message:

moving globals into shinstance...

Location:
trunk/src/kash
Files:
33 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/kash/Makefile.kmk

    r884 r1198  
    3535        error.c \
    3636        eval.c \
     37        histedit.c \
     38        mail.c \
     39        memalloc.c \
     40        mystring.c \
     41        options.c \
     42        show.c \
     43        syntax.c \
     44        \
     45        output.c \
    3746        exec.c \
    3847        expand.c \
    39         histedit.c \
    4048        input.c \
    4149        jobs.c \
    42         mail.c \
    43         memalloc.c \
    4450        miscbltin.c \
    45         mystring.c \
    46         options.c \
    47         output.c \
    4851        parser.c \
    4952        redir.c \
    50         show.c \
    51         syntax.c \
    5253        trap.c \
    5354        var.c \
     
    106107# Use the pregenerated code.
    107108#
    108 kmk_ash_DEPS := 
     109kmk_ash_DEPS :=
    109110
    110111define def_copy_generated
     
    119120
    120121kmk_ash_INCS += generated
    121 kmk_ash_DEFS += HAVE_SYS_CDEFS_H 
     122kmk_ash_DEFS += HAVE_SYS_CDEFS_H
    122123
    123124include $(PATH_KBUILD)/footer.kmk
  • trunk/src/kash/alias.c

    r882 r1198  
    105105#else /* hack */
    106106        {
    107         int len = strlen(val);
     107        size_t len = strlen(val);
    108108        ap->val = ckmalloc(len + 2);
    109109        memcpy(ap->val, val, len);
  • trunk/src/kash/cd.c

    r883 r1198  
    8686        char *p, *d;
    8787        struct stat statb;
    88         int print = psh->cdprint;       /* set -cdprint to enable */
     88        int print = cdprint(psh);       /* set -cdprint to enable */
    8989
    9090        nextopt(psh, nullstr);
     
    171171        psh->cdcomppath = stalloc(psh, strlen(dest) + 1);
    172172        scopy(dest, psh->cdcomppath);
    173         STARTSTACKSTR(p);
     173        STARTSTACKSTR(psh, p);
    174174        if (IS_ROOT(dest)) {
    175                 STPUTC('/', p);
     175                STPUTC(psh, '/', p);
    176176                psh->cdcomppath++;
    177177        }
     
    181181                        continue;
    182182                if (! first)
    183                         STPUTC('/', p);
     183                        STPUTC(psh, '/', p);
    184184                first = 0;
    185185                component = q;
    186186                while (*q)
    187                         STPUTC(*q++, p);
     187                        STPUTC(psh, *q++, p);
    188188                if (equal(component, ".."))
    189189                        continue;
    190                 STACKSTRNUL(p);
    191                 if ((shfile_lstat(&psh->fdtab, stackblock(), &statb) < 0)
     190                STACKSTRNUL(psh, p);
     191                if ((shfile_lstat(&psh->fdtab, stackblock(psh), &statb) < 0)
    192192                    || (S_ISLNK(statb.st_mode)))  {
    193193                        /* print = 1; */
     
    204204        updatepwd(psh, badstat ? NULL : dest);
    205205        INTON;
    206         if (print && psh->iflag && psh->curdir)
     206        if (print && iflag(psh) && psh->curdir)
    207207                out1fmt(psh, "%s\n", psh->curdir);
    208208        return 0;
     
    272272        psh->cdcomppath = stalloc(psh, strlen(dir) + 1);
    273273        scopy(dir, psh->cdcomppath);
    274         STARTSTACKSTR(new);
     274        STARTSTACKSTR(psh, new);
    275275        if (!IS_ROOT(dir)) {
    276276                p = psh->curdir;
    277277                while (*p)
    278                         STPUTC(*p++, new);
     278                        STPUTC(psh, *p++, new);
    279279                if (p[-1] == '/')
    280                         STUNPUTC(new);
     280                        STUNPUTC(psh, new);
    281281        }
    282282        while ((p = getcomponent(psh)) != NULL) {
    283283                if (equal(p, "..")) {
    284                         while (new > stackblock() && (STUNPUTC(new), *new) != '/');
     284                        while (new > stackblock(psh) && (STUNPUTC(psh, new), *new) != '/');
    285285                } else if (*p != '\0' && ! equal(p, ".")) {
    286                         STPUTC('/', new);
     286                        STPUTC(psh, '/', new);
    287287                        while (*p)
    288                                 STPUTC(*p++, new);
    289                 }
    290         }
    291         if (new == stackblock())
    292                 STPUTC('/', new);
    293         STACKSTRNUL(new);
     288                                STPUTC(psh, *p++, new);
     289                }
     290        }
     291        if (new == stackblock(psh))
     292                STPUTC(psh, '/', new);
     293        STACKSTRNUL(psh, new);
    294294        INTOFF;
    295295        if (psh->prevdir)
    296296                ckfree(psh->prevdir);
    297297        psh->prevdir = psh->curdir;
    298         psh->curdir = savestr(stackblock());
     298        psh->curdir = savestr(stackblock(psh));
    299299        setvar(psh, "PWD", psh->curdir, VEXPORT);
    300300        INTON;
  • trunk/src/kash/error.c

    r883 r1198  
    116116        sh_sigemptyset(&nsigset);
    117117        sh_sigprocmask(psh, SIG_SETMASK, &nsigset, NULL);
    118         if (psh->rootshell && psh->iflag)
     118        if (psh->rootshell && iflag(psh))
    119119                exraise(psh, EXINT);
    120120        else {
  • trunk/src/kash/eval.c

    r884 r1198  
    125125
    126126RESET {
    127         evalskip = 0;
    128         loopnest = 0;
    129         funcnest = 0;
     127        psh->evalskip = 0;
     128        psh->loopnest = 0;
     129        psh->funcnest = 0;
    130130}
    131131
    132132SHELLPROC {
    133         exitstatus = 0;
     133        psh->exitstatus = 0;
    134134}
    135135#endif
     
    176176                p = argv[1];
    177177                if (argc > 2) {
    178                         STARTSTACKSTR(concat);
     178                        STARTSTACKSTR(psh, concat);
    179179                        ap = argv + 2;
    180180                        for (;;) {
    181181                                while (*p)
    182                                         STPUTC(*p++, concat);
     182                                        STPUTC(psh, *p++, concat);
    183183                                if ((p = *ap++) == NULL)
    184184                                        break;
    185                                 STPUTC(' ', concat);
     185                                STPUTC(psh, ' ', concat);
    186186                        }
    187                         STPUTC('\0', concat);
    188                         p = grabstackstr(concat);
     187                        STPUTC(psh, '\0', concat);
     188                        p = grabstackstr(psh, concat);
    189189                }
    190190                evalstring(psh, p, EV_TESTED);
     
    594594                                shfile_close(&psh->fdtab, pip[1]);
    595595                        }
    596                         psh->eflag = 0;
     596                        eflag(psh) = 0;
    597597                        evaltree(psh, n, EV_EXIT);
    598598                        /* NOTREACHED */
     
    765765        *argv = NULL;
    766766        lastarg = NULL;
    767         if (psh->iflag && psh->funcnest == 0 && argc > 0)
     767        if (iflag(psh) && psh->funcnest == 0 && argc > 0)
    768768                lastarg = argv[-1];
    769769        argv -= argc;
    770770
    771771        /* Print the command if xflag is set. */
    772         if (psh->xflag) {
     772        if (xflag(psh)) {
    773773                char sep = 0;
    774774                out2str(psh, ps4val(psh));
     
    10621062                if (flags == EV_BACKCMD) {
    10631063                        backcmd->buf = psh->memout.buf;
    1064                         backcmd->nleft = psh->memout.nextc - psh->memout.buf;
     1064                        backcmd->nleft = (int)(psh->memout.nextc - psh->memout.buf);
    10651065                        psh->memout.buf = NULL;
    10661066                }
     
    11011101        popstackmark(psh, &smark);
    11021102
    1103         if (psh->eflag && psh->exitstatus && !(flags & EV_TESTED))
     1103        if (eflag(psh) && psh->exitstatus && !(flags & EV_TESTED))
    11041104                exitshell(psh, psh->exitstatus);
    11051105}
     
    11601160breakcmd(shinstance *psh, int argc, char **argv)
    11611161{
    1162         int n = argc > 1 ? number(argv[1]) : 1;
     1162        int n = argc > 1 ? number(psh, argv[1]) : 1;
    11631163
    11641164        if (n > psh->loopnest)
     
    11791179returncmd(shinstance *psh, int argc, char **argv)
    11801180{
    1181         int ret = argc > 1 ? number(argv[1]) : psh->exitstatus;
     1181        int ret = argc > 1 ? number(psh, argv[1]) : psh->exitstatus;
    11821182
    11831183        if (psh->funcnest) {
     
    12151215                struct strlist *sp;
    12161216
    1217                 psh->iflag = 0;         /* exit on error */
    1218                 psh->mflag = 0;
     1217                iflag(psh) = 0;         /* exit on error */
     1218                mflag(psh) = 0;
    12191219                optschanged(psh);
    12201220                for (sp = psh->cmdenviron; sp; sp = sp->next)
     
    12301230        static clock_t tpm = 0;
    12311231        clock_t mins;
    1232         int i;
     1232        size_t i;
    12331233
    12341234        if (!tpm)
  • trunk/src/kash/eval.h

    r879 r1198  
    5454
    5555/* in_function returns nonzero if we are currently evaluating a function */
    56 #define in_function()   psh->funcnest
     56#define in_function(psh)        (psh)->funcnest
    5757/*extern int funcnest;
    5858extern int evalskip;*/
  • trunk/src/kash/exec.c

    r809 r1198  
    146146        TRACE(("shellexec: argv[0]=%s idx=%d\n", argv[0], idx));
    147147        if (strchr(argv[0], '/') != NULL) {
    148                 cmdname = stalloc(strlen(argv[0]) + 5);
     148                cmdname = stalloc(psh, strlen(argv[0]) + 5);
    149149                strcpy(cmdname, argv[0]);
    150150                tryexec(cmdname, argv, envp, vforked, has_ext);
    151151                TRACE(("shellexec: cmdname=%s\n", cmdname));
    152                 stunalloc(cmdname);
     152                stunalloc(psh, cmdname);
    153153                e = errno;
    154154        } else {
     
    160160                                        e = errno;
    161161                        }
    162                         stunalloc(cmdname);
     162                        stunalloc(psh, cmdname);
    163163                }
    164164        }
     
    275275                if (ap == &newargs[NEWARGS])
    276276bad:              error("Bad #! line");
    277                 STARTSTACKSTR(outp);
     277                STARTSTACKSTR(psh, outp);
    278278                do {
    279                         STPUTC(c, outp);
     279                        STPUTC(psh, c, outp);
    280280                } while (--n >= 0 && (c = *inp++) != ' ' && c != '\t' && c != '\n');
    281                 STPUTC('\0', outp);
     281                STPUTC(psh, '\0', outp);
    282282                n++, inp--;
    283                 *ap++ = grabstackstr(outp);
     283                *ap++ = grabstackstr(psh, outp);
    284284        }
    285285        if (ap == newargs + 1) {        /* if no args, maybe no exec is needed */
     
    349349        len += 4; /* "4" is for .exe/.com/.cmd/.bat/.btm */
    350350#endif
    351         while (stackblocksize() < len)
    352                 growstackblock();
    353         q = stackblock();
     351        while (stackblocksize(psh) < len)
     352                growstackblock(psh);
     353        q = stackblock(psh);
    354354        if (p != start) {
    355355                memcpy(q, start, p - start);
     
    375375        else
    376376                *path = NULL;
    377         return stalloc(len);
     377        return stalloc(psh, len);
    378378}
    379379
     
    485485                do {
    486486                        name = padvance(&path, cmdp->cmdname);
    487                         stunalloc(name);
     487                        stunalloc(psh, name);
    488488                } while (--idx >= 0);
    489489                out1str(name);
     
    623623loop:
    624624        while ((fullname = padvance(&path, name)) != NULL) {
    625                 stunalloc(fullname);
     625                stunalloc(psh, fullname);
    626626                idx++;
    627627                if (pathopt) {
     
    664664                        if (act & DO_NOFUNC)
    665665                                goto loop;
    666                         stalloc(strlen(fullname) + 1);
     666                        stalloc(psh, strlen(fullname) + 1);
    667667                        readcmdfile(fullname);
    668668                        if ((cmdp = cmdlookup(name, 0)) == NULL ||
    669669                            cmdp->cmdtype != CMDFUNCTION)
    670670                                error("%s not defined in %s", name, fullname);
    671                         stunalloc(fullname);
     671                        stunalloc(psh, fullname);
    672672                        goto success;
    673673                }
     
    689689                INTOFF;
    690690                if (act & DO_ALTPATH) {
    691                         stalloc(strlen(fullname) + 1);
     691                        stalloc(psh, strlen(fullname) + 1);
    692692                        cmdp = &loc_cmd;
    693693                } else
     
    11371137                                do {
    11381138                                        name = padvance(&path, arg);
    1139                                         stunalloc(name);
     1139                                        stunalloc(psh, name);
    11401140                                } while (--j >= 0);
    11411141                                if (!v_flag)
  • trunk/src/kash/expand.c

    r809 r1198  
    124124expandhere(union node *arg, int fd)
    125125{
    126         herefd = fd;
     126        psh->herefd = fd;
    127127        expandarg(arg, (struct arglist *)NULL, 0);
    128         xwrite(fd, stackblock(), expdest - stackblock());
     128        xwrite(psh, fd, stackblock(psh), expdest - stackblock(psh));
    129129}
    130130
     
    144144
    145145        argbackq = arg->narg.backquote;
    146         STARTSTACKSTR(expdest);
     146        STARTSTACKSTR(psh, expdest);
    147147        ifsfirst.next = NULL;
    148148        ifslastp = NULL;
     
    151151                return;                 /* here document expanded */
    152152        }
    153         STPUTC('\0', expdest);
    154         p = grabstackstr(expdest);
     153        STPUTC(psh, '\0', expdest);
     154        p = grabstackstr(psh, expdest);
    155155        exparg.lastp = &exparg.list;
    156156        /*
     
    165165                if (flag & EXP_REDIR) /*XXX - for now, just remove escapes */
    166166                        rmescapes(p);
    167                 sp = (struct strlist *)stalloc(sizeof (struct strlist));
     167                sp = (struct strlist *)stalloc(psh, sizeof (struct strlist));
    168168                sp->text = p;
    169169                *exparg.lastp = sp;
     
    210210                                break;
    211211                        if ((flag & EXP_FULL) != 0)
    212                                 STPUTC(c, expdest);
     212                                STPUTC(psh, c, expdest);
    213213                        ifs_split = 0;
    214214                        break;
     
    218218                case CTLESC:
    219219                        if (quotes)
    220                                 STPUTC(c, expdest);
     220                                STPUTC(psh, c, expdest);
    221221                        c = *p++;
    222                         STPUTC(c, expdest);
     222                        STPUTC(psh, c, expdest);
    223223                        break;
    224224                case CTLVAR:
     
    239239                         * assignments (after the first '=' and after ':'s).
    240240                         */
    241                         STPUTC(c, expdest);
     241                        STPUTC(psh, c, expdest);
    242242                        if (flag & EXP_VARTILDE && *p == '~') {
    243243                                if (c == '=') {
     
    251251                        break;
    252252                default:
    253                         STPUTC(c, expdest);
     253                        STPUTC(psh, c, expdest);
    254254                        if (flag & EXP_IFS_SPLIT & ifs_split && strchr(ifs, c) != NULL) {
    255255                                /* We need to get the output split here... */
    256                                 recordregion(expdest - stackblock() - 1,
    257                                                 expdest - stackblock(), 0);
     256                                recordregion(expdest - stackblock(psh) - 1,
     257                                                expdest - stackblock(psh), 0);
    258258                        }
    259259                        break;
     
    300300        while ((c = *home++) != '\0') {
    301301                if (quotes && SQSYNTAX[(int)c] == CCTL)
    302                         STPUTC(CTLESC, expdest);
    303                 STPUTC(c, expdest);
     302                        STPUTC(psh, CTLESC, expdest);
     303                STPUTC(psh, c, expdest);
    304304        }
    305305        return (p);
     
    378378#error "integers with more than 10 digits are not supported"
    379379#endif
    380         CHECKSTRSPACE(12 - 2, expdest);
    381         USTPUTC('\0', expdest);
    382         start = stackblock();
     380        CHECKSTRSPACE(psh, 12 - 2, expdest);
     381        USTPUTC(psh, '\0', expdest);
     382        start = stackblock(psh);
    383383        p = expdest - 1;
    384384        while (*p != CTLARI && p >= start)
     
    408408                recordregion(begoff, p - 1 - start, 0);
    409409        result = expdest - p + 1;
    410         STADJUST(-result, expdest);
     410        STADJUST(psh, -result, expdest);
    411411}
    412412
     
    427427        struct nodelist *saveargbackq;
    428428        char lastc;
    429         int startloc = dest - stackblock();
     429        int startloc = dest - stackblock(psh);
    430430        char const *syntax = quoted? DQSYNTAX : BASESYNTAX;
    431431        int saveherefd;
     
    436436        savelastp = ifslastp;
    437437        saveargbackq = argbackq;
    438         saveherefd = herefd;
    439         herefd = -1;
    440         p = grabstackstr(dest);
     438        saveherefd = psh->herefd;
     439        psh->herefd = -1;
     440        p = grabstackstr(psh, dest);
    441441        evalbackcmd(cmd, &in);
    442         ungrabstackstr(p, dest);
     442        ungrabstackstr(psh, p, dest);
    443443        ifsfirst = saveifs;
    444444        ifslastp = savelastp;
    445445        argbackq = saveargbackq;
    446         herefd = saveherefd;
     446        psh->herefd = saveherefd;
    447447
    448448        p = in.buf;
     
    462462                if (lastc != '\0') {
    463463                        if (quotes && syntax[(int)lastc] == CCTL)
    464                                 STPUTC(CTLESC, dest);
    465                         STPUTC(lastc, dest);
     464                                STPUTC(psh, CTLESC, dest);
     465                        STPUTC(psh, lastc, dest);
    466466                }
    467467        }
    468468
    469469        /* Eat all trailing newlines */
    470         p = stackblock() + startloc;
     470        p = stackblock(psh) + startloc;
    471471        while (dest > p && dest[-1] == '\n')
    472                 STUNPUTC(dest);
     472                STUNPUTC(psh, dest);
    473473
    474474        if (in.fd >= 0)
     
    479479                back_exitstatus = waitforjob(in.jp);
    480480        if (quoted == 0)
    481                 recordregion(startloc, dest - stackblock(), 0);
     481                recordregion(startloc, dest - stackblock(psh), 0);
    482482        TRACE(("evalbackq: size=%d: \"%.*s\"\n",
    483                 (dest - stackblock()) - startloc,
    484                 (dest - stackblock()) - startloc,
    485                 stackblock() + startloc));
     483                (dest - stackblock(psh)) - startloc,
     484                (dest - stackblock(psh)) - startloc,
     485                stackblock(psh) + startloc));
    486486        expdest = dest;
    487487        INTON;
     
    497497        char *q;
    498498        int c = 0;
    499         int saveherefd = herefd;
     499        int saveherefd = psh->herefd;
    500500        struct nodelist *saveargbackq = argbackq;
    501501        int amount;
    502502
    503         herefd = -1;
     503        psh->herefd = -1;
    504504        argstr(p, 0);
    505         STACKSTRNUL(expdest);
    506         herefd = saveherefd;
     505        STACKSTRNUL(psh, expdest);
     506        psh->herefd = saveherefd;
    507507        argbackq = saveargbackq;
    508         startp = stackblock() + startloc;
     508        startp = stackblock(psh) + startloc;
    509509        if (str == NULL)
    510             str = stackblock() + strloc;
     510            str = stackblock(psh) + strloc;
    511511
    512512        switch (subtype) {
     
    514514                setvar(str, startp, 0);
    515515                amount = startp - expdest;
    516                 STADJUST(amount, expdest);
     516                STADJUST(psh, amount, expdest);
    517517                varflags &= ~VSNUL;
    518518                if (c != 0)
     
    593593        *loc = c;
    594594        amount = ((str - 1) - (loc - startp)) - expdest;
    595         STADJUST(amount, expdest);
     595        STADJUST(psh, amount, expdest);
    596596        while (loc != str - 1)
    597597                *startp++ = *loc++;
     
    600600recordright:
    601601        amount = loc - expdest;
    602         STADJUST(amount, expdest);
    603         STPUTC('\0', expdest);
    604         STADJUST(-1, expdest);
     602        STADJUST(psh, amount, expdest);
     603        STPUTC(psh, '\0', expdest);
     604        STADJUST(psh, -1, expdest);
    605605        return 1;
    606606}
     
    648648
    649649        varlen = 0;
    650         startloc = expdest - stackblock();
    651 
    652         if (!set && uflag) {
     650        startloc = expdest - stackblock(psh);
     651
     652        if (!set && uflag(psh)) {
    653653                switch (subtype) {
    654654                case VSNORMAL:
     
    668668                        varvalue(var, varflags & VSQUOTE, subtype, flag);
    669669                        if (subtype == VSLENGTH) {
    670                                 varlen = expdest - stackblock() - startloc;
    671                                 STADJUST(-varlen, expdest);
     670                                varlen = expdest - stackblock(psh) - startloc;
     671                                STADJUST(psh, -varlen, expdest);
    672672                        }
    673673                } else {
     
    681681                                while (*val) {
    682682                                        if (quotes && syntax[(int)*val] == CCTL)
    683                                                 STPUTC(CTLESC, expdest);
    684                                         STPUTC(*val++, expdest);
     683                                                STPUTC(psh, CTLESC, expdest);
     684                                        STPUTC(psh, *val++, expdest);
    685685                                }
    686686
     
    727727                 * right after it
    728728                 */
    729                 STPUTC('\0', expdest);
    730                 patloc = expdest - stackblock();
     729                STPUTC(psh, '\0', expdest);
     730                patloc = expdest - stackblock(psh);
    731731                if (subevalvar(p, NULL, patloc, subtype,
    732732                               startloc, varflags) == 0) {
    733                         int amount = (expdest - stackblock() - patloc) + 1;
    734                         STADJUST(-amount, expdest);
     733                        int amount = (expdest - stackblock(psh) - patloc) + 1;
     734                        STADJUST(psh, -amount, expdest);
    735735                }
    736736                /* Remove any recorded regions beyond start of variable */
     
    760760
    761761        if (apply_ifs)
    762                 recordregion(startloc, expdest - stackblock(),
     762                recordregion(startloc, expdest - stackblock(psh),
    763763                             varflags & VSQUOTE);
    764764
     
    846846                while (*p) { \
    847847                        if (syntax[(int)*p] == CCTL) \
    848                                 STPUTC(CTLESC, expdest); \
    849                         STPUTC(*p++, expdest); \
     848                                STPUTC(psh, CTLESC, expdest); \
     849                        STPUTC(psh, *p++, expdest); \
    850850                } \
    851851        } else \
    852852                while (*p) \
    853                         STPUTC(*p++, expdest); \
     853                        STPUTC(psh, *p++, expdest); \
    854854        } while (0)
    855855
     
    873873                for (i = 0; optlist[i].name; i++) {
    874874                        if (optlist[i].val)
    875                                 STPUTC(optlist[i].letter, expdest);
     875                                STPUTC(psh, optlist[i].letter, expdest);
    876876                }
    877877                break;
     
    881881                                STRTODEST(p);
    882882                                if (*ap)
    883                                         STPUTC('\0', expdest);
     883                                        STPUTC(psh, '\0', expdest);
    884884                        }
    885885                        break;
     
    894894                        STRTODEST(p);
    895895                        if (*ap && sep)
    896                                 STPUTC(sep, expdest);
     896                                STPUTC(psh, sep, expdest);
    897897                }
    898898                break;
     
    969969        if (ifslastp == NULL) {
    970970                /* Return entire argument, IFS doesn't apply to any of it */
    971                 sp = (struct strlist *)stalloc(sizeof *sp);
     971                sp = (struct strlist *)stalloc(psh, sizeof *sp);
    972972                sp->text = start;
    973973                *arglist->lastp = sp;
     
    10091009                        /* Save this argument... */
    10101010                        *q = '\0';
    1011                         sp = (struct strlist *)stalloc(sizeof *sp);
     1011                        sp = (struct strlist *)stalloc(psh, sizeof *sp);
    10121012                        sp->text = start;
    10131013                        *arglist->lastp = sp;
     
    10431043         */
    10441044        if (*start /* || (!ifsspc && start > string) */) {
    1045                 sp = (struct strlist *)stalloc(sizeof *sp);
     1045                sp = (struct strlist *)stalloc(psh, sizeof *sp);
    10461046                sp->text = start;
    10471047                *arglist->lastp = sp;
     
    10851085
    10861086        while (str) {
    1087                 if (fflag)
     1087                if (fflag(psh))
    10881088                        goto nometa;
    10891089                p = str->text;
     
    12641264        struct strlist *sp;
    12651265
    1266         p = stalloc(strlen(name) + 1);
     1266        p = stalloc(psh, strlen(name) + 1);
    12671267        scopy(name, p);
    1268         sp = (struct strlist *)stalloc(sizeof *sp);
     1268        sp = (struct strlist *)stalloc(psh, sizeof *sp);
    12691269        sp->text = p;
    12701270        *exparg.lastp = sp;
     
    15091509        char *p;
    15101510
    1511         setstackmark(&smark);
     1511        setstackmark(psh, &smark);
    15121512        argbackq = pattern->narg.backquote;
    1513         STARTSTACKSTR(expdest);
     1513        STARTSTACKSTR(psh, expdest);
    15141514        ifslastp = NULL;
    15151515        argstr(pattern->narg.text, EXP_TILDE | EXP_CASE);
    1516         STPUTC('\0', expdest);
    1517         p = grabstackstr(expdest);
     1516        STPUTC(psh, '\0', expdest);
     1517        p = grabstackstr(psh, expdest);
    15181518        result = patmatch(p, val, 0);
    1519         popstackmark(&smark);
     1519        popstackmark(psh, &smark);
    15201520        return result;
    15211521}
     
    15421542
    15431543        while (*p)
    1544                 STPUTC(*p++, buf);
     1544                STPUTC(psh, *p++, buf);
    15451545        return buf;
    15461546}
  • trunk/src/kash/generated/arith.c

    r631 r1198  
    329329                         * concatenate arguments
    330330                         */
    331                         STARTSTACKSTR(concat);
     331                        STARTSTACKSTR(psh, concat);
    332332                        ap = argv + 2;
    333333                        for (;;) {
    334334                                while (*p)
    335                                         STPUTC(*p++, concat);
     335                                        STPUTC(psh, *p++, concat);
    336336                                if ((p = *ap++) == NULL)
    337337                                        break;
    338                                 STPUTC(' ', concat);
     338                                STPUTC(psh, ' ', concat);
    339339                        }
    340                         STPUTC('\0', concat);
    341                         p = grabstackstr(concat);
     340                        STPUTC(psh, '\0', concat);
     341                        p = grabstackstr(psh, concat);
    342342                }
    343343        } else
     
    382382#define YYERROR goto yyerrlab
    383383#ifdef __cplusplus
    384 extern "C" { 
     384extern "C" {
    385385char * getenv();
    386386int yylex();
  • trunk/src/kash/generated/init.c

    r631 r1198  
    4444#define DEFEDITOR       "ed"    /* default editor *should* be $EDITOR */
    4545#undef  editing
    46 #define editing (Eflag || Vflag)
     46#define editing (Eflag(psh) || Vflag(psh))
    4747#undef  EOF_NLEFT
    4848#define EOF_NLEFT -99           /* value of parsenleft when EOF pushed back */
  • trunk/src/kash/histedit.c

    r809 r1198  
    9191        FILE *el_err;
    9292
    93 #define editing (Eflag || Vflag)
    94 
    95         if (iflag) {
     93#define editing (Eflag(psh) || Vflag(psh))
     94
     95        if (iflag(psh)) {
    9696                if (!hist) {
    9797                        /*
     
    154154                }
    155155                if (el) {
    156                         if (Vflag)
     156                        if (Vflag(psh))
    157157                                el_set(el, EL_EDITOR, "vi");
    158                         else if (Eflag)
     158                        else if (Eflag(psh))
    159159                                el_set(el, EL_EDITOR, "emacs");
    160160                        el_set(el, EL_BIND, "^I",
    161                             tabcomplete ? "rl-complete" : "ed-insert", NULL);
     161                            tabcomplete(psh) ? "rl-complete" : "ed-insert", NULL);
    162162                        el_source(el, NULL);
    163163                }
     
    418418                                }
    419419
    420                                 evalstring(strcpy(stalloc(strlen(s) + 1), s), 0);
     420                                evalstring(strcpy(stalloc(psh, strlen(s) + 1), s), 0);
    421421                                if (displayhist && hist) {
    422422                                        /*
     
    440440
    441441                fclose(efp);
    442                 editcmd = stalloc(strlen(editor) + strlen(editfile) + 2);
     442                editcmd = stalloc(psh, strlen(editor) + strlen(editfile) + 2);
    443443                sprintf(editcmd, "%s %s", editor, editfile);
    444444                evalstring(editcmd, 0); /* XXX - should use no JC command */
     
    461461        int plen = strlen(p);
    462462
    463         STARTSTACKSTR(dest);
     463        STARTSTACKSTR(psh, dest);
    464464        while (*s) {
    465465                if (*s == *p && strncmp(s, p, plen) == 0) {
    466466                        while (*r)
    467                                 STPUTC(*r++, dest);
     467                                STPUTC(psh, *r++, dest);
    468468                        s += plen;
    469469                        *p = '\0';      /* so no more matches */
    470470                } else
    471                         STPUTC(*s++, dest);
    472         }
    473         STACKSTRNUL(dest);
    474         dest = grabstackstr(dest);
     471                        STPUTC(psh, *s++, dest);
     472        }
     473        STACKSTRNUL(psh, dest);
     474        dest = grabstackstr(psh, dest);
    475475
    476476        return (dest);
     
    537537#else
    538538int
    539 histcmd(int argc, char **argv)
    540 {
    541         error("not compiled with history support");
     539histcmd(shinstance *psh, int argc, char **argv)
     540{
     541        error(psh, "not compiled with history support");
    542542        /* NOTREACHED */
     543        return -1;
    543544}
    544545int
    545 inputrc(int argc, char **argv)
    546 {
    547         error("not compiled with history support");
     546inputrc(shinstance *psh, int argc, char **argv)
     547{
     548        error(psh, "not compiled with history support");
    548549        /* NOTREACHED */
    549 }
    550 #endif
     550        return -1;
     551}
     552#endif
  • trunk/src/kash/input.c

    r809 r1198  
    316316#endif
    317317
    318         if (vflag) {
     318        if (vflag(psh)) {
    319319                out2str(parsenextc);
    320320                flushout(out2);
  • trunk/src/kash/jobs.c

    r883 r1198  
    193193out:
    194194                                out2str("sh: can't access tty; job control turned off\n");
    195                                 mflag = 0;
     195                                mflag(psh) = 0;
    196196                                return;
    197197                        }
     
    208208                    || ldisc != NTTYDISC) {
    209209                        out2str("sh: need new tty driver to run job control; job control turned off\n");
    210                         mflag = 0;
     210                        mflag(psh) = 0;
    211211                        return;
    212212                }
     
    549549         * put us in it.
    550550         */
    551         if (mflag && gotpid != -1 && tcgetpgrp(ttyfd) != getpid()) {
     551        if (mflag(psh) && gotpid != -1 && tcgetpgrp(ttyfd) != getpid()) {
    552552                if (tcsetpgrp(ttyfd, getpid()) == -1)
    553553                        error("Cannot set tty process group (%s) at %d",
     
    651651                        retval = WTERMSIG(status) + 128;
    652652                }
    653                 if (!iflag)
     653                if (!iflag(psh))
    654654                        freejob(job);
    655655        }
     
    705705        } else if (name[0] == '%') {
    706706                if (is_number(name + 1)) {
    707                         jobno = number(name + 1) - 1;
     707                        jobno = number(psh, name + 1) - 1;
    708708                } else if (!name[2]) {
    709709                        switch (name[1]) {
     
    748748
    749749        } else if (is_number(name)) {
    750                 pid = number(name);
     750                pid = number(psh, name);
    751751                for (jp = jobtab, i = njobs ; --i >= 0 ; jp++) {
    752752                        if (jp->used && jp->nprocs > 0
     
    870870        int pgrp;
    871871
    872         if (rootshell && mode != FORK_NOJOB && mflag) {
     872        if (rootshell && mode != FORK_NOJOB && mflag(psh)) {
    873873                if (jp == NULL || jp->nprocs == 0)
    874874                        pgrp = pid;
     
    910910        if (!vforked)
    911911                jobctl = 0;             /* do job control only in root shell */
    912         if (wasroot && mode != FORK_NOJOB && mflag) {
     912        if (wasroot && mode != FORK_NOJOB && mflag(psh)) {
    913913                if (jp == NULL || jp->nprocs == 0)
    914914                        pgrp = getpid();
     
    946946        }
    947947#endif
    948         if (wasroot && iflag) {
     948        if (wasroot && iflag(psh)) {
    949949                setsignal(SIGINT, vforked);
    950950                setsignal(SIGQUIT, vforked);
     
    10901090        if (thisjob && thisjob->state != JOBRUNNING) {
    10911091                int mode = 0;
    1092                 if (!rootshell || !iflag)
     1092                if (!rootshell || !iflag(psh))
    10931093                        mode = SHOW_SIGNALLED;
    10941094                if (job == thisjob)
     
    12191219
    12201220        cmdnextc = ps->cmd;
    1221         if (iflag || mflag || sizeof ps->cmd < 100)
     1221        if (iflag(psh) || mflag(psh) || sizeof ps->cmd < 100)
    12221222                len = sizeof(ps->cmd);
    12231223        else
  • trunk/src/kash/machdep.h

    r626 r1198  
    4040 */
    4141
     42#ifdef _MSC_VER
     43#define SHELL_SIZE (8 - 1)
     44#else
    4245#define SHELL_SIZE (sizeof(union {int i; char *cp; double d; }) - 1)
     46#endif
     47
    4348/*
    4449 * It appears that grabstackstr() will barf with such alignments
  • trunk/src/kash/mail.c

    r809 r1198  
    5858#include "error.h"
    5959#include "mail.h"
     60#include "shinstance.h"
    6061
    6162
    62 #define MAXMBOXES 10
     63/*#define MAXMBOXES 10*/
    6364
    6465
    65 STATIC int nmboxes;                     /* number of mailboxes */
    66 STATIC time_t mailtime[MAXMBOXES];      /* times of mailboxes */
     66/*STATIC int nmboxes;                   /* number of mailboxes */
     67/*STATIC time_t mailtime[MAXMBOXES];*/  /* times of mailboxes */
    6768
    6869
     
    7576
    7677void
    77 chkmail(int silent)
     78chkmail(shinstance *psh, int silent)
    7879{
    7980        int i;
     
    8586
    8687        if (silent)
    87                 nmboxes = 10;
    88         if (nmboxes == 0)
     88                psh->nmboxes = 10;
     89        if (psh->nmboxes == 0)
    8990                return;
    90         setstackmark(&smark);
    91         mpath = mpathset() ? mpathval() : mailval();
    92         for (i = 0 ; i < nmboxes ; i++) {
    93                 p = padvance(&mpath, nullstr);
     91        setstackmark(psh, &smark);
     92        mpath = mpathset(psh) ? mpathval(psh) : mailval(psh);
     93        for (i = 0 ; i < psh->nmboxes ; i++) {
     94                p = padvance(psh, &mpath, nullstr);
    9495                if (p == NULL)
    9596                        break;
     
    101102                q[-1] = '\0';                   /* delete trailing '/' */
    102103#ifdef notdef /* this is what the System V shell claims to do (it lies) */
    103                 if (stat(p, &statb) < 0)
     104                if (shfile_stat(&psh->fdtab, p, &statb) < 0)
    104105                        statb.st_mtime = 0;
    105                 if (statb.st_mtime > mailtime[i] && ! silent) {
    106                         out2str(pathopt ? pathopt : "you have mail");
    107                         out2c('\n');
     106                if (statb.st_mtime > psh->mailtime[i] && ! silent) {
     107                        out2str(psh, psh->pathopt ? psh->pathopt : "you have mail");
     108                        out2c(psh, '\n');
    108109                }
    109                 mailtime[i] = statb.st_mtime;
     110                psh->mailtime[i] = statb.st_mtime;
    110111#else /* this is what it should do */
    111                 if (stat(p, &statb) < 0)
     112                if (shfile_stat(&psh->fdtab, p, &statb) < 0)
    112113                        statb.st_size = 0;
    113                 if (statb.st_size > mailtime[i] && ! silent) {
    114                         out2str(pathopt ? pathopt : "you have mail");
    115                         out2c('\n');
     114                if (statb.st_size > psh->mailtime[i] && ! silent) {
     115                        out2str(psh, psh->pathopt ? psh->pathopt : "you have mail");
     116                        out2c(psh, '\n');
    116117                }
    117                 mailtime[i] = statb.st_size;
     118                psh->mailtime[i] = statb.st_size;
    118119#endif
    119120        }
    120         nmboxes = i;
    121         popstackmark(&smark);
     121        psh->nmboxes = i;
     122        popstackmark(psh, &smark);
    122123}
  • trunk/src/kash/main.c

    r884 r1198  
    8484/*int rootpid;
    8585int rootshell;*/
     86#ifdef unused_variables
    8687STATIC union node *curcmd;
    8788STATIC union node *prevcmd;
     89#endif
    8890
    8991STATIC void read_profile(struct shinstance *, const char *);
     
    9496extern void init_syntax(void);
    9597#endif
     98STATIC int usage(const char *argv0);
     99STATIC int version(const char *argv0);
    96100
    97101/*
     
    109113
    110114        /*
    111          * Global initializations. 
    112         */
     115         * Global initializations.
     116        */
    113117        setlocale(LC_ALL, "");
    114118#ifdef _MSC_VER
    115119        init_syntax();
    116120#endif
     121
     122        /*
     123         * Check for --version and --help.
     124     */
     125        if (argc > 1 && argv[1][0] == '-' && argv[1][1] == '-') {
     126                if (!strcmp(argv[1], "--help"))
     127                        return usage(argv[0]);
     128                if (!strcmp(argv[1], "--version"))
     129                        return version(argv[0]);
     130        }
     131
    117132        /*
    118133         * Create the root shell instance.
     
    123138        shthread_set_shell(psh);
    124139        return shell_main(psh, argc, argv);
    125 }       
    126 
    127 int 
     140}
     141
     142int
    128143shell_main(shinstance *psh, int argc, char **argv)
    129144{
     
    161176
    162177                if (psh->exception != EXSHELLPROC) {
    163                         if (state == 0 || psh->iflag == 0 || ! psh->rootshell)
     178                        if (state == 0 || iflag(psh) == 0 || ! psh->rootshell)
    164179                                exitshell(psh, psh->exitstatus);
    165180                }
     
    189204#ifdef DEBUG
    190205#if DEBUG == 2
    191         debug = 1;
     206        debug(psh) = 1;
    192207#endif
    193208        opentrace(psh);
     
    215230state3:
    216231        state = 4;
    217         if (psh->sflag == 0 || psh->minusc) {
     232        if (sflag(psh) == 0 || psh->minusc) {
    218233                static int sigs[] =  {
    219234                    SIGINT, SIGQUIT, SIGHUP,
     
    233248                evalstring(psh, psh->minusc, 0);
    234249
    235         if (psh->sflag || psh->minusc == NULL) {
     250        if (sflag(psh) || psh->minusc == NULL) {
    236251state4: /* XXX ??? - why isn't this before the "if" statement */
    237252                cmdloop(psh, 1);
     
    262277                        dotrap(psh);
    263278                inter = 0;
    264                 if (psh->iflag && top) {
     279                if (iflag(psh) && top) {
    265280                        inter = 1;
    266281                        showjobs(psh, psh->out2, SHOW_CHANGED);
     
    274289                                break;
    275290                        if (!stoppedjobs(psh)) {
    276                                 if (!psh->Iflag)
     291                                if (!Iflag(psh))
    277292                                        break;
    278293                                out2str(psh, "\nUse \"exit\" to leave shell.\n");
    279294                        }
    280295                        numeof++;
    281                 } else if (n != NULL && psh->nflag == 0) {
     296                } else if (n != NULL && nflag(psh) == 0) {
    282297                        psh->job_warning = (psh->job_warning == 2) ? 1 : 0;
    283298                        numeof = 0;
     
    314329                return;
    315330        /* -q turns off -x and -v just when executing init files */
    316         if (psh->qflag)  {
    317             if (psh->xflag)
    318                     psh->xflag = 0, xflag_set = 1;
    319             if (psh->vflag)
    320                     psh->vflag = 0, vflag_set = 1;
     331        if (qflag(psh))  {
     332            if (xflag(psh))
     333                    xflag(psh) = 0, xflag_set = 1;
     334            if (vflag(psh))
     335                    vflag(psh) = 0, vflag_set = 1;
    321336        }
    322337        cmdloop(psh, 0);
    323         if (psh->qflag)  {
     338        if (qflag(psh))  {
    324339            if (xflag_set)
    325                     psh->xflag = 1;
     340                    xflag(psh) = 1;
    326341            if (vflag_set)
    327                     psh->vflag = 1;
     342                    vflag(psh) = 1;
    328343        }
    329344        popfile(psh);
     
    414429                return 0;
    415430        if (argc > 1)
    416                 psh->exitstatus = number(argv[1]);
     431                psh->exitstatus = number(psh, argv[1]);
    417432        exitshell(psh, psh->exitstatus);
    418433        /* NOTREACHED */
     
    420435}
    421436
     437
     438STATIC const char *
     439strip_argv0(const char *argv0, size_t *lenp)
     440{
     441        const char *tmp;
     442
     443        /* skip the path */
     444        for (tmp = strpbrk(argv0, "\\/:"); tmp; tmp = strpbrk(argv0, "\\/:"))
     445                argv0 = tmp + 1;
     446
     447        /* find the end, ignoring extenions */
     448        tmp = strrchr(argv0, '.');
     449        if (!tmp)
     450                tmp = strchr(argv0, '\0');
     451        *lenp = tmp - argv0;
     452        return argv0;
     453}
     454
     455STATIC int
     456usage(const char *argv0)
     457{
     458        size_t len;
     459        strip_argv0(argv0, &len);
     460
     461        fprintf(stdout,
     462                        "usage: %.*s [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o option_name]\n"
     463                    "               [+o option_name] [command_file [argument ...]]\n"
     464                    "   or: %.*s -c [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o option_name]\n"
     465                    "               [+o option_name] command_string [command_name [argument ...]]\n"
     466                    "   or: %.*s -s [-aCefnuvxIimqVEb] [+aCefnuvxIimqVEb] [-o option_name]\n"
     467                    "               [+o option_name] [argument ...]\n"
     468                    "   or: %.*s --help\n"
     469                    "   or: %.*s --version\n",
     470                    len, argv0, len, argv0, len, argv0, len, argv0, len, argv0);
     471        return 0;
     472}
     473
     474STATIC int
     475version(const char *argv0)
     476{
     477        size_t len;
     478        strip_argv0(argv0, &len);
     479
     480        fprintf(stdout,
     481                        "%.*s - kBuild version %d.%d.%d\n",
     482                    len, argv0,
     483                    KBUILD_VERSION_MAJOR, KBUILD_VERSION_MINOR, KBUILD_VERSION_PATCH);
     484        return 0;
     485}
     486
     487
    422488/*
    423489 * Local Variables:
  • trunk/src/kash/memalloc.c

    r809 r1198  
    5959
    6060pointer
    61 ckmalloc(int nbytes)
     61ckmalloc(size_t nbytes)
    6262{
    6363        pointer p;
     
    6565        p = malloc(nbytes);
    6666        if (p == NULL)
    67                 error("Out of space");
     67                error(NULL, "Out of space");
    6868        return p;
    6969}
     
    7575
    7676pointer
    77 ckrealloc(pointer p, int nbytes)
     77ckrealloc(pointer p, size_t nbytes)
    7878{
    7979        p = realloc(p, nbytes);
    8080        if (p == NULL)
    81                 error("Out of space");
     81                error(NULL, "Out of space");
    8282        return p;
    8383}
     
    108108 */
    109109
    110 #define MINSIZE 504             /* minimum size of a block */
    111 
    112 struct stack_block {
    113         struct stack_block *prev;
    114         char space[MINSIZE];
    115 };
    116 
    117 struct stack_block stackbase;
    118 struct stack_block *stackp = &stackbase;
    119 struct stackmark *markp;
    120 char *stacknxt = stackbase.space;
    121 int stacknleft = MINSIZE;
    122 int sstrnleft;
    123 int herefd = -1;
     110//#define MINSIZE 504           /* minimum size of a block */
     111
     112//struct stack_block {
     113//      struct stack_block *prev;
     114//      char space[MINSIZE];
     115//};
     116
     117//struct stack_block stackbase;
     118//struct stack_block *stackp = &stackbase;
     119//struct stackmark *markp;
     120//char *stacknxt = stackbase.space;
     121//int stacknleft = MINSIZE;
     122//int sstrnleft;
     123//int herefd = -1;
    124124
    125125pointer
    126 stalloc(int nbytes)
     126stalloc(shinstance *psh, size_t nbytes)
    127127{
    128128        char *p;
    129129
    130130        nbytes = SHELL_ALIGN(nbytes);
    131         if (nbytes > stacknleft) {
    132                 int blocksize;
     131        if (nbytes > psh->stacknleft) {
     132                size_t blocksize;
    133133                struct stack_block *sp;
    134134
     
    138138                INTOFF;
    139139                sp = ckmalloc(sizeof(struct stack_block) - MINSIZE + blocksize);
    140                 sp->prev = stackp;
    141                 stacknxt = sp->space;
    142                 stacknleft = blocksize;
    143                 stackp = sp;
     140                sp->prev = psh->stackp;
     141                psh->stacknxt = sp->space;
     142                psh->stacknleft = (int)blocksize;
     143                psh->stackp = sp;
    144144                INTON;
    145145        }
    146         p = stacknxt;
    147         stacknxt += nbytes;
    148         stacknleft -= nbytes;
     146        p = psh->stacknxt;
     147        psh->stacknxt += nbytes;
     148        psh->stacknleft -= (int)nbytes;
    149149        return p;
    150150}
     
    152152
    153153void
    154 stunalloc(pointer p)
     154stunalloc(shinstance *psh, pointer p)
    155155{
    156156        if (p == NULL) {                /*DEBUG */
    157                 write(2, "stunalloc\n", 10);
    158                 abort();
    159         }
    160         stacknleft += stacknxt - (char *)p;
    161         stacknxt = p;
    162 }
    163 
    164 
    165 
    166 void
    167 setstackmark(struct stackmark *mark)
    168 {
    169         mark->stackp = stackp;
    170         mark->stacknxt = stacknxt;
    171         mark->stacknleft = stacknleft;
    172         mark->marknext = markp;
    173         markp = mark;
    174 }
    175 
    176 
    177 void
    178 popstackmark(struct stackmark *mark)
     157                shfile_write(&psh->fdtab, 2, "stunalloc\n", 10);
     158                sh_abort(psh);
     159        }
     160        psh->stacknleft += (int)(psh->stacknxt - (char *)p);
     161        psh->stacknxt = p;
     162}
     163
     164
     165
     166void
     167setstackmark(shinstance *psh, struct stackmark *mark)
     168{
     169        mark->stackp = psh->stackp;
     170        mark->stacknxt = psh->stacknxt;
     171        mark->stacknleft = psh->stacknleft;
     172        mark->marknext = psh->markp;
     173        psh->markp = mark;
     174}
     175
     176
     177void
     178popstackmark(shinstance *psh, struct stackmark *mark)
    179179{
    180180        struct stack_block *sp;
    181181
    182182        INTOFF;
    183         markp = mark->marknext;
    184         while (stackp != mark->stackp) {
    185                 sp = stackp;
    186                 stackp = sp->prev;
     183        psh->markp = mark->marknext;
     184        while (psh->stackp != mark->stackp) {
     185                sp = psh->stackp;
     186                psh->stackp = sp->prev;
    187187                ckfree(sp);
    188188        }
    189         stacknxt = mark->stacknxt;
    190         stacknleft = mark->stacknleft;
     189        psh->stacknxt = mark->stacknxt;
     190        psh->stacknleft = mark->stacknleft;
    191191        INTON;
    192192}
     
    204204
    205205void
    206 growstackblock(void)
    207 {
    208         int newlen = SHELL_ALIGN(stacknleft * 2 + 100);
    209 
    210         if (stacknxt == stackp->space && stackp != &stackbase) {
     206growstackblock(shinstance *psh)
     207{
     208        int newlen = SHELL_ALIGN(psh->stacknleft * 2 + 100);
     209
     210        if (psh->stacknxt == psh->stackp->space && psh->stackp != &psh->stackbase) {
    211211                struct stack_block *oldstackp;
    212212                struct stackmark *xmark;
     
    214214
    215215                INTOFF;
    216                 oldstackp = stackp;
    217                 sp = stackp;
    218                 stackp = sp->prev;
     216                oldstackp = psh->stackp;
     217                sp = psh->stackp;
     218                psh->stackp = sp->prev;
    219219                sp = ckrealloc((pointer)sp,
    220220                    sizeof(struct stack_block) - MINSIZE + newlen);
    221                 sp->prev = stackp;
    222                 stackp = sp;
    223                 stacknxt = sp->space;
    224                 stacknleft = newlen;
     221                sp->prev = psh->stackp;
     222                psh->stackp = sp;
     223                psh->stacknxt = sp->space;
     224                psh->stacknleft = newlen;
    225225
    226226                /*
     
    228228                 * must be relocated to point to the new block
    229229                 */
    230                 xmark = markp;
     230                xmark = psh->markp;
    231231                while (xmark != NULL && xmark->stackp == oldstackp) {
    232                         xmark->stackp = stackp;
    233                         xmark->stacknxt = stacknxt;
    234                         xmark->stacknleft = stacknleft;
     232                        xmark->stackp = psh->stackp;
     233                        xmark->stacknxt = psh->stacknxt;
     234                        xmark->stacknleft = psh->stacknleft;
    235235                        xmark = xmark->marknext;
    236236                }
    237237                INTON;
    238238        } else {
    239                 char *oldspace = stacknxt;
    240                 int oldlen = stacknleft;
    241                 char *p = stalloc(newlen);
     239                char *oldspace = psh->stacknxt;
     240                int oldlen = psh->stacknleft;
     241                char *p = stalloc(psh, newlen);
    242242
    243243                (void)memcpy(p, oldspace, oldlen);
    244                 stacknxt = p;                   /* free the space */
    245                 stacknleft += newlen;           /* we just allocated */
    246         }
    247 }
    248 
    249 void
    250 grabstackblock(int len)
     244                psh->stacknxt = p;                      /* free the space */
     245                psh->stacknleft += newlen;              /* we just allocated */
     246        }
     247}
     248
     249void
     250grabstackblock(shinstance *psh, int len)
    251251{
    252252        len = SHELL_ALIGN(len);
    253         stacknxt += len;
    254         stacknleft -= len;
     253        psh->stacknxt += len;
     254        psh->stacknleft -= len;
    255255}
    256256
     
    260260 * to be a register.  The macro STARTSTACKSTR initializes things.  Then
    261261 * the user uses the macro STPUTC to add characters to the string.  In
    262  * effect, STPUTC(c, p) is the same as *p++ = c except that the stack is
     262 * effect, STPUTC(psh, c, p) is the same as *p++ = c except that the stack is
    263263 * grown as necessary.  When the user is done, she can just leave the
    264  * string there and refer to it using stackblock().  Or she can allocate
     264 * string there and refer to it using stackblock(psh).  Or she can allocate
    265265 * the space for it using grabstackstr().  If it is necessary to allow
    266266 * someone else to use the stack temporarily and then continue to grow
     
    274274
    275275char *
    276 growstackstr(void)
    277 {
    278         int len = stackblocksize();
    279         if (herefd >= 0 && len >= 1024) {
    280                 xwrite(herefd, stackblock(), len);
    281                 sstrnleft = len - 1;
    282                 return stackblock();
    283         }
    284         growstackblock();
    285         sstrnleft = stackblocksize() - len - 1;
    286         return stackblock() + len;
     276growstackstr(shinstance *psh)
     277{
     278        int len = stackblocksize(psh);
     279        if (psh->herefd >= 0 && len >= 1024) {
     280                xwrite(psh, psh->herefd, stackblock(psh), len);
     281                psh->sstrnleft = len - 1;
     282                return stackblock(psh);
     283        }
     284        growstackblock(psh);
     285        psh->sstrnleft = stackblocksize(psh) - len - 1;
     286        return stackblock(psh) + len;
    287287}
    288288
     
    292292
    293293char *
    294 makestrspace(void)
    295 {
    296         int len = stackblocksize() - sstrnleft;
    297         growstackblock();
    298         sstrnleft = stackblocksize() - len;
    299         return stackblock() + len;
    300 }
    301 
    302 void
    303 ungrabstackstr(char *s, char *p)
    304 {
    305         stacknleft += stacknxt - s;
    306         stacknxt = s;
    307         sstrnleft = stacknleft - (p - s);
    308 
    309 }
     294makestrspace(shinstance *psh)
     295{
     296        int len = stackblocksize(psh) - psh->sstrnleft;
     297        growstackblock(psh);
     298        psh->sstrnleft = stackblocksize(psh) - len;
     299        return stackblock(psh) + len;
     300}
     301
     302void
     303ungrabstackstr(shinstance *psh, char *s, char *p)
     304{
     305        psh->stacknleft += (int)(psh->stacknxt - s);
     306        psh->stacknxt = s;
     307        psh->sstrnleft = (int)(psh->stacknleft - (p - s));
     308
     309}
  • trunk/src/kash/memalloc.h

    r884 r1198  
    4848extern int herefd;*/
    4949
    50 pointer ckmalloc(int);
    51 pointer ckrealloc(pointer, int);
     50pointer ckmalloc(size_t);
     51pointer ckrealloc(pointer, size_t);
    5252char *savestr(const char *);
    53 pointer stalloc(struct shinstance *, int);
     53pointer stalloc(struct shinstance *, size_t);
    5454void stunalloc(struct shinstance *, pointer);
    5555void setstackmark(struct shinstance *, struct stackmark *);
     
    6363
    6464
    65 #define stackblock() psh->stacknxt
    66 #define stackblocksize() psh->stacknleft
    67 #define STARTSTACKSTR(p)        p = stackblock(), psh->sstrnleft = stackblocksize()
    68 #define STPUTC(c, p)    (--psh->sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(psh), *p++ = (c)))
    69 #define CHECKSTRSPACE(n, p)     { if (psh->sstrnleft < n) p = makestrspace(psh); }
    70 #define USTPUTC(c, p)   (--psh->sstrnleft, *p++ = (c))
    71 #define STACKSTRNUL(p)  (psh->sstrnleft == 0? (p = growstackstr(psh), *p = '\0') : (*p = '\0'))
    72 #define STUNPUTC(p)     (++psh->sstrnleft, --p)
    73 #define STTOPC(p)       p[-1]
    74 #define STADJUST(amount, p)     (p += (amount), psh->sstrnleft -= (amount))
    75 #define grabstackstr(p) stalloc(psh, stackblocksize() - psh->sstrnleft)
     65#define stackblock(psh)             (psh)->stacknxt
     66#define stackblocksize(psh)         (psh)->stacknleft
     67#define STARTSTACKSTR(psh, p)       p = stackblock(psh), (psh)->sstrnleft = stackblocksize(psh)
     68#define STPUTC(psh, c, p)           (--(psh)->sstrnleft >= 0? (*p++ = (c)) : (p = growstackstr(psh), *p++ = (c)))
     69#define CHECKSTRSPACE(psh, n, p)    { if ((psh)->sstrnleft < n) p = makestrspace(psh); }
     70#define USTPUTC(psh, c, p)          (--(psh)->sstrnleft, *p++ = (c))
     71#define STACKSTRNUL(psh, p)         ((psh)->sstrnleft == 0? (p = growstackstr(psh), *p = '\0') : (*p = '\0'))
     72#define STUNPUTC(psh, p)            (++(psh)->sstrnleft, --p)
     73#define STTOPC(psh, p)              p[-1]
     74#define STADJUST(psh, amount, p)    (p += (amount), (psh)->sstrnleft -= (amount))
     75#define grabstackstr(psh, p)        stalloc((psh), stackblocksize(psh) - (psh)->sstrnleft)
    7676
    7777#define ckfree(p)       free((pointer)(p))
  • trunk/src/kash/miscbltin.c

    r809 r1198  
    125125        status = 0;
    126126        startword = 2;
    127         STARTSTACKSTR(p);
     127        STARTSTACKSTR(psh, p);
    128128        for (;;) {
    129129                if (read(0, &c, 1) != 1) {
     
    139139                        }
    140140                        if (c != '\n')
    141                                 STPUTC(c, p);
     141                                STPUTC(psh, c, p);
    142142                        continue;
    143143                }
     
    153153                                /* Ignore leading IFS whitespace */
    154154                                if (saveall)
    155                                         STPUTC(c, p);
     155                                        STPUTC(psh, c, p);
    156156                                continue;
    157157                        }
     
    160160                                startword = 2;
    161161                                if (saveall)
    162                                         STPUTC(c, p);
     162                                        STPUTC(psh, c, p);
    163163                                continue;
    164164                        }
     
    171171                                /* Not just a spare terminator */
    172172                                saveall++;
    173                         STPUTC(c, p);
     173                        STPUTC(psh, c, p);
    174174                        continue;
    175175                }
     
    181181                        /* Last variable needs all IFS chars */
    182182                        saveall++;
    183                         STPUTC(c, p);
     183                        STPUTC(psh, c, p);
    184184                        continue;
    185185                }
    186186
    187                 STACKSTRNUL(p);
    188                 setvar(*ap, stackblock(), 0);
     187                STACKSTRNUL(psh, p);
     188                setvar(*ap, stackblock(psh), 0);
    189189                ap++;
    190                 STARTSTACKSTR(p);
    191         }
    192         STACKSTRNUL(p);
     190                STARTSTACKSTR(psh, p);
     191        }
     192        STACKSTRNUL(psh, p);
    193193
    194194        /* Remove trailing IFS chars */
    195         for (; stackblock() <= --p; *p = 0) {
     195        for (; stackblock(psh) <= --p; *p = 0) {
    196196                if (!strchr(ifs, *p))
    197197                        break;
     
    203203                        break;
    204204        }
    205         setvar(*ap, stackblock(), 0);
     205        setvar(*ap, stackblock(psh), 0);
    206206
    207207        /* Set any remaining args to "" */
  • trunk/src/kash/mystring.c

    r809 r1198  
    111111
    112112int
    113 number(const char *s)
     113number(shinstance *psh, const char *s)
    114114{
    115115
    116116        if (! is_number(s))
    117                 error("Illegal number: %s", s);
     117                error(psh, "Illegal number: %s", s);
    118118        return atoi(s);
    119119}
  • trunk/src/kash/mystring.h

    r626 r1198  
    3636
    3737#include <string.h>
     38#include "shinstance.h"
    3839
    3940void scopyn(const char *, char *, int);
    4041int prefix(const char *, const char *);
    41 int number(const char *);
     42int number(shinstance *, const char *);
    4243int is_number(const char *);
    4344
  • trunk/src/kash/options.c

    r809 r1198  
    6666#endif
    6767#include "show.h"
    68 
    69 char *arg0;                     /* value of $0 */
    70 struct shparam shellparam;      /* current positional parameters */
    71 char **argptr;                  /* argument list for builtin commands */
    72 char *optionarg;                /* set by nextopt (like getopt) */
    73 char *optptr;                   /* used by nextopt */
    74 
    75 char *minusc;                   /* argument to -c option */
    76 
    77 
    78 STATIC void options(int);
    79 STATIC void minus_o(char *, int);
    80 STATIC void setoption(int, int);
    81 STATIC int getopts(char *, char *, char **, char ***, char **);
     68#include "shinstance.h"
     69
     70//char *arg0;                   /* value of $0 */
     71//struct shparam shellparam;    /* current positional parameters */
     72//char **argptr;                        /* argument list for builtin commands */
     73//char *optionarg;              /* set by nextopt (like getopt) */
     74//char *optptr;                 /* used by nextopt */
     75
     76//char *minusc;                 /* argument to -c option */
     77
     78
     79STATIC void options(shinstance *, int);
     80STATIC void minus_o(shinstance *, char *, int);
     81STATIC void setoption(shinstance *, int, int);
     82STATIC int getopts(shinstance *, char *, char *, char **, char ***, char **);
    8283
    8384
     
    8788
    8889void
    89 procargs(int argc, char **argv)
     90procargs(shinstance *psh, int argc, char **argv)
    9091{
    9192        int i;
    9293
    93         argptr = argv;
     94        psh->argptr = argv;
    9495        if (argc > 0)
    95                 argptr++;
     96                psh->argptr++;
    9697        for (i = 0; i < NOPTS; i++)
    97                 optlist[i].val = 2;
    98         options(1);
    99         if (*argptr == NULL && minusc == NULL)
    100                 sflag = 1;
    101         if (iflag == 2 && sflag == 1 && isatty(0) && isatty(1))
    102                 iflag = 1;
    103         if (mflag == 2)
    104                 mflag = iflag;
     98                psh->optlist[i].val = 2;
     99        options(psh, 1);
     100        if (*psh->argptr == NULL && psh->minusc == NULL)
     101                sflag(psh) = 1;
     102        if (iflag(psh) == 2 && sflag(psh) == 1 && shfile_isatty(&psh->fdtab, 0) && shfile_isatty(&psh->fdtab, 1))
     103                iflag(psh) = 1;
     104        if (mflag(psh) == 2)
     105                mflag(psh) = iflag(psh);
    105106        for (i = 0; i < NOPTS; i++)
    106                 if (optlist[i].val == 2)
    107                         optlist[i].val = 0;
     107                if (psh->optlist[i].val == 2)
     108                        psh->optlist[i].val = 0;
    108109#if DEBUG == 2
    109         debug = 1;
    110 #endif
    111         arg0 = argv[0];
    112         if (sflag == 0 && minusc == NULL) {
    113                 commandname = argv[0];
    114                 arg0 = *argptr++;
    115                 setinputfile(arg0, 0);
    116                 commandname = arg0;
     110        debug(psh) = 1;
     111#endif
     112        psh->arg0 = argv[0];
     113        if (sflag(psh) == 0 && psh->minusc == NULL) {
     114                psh->commandname = argv[0];
     115                psh->arg0 = *psh->argptr++;
     116                setinputfile(psh, psh->arg0, 0);
     117                psh->commandname = psh->arg0;
    117118        }
    118119        /* POSIX 1003.2: first arg after -c cmd is $0, remainder $1... */
    119         if (minusc != NULL) {
    120                 if (argptr == NULL || *argptr == NULL)
    121                         error("Bad -c option");
    122                 minusc = *argptr++;
    123                 if (*argptr != 0)
    124                         arg0 = *argptr++;
    125         }
    126 
    127         shellparam.p = argptr;
    128         shellparam.reset = 1;
     120        if (psh->minusc != NULL) {
     121                if (psh->argptr == NULL || *psh->argptr == NULL)
     122                        error(psh, "Bad -c option");
     123                psh->minusc = *psh->argptr++;
     124                if (*psh->argptr != 0)
     125                        psh->arg0 = *psh->argptr++;
     126        }
     127
     128        psh->shellparam.p = psh->argptr;
     129        psh->shellparam.reset = 1;
    129130        /* assert(shellparam.malloc == 0 && shellparam.nparam == 0); */
    130         while (*argptr) {
    131                 shellparam.nparam++;
    132                 argptr++;
    133         }
    134         optschanged();
     131        while (*psh->argptr) {
     132                psh->shellparam.nparam++;
     133                psh->argptr++;
     134        }
     135        optschanged(psh);
    135136}
    136137
    137138
    138139void
    139 optschanged(void)
    140 {
    141         setinteractive(iflag);
     140optschanged(shinstance *psh)
     141{
     142        setinteractive(psh, iflag(psh));
    142143#ifndef SMALL
    143         histedit();
    144 #endif
    145         setjobctl(mflag);
     144        histedit(psh);
     145#endif
     146        setjobctl(psh, mflag(psh));
    146147}
    147148
     
    152153
    153154STATIC void
    154 options(int cmdline)
     155options(shinstance *psh, int cmdline)
    155156{
    156157        static char empty[] = "";
     
    160161
    161162        if (cmdline)
    162                 minusc = NULL;
    163         while ((p = *argptr) != NULL) {
    164                 argptr++;
     163                psh->minusc = NULL;
     164        while ((p = *psh->argptr) != NULL) {
     165                psh->argptr++;
    165166                if ((c = *p++) == '-') {
    166167                        val = 1;
     
    169170                                        /* "-" means turn off -x and -v */
    170171                                        if (p[0] == '\0')
    171                                                 xflag = vflag = 0;
     172                                                xflag(psh) = vflag(psh) = 0;
    172173                                        /* "--" means reset params */
    173                                         else if (*argptr == NULL)
    174                                                 setparam(argptr);
     174                                        else if (*psh->argptr == NULL)
     175                                                setparam(psh, psh->argptr);
    175176                                }
    176177                                break;    /* "-" or  "--" terminates options */
     
    179180                        val = 0;
    180181                } else {
    181                         argptr--;
     182                        psh->argptr--;
    182183                        break;
    183184                }
     
    185186                        if (c == 'c' && cmdline) {
    186187                                /* command is after shell args*/
    187                                 minusc = empty;
     188                                psh->minusc = empty;
    188189                        } else if (c == 'o') {
    189                                 minus_o(*argptr, val);
    190                                 if (*argptr)
    191                                         argptr++;
     190                                minus_o(psh, *psh->argptr, val);
     191                                if (*psh->argptr)
     192                                        psh->argptr++;
    192193                        } else {
    193                                 setoption(c, val);
     194                                setoption(psh, c, val);
    194195                        }
    195196                }
     
    198199
    199200static void
    200 set_opt_val(int i, int val)
     201set_opt_val(shinstance *psh, int i, int val)
    201202{
    202203        int j;
    203204        int flag;
    204205
    205         if (val && (flag = optlist[i].opt_set)) {
     206        if (val && (flag = psh->optlist[i].opt_set)) {
    206207                /* some options (eg vi/emacs) are mutually exclusive */
    207208                for (j = 0; j < NOPTS; j++)
    208                     if (optlist[j].opt_set == flag)
    209                         optlist[j].val = 0;
    210         }
    211         optlist[i].val = val;
     209                    if (psh->optlist[j].opt_set == flag)
     210                        psh->optlist[j].val = 0;
     211        }
     212        psh->optlist[i].val = val;
    212213#ifdef DEBUG
    213         if (&optlist[i].val == &debug)
     214        if (&psh->optlist[i].val == &debug(psh))
    214215                opentrace();
    215216#endif
     
    217218
    218219STATIC void
    219 minus_o(char *name, int val)
     220minus_o(shinstance *psh, char *name, int val)
    220221{
    221222        int i;
    222223
    223224        if (name == NULL) {
    224                 out1str("Current option settings\n");
     225                out1str(psh, "Current option settings\n");
    225226                for (i = 0; i < NOPTS; i++)
    226                         out1fmt("%-16s%s\n", optlist[i].name,
    227                                 optlist[i].val ? "on" : "off");
     227                        out1fmt(psh, "%-16s%s\n", psh->optlist[i].name,
     228                                psh->optlist[i].val ? "on" : "off");
    228229        } else {
    229230                for (i = 0; i < NOPTS; i++)
    230                         if (equal(name, optlist[i].name)) {
    231                                 set_opt_val(i, val);
     231                        if (equal(name, psh->optlist[i].name)) {
     232                                set_opt_val(psh, i, val);
    232233                                return;
    233234                        }
    234                 error("Illegal option -o %s", name);
     235                error(psh, "Illegal option -o %s", name);
    235236        }
    236237}
     
    238239
    239240STATIC void
    240 setoption(int flag, int val)
     241setoption(shinstance *psh, int flag, int val)
    241242{
    242243        int i;
    243244
    244245        for (i = 0; i < NOPTS; i++)
    245                 if (optlist[i].letter == flag) {
    246                         set_opt_val( i, val );
     246                if (psh->optlist[i].letter == flag) {
     247                        set_opt_val(psh, i, val );
    247248                        return;
    248249                }
    249         error("Illegal option -%c", flag);
     250        error(psh, "Illegal option -%c", flag);
    250251        /* NOTREACHED */
    251252}
     
    259260        int i;
    260261
    261         for (i = 0; optlist[i].name; i++)
    262                 optlist[i].val = 0;
    263         optschanged();
     262        for (i = 0; psh->optlist[i].name; i++)
     263                psh->optlist[i].val = 0;
     264        optschanged(psh);
    264265
    265266}
     
    272273
    273274void
    274 setparam(char **argv)
     275setparam(shinstance *psh, char **argv)
    275276{
    276277        char **newparam;
     
    285286        }
    286287        *ap = NULL;
    287         freeparam(&shellparam);
    288         shellparam.malloc = 1;
    289         shellparam.nparam = nparam;
    290         shellparam.p = newparam;
    291         shellparam.optnext = NULL;
     288        freeparam(&psh->shellparam);
     289        psh->shellparam.malloc = 1;
     290        psh->shellparam.nparam = nparam;
     291        psh->shellparam.p = newparam;
     292        psh->shellparam.optnext = NULL;
    292293}
    293294
     
    316317
    317318int
    318 shiftcmd(int argc, char **argv)
     319shiftcmd(shinstance *psh, int argc, char **argv)
    319320{
    320321        int n;
     
    323324        n = 1;
    324325        if (argc > 1)
    325                 n = number(argv[1]);
    326         if (n > shellparam.nparam)
    327                 error("can't shift that many");
     326                n = number(psh, argv[1]);
     327        if (n > psh->shellparam.nparam)
     328                error(psh, "can't shift that many");
    328329        INTOFF;
    329         shellparam.nparam -= n;
    330         for (ap1 = shellparam.p ; --n >= 0 ; ap1++) {
    331                 if (shellparam.malloc)
     330        psh->shellparam.nparam -= n;
     331        for (ap1 = psh->shellparam.p ; --n >= 0 ; ap1++) {
     332                if (psh->shellparam.malloc)
    332333                        ckfree(*ap1);
    333334        }
    334         ap2 = shellparam.p;
     335        ap2 = psh->shellparam.p;
    335336        while ((*ap2++ = *ap1++) != NULL);
    336         shellparam.optnext = NULL;
     337        psh->shellparam.optnext = NULL;
    337338        INTON;
    338339        return 0;
     
    346347
    347348int
    348 setcmd(int argc, char **argv)
     349setcmd(shinstance *psh, int argc, char **argv)
    349350{
    350351        if (argc == 1)
    351                 return showvars(0, 0, 1);
     352                return showvars(psh, 0, 0, 1);
    352353        INTOFF;
    353         options(0);
    354         optschanged();
    355         if (*argptr != NULL) {
    356                 setparam(argptr);
     354        options(psh, 0);
     355        optschanged(psh);
     356        if (*psh->argptr != NULL) {
     357                setparam(psh, psh->argptr);
    357358        }
    358359        INTON;
     
    362363
    363364void
    364 getoptsreset(value)
    365         const char *value;
    366 {
    367         if (number(value) == 1) {
    368                 shellparam.optnext = NULL;
    369                 shellparam.reset = 1;
     365getoptsreset(shinstance *psh, const char *value)
     366{
     367        if (number(psh, value) == 1) {
     368                psh->shellparam.optnext = NULL;
     369                psh->shellparam.reset = 1;
    370370        }
    371371}
     
    379379
    380380int
    381 getoptscmd(int argc, char **argv)
     381getoptscmd(shinstance *psh, int argc, char **argv)
    382382{
    383383        char **optbase;
    384384
    385385        if (argc < 3)
    386                 error("usage: getopts optstring var [arg]");
     386                error(psh, "usage: getopts optstring var [arg]");
    387387        else if (argc == 3)
    388                 optbase = shellparam.p;
     388                optbase = psh->shellparam.p;
    389389        else
    390390                optbase = &argv[3];
    391391
    392         if (shellparam.reset == 1) {
    393                 shellparam.optnext = optbase;
    394                 shellparam.optptr = NULL;
    395                 shellparam.reset = 0;
    396         }
    397 
    398         return getopts(argv[1], argv[2], optbase, &shellparam.optnext,
    399                        &shellparam.optptr);
     392        if (psh->shellparam.reset == 1) {
     393                psh->shellparam.optnext = optbase;
     394                psh->shellparam.optptr = NULL;
     395                psh->shellparam.reset = 0;
     396        }
     397
     398        return getopts(psh, argv[1], argv[2], optbase, &psh->shellparam.optnext,
     399                       &psh->shellparam.optptr);
    400400}
    401401
    402402STATIC int
    403 getopts(char *optstr, char *optvar, char **optfirst, char ***optnext, char **optpptr)
     403getopts(shinstance *psh, char *optstr, char *optvar, char **optfirst, char ***optnext, char **optpptr)
    404404{
    405405        char *p, *q;
     
    417417                if (p == NULL || *p != '-' || *++p == '\0') {
    418418atend:
    419                         ind = *optnext - optfirst + 1;
     419                        ind = (int)(*optnext - optfirst + 1);
    420420                        *optnext = NULL;
    421421                        p = NULL;
     
    434434                                s[0] = c;
    435435                                s[1] = '\0';
    436                                 err |= setvarsafe("OPTARG", s, 0);
     436                                err |= setvarsafe(psh, "OPTARG", s, 0);
    437437                        } else {
    438                                 outfmt(&errout, "Illegal option -%c\n", c);
    439                                 (void) unsetvar("OPTARG", 0);
     438                                outfmt(&psh->errout, "Illegal option -%c\n", c);
     439                                (void) unsetvar(psh, "OPTARG", 0);
    440440                        }
    441441                        c = '?';
     
    451451                                s[0] = c;
    452452                                s[1] = '\0';
    453                                 err |= setvarsafe("OPTARG", s, 0);
     453                                err |= setvarsafe(psh, "OPTARG", s, 0);
    454454                                c = ':';
    455455                        } else {
    456                                 outfmt(&errout, "No arg for -%c option\n", c);
    457                                 (void) unsetvar("OPTARG", 0);
     456                                outfmt(&psh->errout, "No arg for -%c option\n", c);
     457                                (void) unsetvar(psh, "OPTARG", 0);
    458458                                c = '?';
    459459                        }
     
    463463                if (p == **optnext)
    464464                        (*optnext)++;
    465                 err |= setvarsafe("OPTARG", p, 0);
     465                err |= setvarsafe(psh, "OPTARG", p, 0);
    466466                p = NULL;
    467467        } else
    468                 err |= setvarsafe("OPTARG", "", 0);
    469         ind = *optnext - optfirst + 1;
     468                err |= setvarsafe(psh, "OPTARG", "", 0);
     469        ind = (int)(*optnext - optfirst + 1);
    470470        goto out;
    471471
     
    477477        *optpptr = p;
    478478        fmtstr(s, sizeof(s), "%d", ind);
    479         err |= setvarsafe("OPTIND", s, VNOFUNC);
     479        err |= setvarsafe(psh, "OPTIND", s, VNOFUNC);
    480480        s[0] = c;
    481481        s[1] = '\0';
    482         err |= setvarsafe(optvar, s, 0);
     482        err |= setvarsafe(psh, optvar, s, 0);
    483483        if (err) {
    484484                *optnext = NULL;
    485485                *optpptr = NULL;
    486                 output_flushall();
    487                 exraise(EXERROR);
     486                output_flushall(psh);
     487                exraise(psh, EXERROR);
    488488        }
    489489        return done;
     
    502502
    503503int
    504 nextopt(const char *optstring)
     504nextopt(shinstance *psh, const char *optstring)
    505505{
    506506        char *p;
     
    508508        char c;
    509509
    510         if ((p = optptr) == NULL || *p == '\0') {
    511                 p = *argptr;
     510        if ((p = psh->optptr) == NULL || *p == '\0') {
     511                p = *psh->argptr;
    512512                if (p == NULL || *p != '-' || *++p == '\0')
    513513                        return '\0';
    514                 argptr++;
     514                psh->argptr++;
    515515                if (p[0] == '-' && p[1] == '\0')        /* check for "--" */
    516516                        return '\0';
     
    519519        for (q = optstring ; *q != c ; ) {
    520520                if (*q == '\0')
    521                         error("Illegal option -%c", c);
     521                        error(psh, "Illegal option -%c", c);
    522522                if (*++q == ':')
    523523                        q++;
    524524        }
    525525        if (*++q == ':') {
    526                 if (*p == '\0' && (p = *argptr++) == NULL)
    527                         error("No arg for -%c option", c);
    528                 optionarg = p;
     526                if (*p == '\0' && (p = *psh->argptr++) == NULL)
     527                        error(psh, "No arg for -%c option", c);
     528                psh->optionarg = p;
    529529                p = NULL;
    530530        }
    531         optptr = p;
     531        psh->optptr = p;
    532532        return c;
    533533}
  • trunk/src/kash/options.h

    r884 r1198  
    3535 */
    3636
     37#ifndef ___options_h
     38#define ___options_h
     39
    3740struct shparam {
    3841        int nparam;             /* # of positional parameters (without $0) */
     
    5861#else
    5962# define NOPTS 20
    60 #endif 
     63#endif
    6164
    6265#ifdef DEFINE_OPTIONS
     
    6972
    7073DEF_OPT( "errexit",     'e' )   /* exit on error */
    71 #define eflag optlist[0].val
     74#define eflag(psh) (psh)->optlist[0].val
    7275DEF_OPT( "noglob",      'f' )   /* no pathname expansion */
    73 #define fflag optlist[1].val
     76#define fflag(psh) (psh)->optlist[1].val
    7477DEF_OPT( "ignoreeof",   'I' )   /* do not exit on EOF */
    75 #define Iflag optlist[2].val
     78#define Iflag(psh) (psh)->optlist[2].val
    7679DEF_OPT( "interactive",'i' )    /* interactive shell */
    77 #define iflag optlist[3].val
     80#define iflag(psh) (psh)->optlist[3].val
    7881DEF_OPT( "monitor",     'm' )   /* job control */
    79 #define mflag optlist[4].val
     82#define mflag(psh) (psh)->optlist[4].val
    8083DEF_OPT( "noexec",      'n' )   /* [U] do not exec commands */
    81 #define nflag optlist[5].val
     84#define nflag(psh) (psh)->optlist[5].val
    8285DEF_OPT( "stdin",       's' )   /* read from stdin */
    83 #define sflag optlist[6].val
     86#define sflag(psh) (psh)->optlist[6].val
    8487DEF_OPT( "xtrace",      'x' )   /* trace after expansion */
    85 #define xflag optlist[7].val
     88#define xflag(psh) (psh)->optlist[7].val
    8689DEF_OPT( "verbose",     'v' )   /* trace read input */
    87 #define vflag optlist[8].val
     90#define vflag(psh) (psh)->optlist[8].val
    8891DEF_OPTS( "vi",         'V', 'V' )      /* vi style editing */
    89 #define Vflag optlist[9].val
     92#define Vflag(psh) (psh)->optlist[9].val
    9093DEF_OPTS( "emacs",      'E', 'V' )      /* emacs style editing */
    91 #define Eflag optlist[10].val
     94#define Eflag(psh) (psh)->optlist[10].val
    9295DEF_OPT( "noclobber",   'C' )   /* do not overwrite files with > */
    93 #define Cflag optlist[11].val
     96#define Cflag(psh) (psh)->optlist[11].val
    9497DEF_OPT( "allexport",   'a' )   /* export all variables */
    95 #define aflag optlist[12].val
     98#define aflag(psh) (psh)->optlist[12].val
    9699DEF_OPT( "notify",      'b' )   /* [U] report completion of background jobs */
    97 #define bflag optlist[13].val
     100#define bflag(psh) (psh)->optlist[13].val
    98101DEF_OPT( "nounset",     'u' )   /* error expansion of unset variables */
    99 #define uflag optlist[14].val
     102#define uflag(psh) (psh)->optlist[14].val
    100103DEF_OPT( "quietprofile", 'q' )
    101 #define qflag optlist[15].val
     104#define qflag(psh) (psh)->optlist[15].val
    102105DEF_OPT( "nolog",       0 )     /* [U] no functon defs in command history */
    103 #define nolog optlist[16].val
     106#define nolog(psh) (psh)->optlist[16].val
    104107DEF_OPT( "cdprint",     0 )     /* always print result of cd */
    105 #define cdprint optlist[17].val
     108#define cdprint(psh) (psh)->optlist[17].val
    106109DEF_OPT( "tabcomplete", 0 )     /* <tab> causes filename expansion */
    107 #define tabcomplete optlist[18].val
     110#define tabcomplete(psh) (psh)->optlist[18].val
    108111#ifdef DEBUG
    109112DEF_OPT( "debug",       0 )     /* enable debug prints */
    110 #define debug optlist[19].val
     113#define debug(psh) (psh)->optlist[19].val
    111114#endif
    112115
     
    136139int nextopt(struct shinstance *, const char *);
    137140void getoptsreset(struct shinstance *, const char *);
     141
     142#endif
  • trunk/src/kash/output.c

    r883 r1198  
    190190        if (dest->buf == NULL || dest->nextc == dest->buf || dest->fd < 0)
    191191                return;
    192         if (xwrite(dest->fd, dest->buf, dest->nextc - dest->buf) < 0)
     192        if (xwrite(psh, dest->fd, dest->buf, dest->nextc - dest->buf) < 0)
    193193                dest->flags |= OUTPUT_ERR;
    194194        dest->nextc = dest->buf;
     
    480480
    481481int
    482 xwrite(int fd, char *buf, int nbytes)
     482xwrite(shinstance *psh, int fd, char *buf, int nbytes)
    483483{
    484484        int ntry;
     
    489489        ntry = 0;
    490490        for (;;) {
    491                 i = write(fd, buf, n);
     491                i = shfile_write(&psh->fdtab, fd, buf, n);
    492492                if (i > 0) {
    493493                        if ((n -= i) <= 0)
     
    511511
    512512int
    513 xioctl(int fd, unsigned long request, char *arg)
     513xioctl(shinstance *psh, int fd, unsigned long request, char *arg)
    514514{
    515515        int i;
    516516
    517         while ((i = ioctl(fd, request, arg)) == -1 && errno == EINTR);
     517        while ((i = shfile_ioctl(&psh->fdtab, fd, request, arg)) == -1 && errno == EINTR);
    518518        return i;
    519519}
  • trunk/src/kash/output.h

    r883 r1198  
    7272    __attribute__((__format__(__printf__,3,4)));
    7373void doformat(struct output *, const char *, va_list);
    74 int xwrite(int, char *, int);
    75 int xioctl(int, unsigned long, char *);
     74int xwrite(struct shinstance *, int, char *, int);
     75int xioctl(struct shinstance *, int, unsigned long, char *);
    7676
    7777#define outc(c, file)   (--(file)->nleft < 0? (emptyoutbuf(file), *(file)->nextc++ = (c)) : (*(file)->nextc++ = (c)))
  • trunk/src/kash/parser.c

    r809 r1198  
    171171                                n2->type = NBACKGND;
    172172                        } else {
    173                                 n3 = (union node *)stalloc(sizeof (struct nredir));
     173                                n3 = (union node *)stalloc(psh, sizeof (struct nredir));
    174174                                n3->type = NBACKGND;
    175175                                n3->nredir.n = n2;
     
    182182                }
    183183                else {
    184                         n3 = (union node *)stalloc(sizeof (struct nbinary));
     184                        n3 = (union node *)stalloc(psh, sizeof (struct nbinary));
    185185                        n3->type = NSEMI;
    186186                        n3->nbinary.ch1 = n1;
     
    239239                }
    240240                n2 = pipeline();
    241                 n3 = (union node *)stalloc(sizeof (struct nbinary));
     241                n3 = (union node *)stalloc(psh, sizeof (struct nbinary));
    242242                n3->type = t;
    243243                n3->nbinary.ch1 = n1;
     
    263263        n1 = command();
    264264        if (readtoken() == TPIPE) {
    265                 pipenode = (union node *)stalloc(sizeof (struct npipe));
     265                pipenode = (union node *)stalloc(psh, sizeof (struct npipe));
    266266                pipenode->type = NPIPE;
    267267                pipenode->npipe.backgnd = 0;
    268                 lp = (struct nodelist *)stalloc(sizeof (struct nodelist));
     268                lp = (struct nodelist *)stalloc(psh, sizeof (struct nodelist));
    269269                pipenode->npipe.cmdlist = lp;
    270270                lp->n = n1;
    271271                do {
    272272                        prev = lp;
    273                         lp = (struct nodelist *)stalloc(sizeof (struct nodelist));
     273                        lp = (struct nodelist *)stalloc(psh, sizeof (struct nodelist));
    274274                        lp->n = command();
    275275                        prev->next = lp;
     
    280280        tokpushback++;
    281281        if (negate) {
    282                 n2 = (union node *)stalloc(sizeof (struct nnot));
     282                n2 = (union node *)stalloc(psh, sizeof (struct nnot));
    283283                n2->type = NNOT;
    284284                n2->nnot.com = n1;
     
    320320        switch (readtoken()) {
    321321        case TIF:
    322                 n1 = (union node *)stalloc(sizeof (struct nif));
     322                n1 = (union node *)stalloc(psh, sizeof (struct nif));
    323323                n1->type = NIF;
    324324                n1->nif.test = list(0);
     
    328328                n2 = n1;
    329329                while (readtoken() == TELIF) {
    330                         n2->nif.elsepart = (union node *)stalloc(sizeof (struct nif));
     330                        n2->nif.elsepart = (union node *)stalloc(psh, sizeof (struct nif));
    331331                        n2 = n2->nif.elsepart;
    332332                        n2->type = NIF;
     
    349349        case TUNTIL: {
    350350                int got;
    351                 n1 = (union node *)stalloc(sizeof (struct nbinary));
     351                n1 = (union node *)stalloc(psh, sizeof (struct nbinary));
    352352                n1->type = (lasttoken == TWHILE)? NWHILE : NUNTIL;
    353353                n1->nbinary.ch1 = list(0);
     
    365365                if (readtoken() != TWORD || quoteflag || ! goodname(wordtext))
    366366                        synerror("Bad for loop variable");
    367                 n1 = (union node *)stalloc(sizeof (struct nfor));
     367                n1 = (union node *)stalloc(psh, sizeof (struct nfor));
    368368                n1->type = NFOR;
    369369                n1->nfor.var = wordtext;
     
    371371                        app = &ap;
    372372                        while (readtoken() == TWORD) {
    373                                 n2 = (union node *)stalloc(sizeof (struct narg));
     373                                n2 = (union node *)stalloc(psh, sizeof (struct narg));
    374374                                n2->type = NARG;
    375375                                n2->narg.text = wordtext;
     
    385385                        static char argvars[5] = {CTLVAR, VSNORMAL|VSQUOTE,
    386386                                                                   '@', '=', '\0'};
    387                         n2 = (union node *)stalloc(sizeof (struct narg));
     387                        n2 = (union node *)stalloc(psh, sizeof (struct narg));
    388388                        n2->type = NARG;
    389389                        n2->narg.text = argvars;
     
    411411                break;
    412412        case TCASE:
    413                 n1 = (union node *)stalloc(sizeof (struct ncase));
     413                n1 = (union node *)stalloc(psh, sizeof (struct ncase));
    414414                n1->type = NCASE;
    415415                if (readtoken() != TWORD)
    416416                        synexpect(TWORD);
    417                 n1->ncase.expr = n2 = (union node *)stalloc(sizeof (struct narg));
     417                n1->ncase.expr = n2 = (union node *)stalloc(psh, sizeof (struct narg));
    418418                n2->type = NARG;
    419419                n2->narg.text = wordtext;
     
    427427                checkkwd = 2, readtoken();
    428428                do {
    429                         *cpp = cp = (union node *)stalloc(sizeof (struct nclist));
     429                        *cpp = cp = (union node *)stalloc(psh, sizeof (struct nclist));
    430430                        cp->type = NCLIST;
    431431                        app = &cp->nclist.pattern;
    432432                        for (;;) {
    433                                 *app = ap = (union node *)stalloc(sizeof (struct narg));
     433                                *app = ap = (union node *)stalloc(psh, sizeof (struct narg));
    434434                                ap->type = NARG;
    435435                                ap->narg.text = wordtext;
     
    465465                break;
    466466        case TLP:
    467                 n1 = (union node *)stalloc(sizeof (struct nredir));
     467                n1 = (union node *)stalloc(psh, sizeof (struct nredir));
    468468                n1->type = NSUBSHELL;
    469469                n1->nredir.n = list(0);
     
    511511        if (redir) {
    512512                if (n1->type != NSUBSHELL) {
    513                         n2 = (union node *)stalloc(sizeof (struct nredir));
     513                        n2 = (union node *)stalloc(psh, sizeof (struct nredir));
    514514                        n2->type = NREDIR;
    515515                        n2->nredir.n = n1;
     
    521521checkneg:
    522522        if (negate) {
    523                 n2 = (union node *)stalloc(sizeof (struct nnot));
     523                n2 = (union node *)stalloc(psh, sizeof (struct nnot));
    524524                n2->type = NNOT;
    525525                n2->nnot.com = n1;
     
    561561        for (;;) {
    562562                if (readtoken() == TWORD) {
    563                         n = (union node *)stalloc(sizeof (struct narg));
     563                        n = (union node *)stalloc(psh, sizeof (struct narg));
    564564                        n->type = NARG;
    565565                        n->narg.text = wordtext;
     
    590590        *app = NULL;
    591591        *rpp = NULL;
    592         n = (union node *)stalloc(sizeof (struct ncmd));
     592        n = (union node *)stalloc(psh, sizeof (struct ncmd));
    593593        n->type = NCMD;
    594594        n->ncmd.backgnd = 0;
     
    598598checkneg:
    599599        if (negate) {
    600                 n2 = (union node *)stalloc(sizeof (struct nnot));
     600                n2 = (union node *)stalloc(psh, sizeof (struct nnot));
    601601                n2->type = NNOT;
    602602                n2->nnot.com = n;
     
    612612        union node *n;
    613613
    614         n = (union node *)stalloc(sizeof (struct narg));
     614        n = (union node *)stalloc(psh, sizeof (struct narg));
    615615        n->type = NARG;
    616616        n->narg.next = NULL;
     
    697697                readtoken1(pgetc(), here->here->type == NHERE? SQSYNTAX : DQSYNTAX,
    698698                                here->eofmark, here->striptabs);
    699                 n = (union node *)stalloc(sizeof (struct narg));
     699                n = (union node *)stalloc(psh, sizeof (struct narg));
    700700                n->narg.type = NARG;
    701701                n->narg.next = NULL;
     
    953953        parenlevel = 0;
    954954
    955         STARTSTACKSTR(out);
     955        STARTSTACKSTR(psh, out);
    956956        loop: { /* for each line, until end of word */
    957957#if ATTY
     
    967967                CHECKEND();     /* set c to PEOF if at end of here document */
    968968                for (;;) {      /* until end of line or end of word */
    969                         CHECKSTRSPACE(4, out);  /* permit 4 calls to USTPUTC */
     969                        CHECKSTRSPACE(psh, 4, out);     /* permit 4 calls to USTPUTC */
    970970                        switch(syntax[c]) {
    971971                        case CNL:       /* '\n' */
    972972                                if (syntax == BASESYNTAX)
    973973                                        goto endword;   /* exit outer loop */
    974                                 USTPUTC(c, out);
     974                                USTPUTC(psh, c, out);
    975975                                plinno++;
    976976                                if (doprompt)
     
    981981                                goto loop;              /* continue outer loop */
    982982                        case CWORD:
    983                                 USTPUTC(c, out);
     983                                USTPUTC(psh, c, out);
    984984                                break;
    985985                        case CCTL:
    986986                                if (eofmark == NULL || ISDBLQUOTE())
    987                                         USTPUTC(CTLESC, out);
    988                                 USTPUTC(c, out);
     987                                        USTPUTC(psh, CTLESC, out);
     988                                USTPUTC(psh, c, out);
    989989                                break;
    990990                        case CBACK:     /* backslash */
    991991                                c = pgetc();
    992992                                if (c == PEOF) {
    993                                         USTPUTC('\\', out);
     993                                        USTPUTC(psh, '\\', out);
    994994                                        pungetc();
    995995                                        break;
     
    10061006                                    c != '`' && c != '$' &&
    10071007                                    (c != '"' || eofmark != NULL))
    1008                                         USTPUTC('\\', out);
     1008                                        USTPUTC(psh, '\\', out);
    10091009                                if (SQSYNTAX[c] == CCTL)
    1010                                         USTPUTC(CTLESC, out);
     1010                                        USTPUTC(psh, CTLESC, out);
    10111011                                else if (eofmark == NULL) {
    1012                                         USTPUTC(CTLQUOTEMARK, out);
    1013                                         USTPUTC(c, out);
     1012                                        USTPUTC(psh, CTLQUOTEMARK, out);
     1013                                        USTPUTC(psh, c, out);
    10141014                                        if (varnest != 0)
    1015                                                 USTPUTC(CTLQUOTEEND, out);
     1015                                                USTPUTC(psh, CTLQUOTEEND, out);
    10161016                                        break;
    10171017                                }
    1018                                 USTPUTC(c, out);
     1018                                USTPUTC(psh, c, out);
    10191019                                break;
    10201020                        case CSQUOTE:
    10211021                                if (syntax != SQSYNTAX) {
    10221022                                        if (eofmark == NULL)
    1023                                                 USTPUTC(CTLQUOTEMARK, out);
     1023                                                USTPUTC(psh, CTLQUOTEMARK, out);
    10241024                                        quotef = 1;
    10251025                                        syntax = SQSYNTAX;
     
    10291029                                    varnest == 0) {
    10301030                                        /* Ignore inside quoted here document */
    1031                                         USTPUTC(c, out);
     1031                                        USTPUTC(psh, c, out);
    10321032                                        break;
    10331033                                }
     
    10381038                                        syntax = BASESYNTAX;
    10391039                                        if (varnest != 0)
    1040                                                 USTPUTC(CTLQUOTEEND, out);
     1040                                                USTPUTC(psh, CTLQUOTEEND, out);
    10411041                                }
    10421042                                break;
     
    10451045                                    varnest == 0) {
    10461046                                        /* Ignore inside here document */
    1047                                         USTPUTC(c, out);
     1047                                        USTPUTC(psh, c, out);
    10481048                                        break;
    10491049                                }
     
    10561056                                                syntax = DQSYNTAX;
    10571057                                                SETDBLQUOTE();
    1058                                                 USTPUTC(CTLQUOTEMARK, out);
     1058                                                USTPUTC(psh, CTLQUOTEMARK, out);
    10591059                                        }
    10601060                                        break;
     
    10641064                                if (ISDBLQUOTE()) {
    10651065                                        if (varnest != 0)
    1066                                                 USTPUTC(CTLQUOTEEND, out);
     1066                                                USTPUTC(psh, CTLQUOTEEND, out);
    10671067                                        syntax = BASESYNTAX;
    10681068                                        CLRDBLQUOTE();
     
    10701070                                        syntax = DQSYNTAX;
    10711071                                        SETDBLQUOTE();
    1072                                         USTPUTC(CTLQUOTEMARK, out);
     1072                                        USTPUTC(psh, CTLQUOTEMARK, out);
    10731073                                }
    10741074                                break;
     
    10791079                                if (varnest > 0 && !ISDBLQUOTE()) {
    10801080                                        varnest--;
    1081                                         USTPUTC(CTLENDVAR, out);
     1081                                        USTPUTC(psh, CTLENDVAR, out);
    10821082                                } else {
    1083                                         USTPUTC(c, out);
     1083                                        USTPUTC(psh, c, out);
    10841084                                }
    10851085                                break;
    10861086                        case CLP:       /* '(' in arithmetic */
    10871087                                parenlevel++;
    1088                                 USTPUTC(c, out);
     1088                                USTPUTC(psh, c, out);
    10891089                                break;
    10901090                        case CRP:       /* ')' in arithmetic */
    10911091                                if (parenlevel > 0) {
    1092                                         USTPUTC(c, out);
     1092                                        USTPUTC(psh, c, out);
    10931093                                        --parenlevel;
    10941094                                } else {
    10951095                                        if (pgetc() == ')') {
    10961096                                                if (--arinest == 0) {
    1097                                                         USTPUTC(CTLENDARI, out);
     1097                                                        USTPUTC(psh, CTLENDARI, out);
    10981098                                                        syntax = prevsyntax;
    10991099                                                        if (syntax == DQSYNTAX)
     
    11021102                                                                CLRDBLQUOTE();
    11031103                                                } else
    1104                                                         USTPUTC(')', out);
     1104                                                        USTPUTC(psh, ')', out);
    11051105                                        } else {
    11061106                                                /*
     
    11091109                                                 */
    11101110                                                pungetc();
    1111                                                 USTPUTC(')', out);
     1111                                                USTPUTC(psh, ')', out);
    11121112                                        }
    11131113                                }
     
    11211121                                if (varnest == 0)
    11221122                                        goto endword;   /* exit outer loop */
    1123                                 USTPUTC(c, out);
     1123                                USTPUTC(psh, c, out);
    11241124                        }
    11251125                        c = pgetc_macro();
     
    11361136                synerror("Missing '}'");
    11371137        }
    1138         USTPUTC('\0', out);
    1139         len = out - stackblock();
    1140         out = stackblock();
     1138        USTPUTC(psh, '\0', out);
     1139        len = out - stackblock(psh);
     1140        out = stackblock(psh);
    11411141        if (eofmark == NULL) {
    11421142                if ((c == '>' || c == '<')
     
    11521152        quoteflag = quotef;
    11531153        backquotelist = bqlist;
    1154         grabstackblock(len);
     1154        grabstackblock(psh, len);
    11551155        wordtext = out;
    11561156        if (dblquotep != NULL)
     
    12031203        union node *np;
    12041204
    1205         np = (union node *)stalloc(sizeof (struct nfile));
     1205        np = (union node *)stalloc(psh, sizeof (struct nfile));
    12061206        if (c == '>') {
    12071207                np->nfile.fd = 1;
     
    12221222                case '<':
    12231223                        if (sizeof (struct nfile) != sizeof (struct nhere)) {
    1224                                 np = (union node *)stalloc(sizeof (struct nhere));
     1224                                np = (union node *)stalloc(psh, sizeof (struct nhere));
    12251225                                np->nfile.fd = 0;
    12261226                        }
    12271227                        np->type = NHERE;
    1228                         heredoc = (struct heredoc *)stalloc(sizeof (struct heredoc));
     1228                        heredoc = (struct heredoc *)stalloc(psh, sizeof (struct heredoc));
    12291229                        heredoc->here = np;
    12301230                        if ((c = pgetc()) == '-') {
     
    12711271        c = pgetc();
    12721272        if (c != '(' && c != OPENBRACE && !is_name(c) && !is_special(c)) {
    1273                 USTPUTC('$', out);
     1273                USTPUTC(psh, '$', out);
    12741274                pungetc();
    12751275        } else if (c == '(') {  /* $(command) or $((arith)) */
     
    12811281                }
    12821282        } else {
    1283                 USTPUTC(CTLVAR, out);
    1284                 typeloc = out - stackblock();
    1285                 USTPUTC(VSNORMAL, out);
     1283                USTPUTC(psh, CTLVAR, out);
     1284                typeloc = out - stackblock(psh);
     1285                USTPUTC(psh, VSNORMAL, out);
    12861286                subtype = VSNORMAL;
    12871287                if (c == OPENBRACE) {
     
    12981298                if (is_name(c)) {
    12991299                        do {
    1300                                 STPUTC(c, out);
     1300                                STPUTC(psh, c, out);
    13011301                                c = pgetc();
    13021302                        } while (is_in_name(c));
    13031303                } else if (is_digit(c)) {
    13041304                        do {
    1305                                 USTPUTC(c, out);
     1305                                USTPUTC(psh, c, out);
    13061306                                c = pgetc();
    13071307                        } while (is_digit(c));
    13081308                }
    13091309                else if (is_special(c)) {
    1310                         USTPUTC(c, out);
     1310                        USTPUTC(psh, c, out);
    13111311                        c = pgetc();
    13121312                }
     
    13141314badsub:                 synerror("Bad substitution");
    13151315
    1316                 STPUTC('=', out);
     1316                STPUTC(psh, '=', out);
    13171317                flags = 0;
    13181318                if (subtype == 0) {
     
    13471347                if (ISDBLQUOTE() || arinest)
    13481348                        flags |= VSQUOTE;
    1349                 *(stackblock() + typeloc) = subtype | flags;
     1349                *(stackblock(psh) + typeloc) = subtype | flags;
    13501350                if (subtype != VSNORMAL) {
    13511351                        varnest++;
     
    13911391        INTOFF;
    13921392        str = NULL;
    1393         savelen = out - stackblock();
     1393        savelen = out - stackblock(psh);
    13941394        if (savelen > 0) {
    13951395                str = ckmalloc(savelen);
    1396                 memcpy(str, stackblock(), savelen);
     1396                memcpy(str, stackblock(psh), savelen);
    13971397        }
    13981398        savehandler = handler;
     
    14091409
    14101410
    1411                 STARTSTACKSTR(pout);
     1411                STARTSTACKSTR(psh, pout);
    14121412                for (;;) {
    14131413                        if (needprompt) {
     
    14361436                                if (pc != '\\' && pc != '`' && pc != '$'
    14371437                                    && (!ISDBLQUOTE() || pc != '"'))
    1438                                         STPUTC('\\', pout);
     1438                                        STPUTC(psh, '\\', pout);
    14391439                                break;
    14401440
     
    14521452                                break;
    14531453                        }
    1454                         STPUTC(pc, pout);
     1454                        STPUTC(psh, pc, pout);
    14551455                }
    14561456done:
    1457                 STPUTC('\0', pout);
    1458                 psavelen = pout - stackblock();
     1457                STPUTC(psh, '\0', pout);
     1458                psavelen = pout - stackblock(psh);
    14591459                if (psavelen > 0) {
    1460                         pstr = grabstackstr(pout);
     1460                        pstr = grabstackstr(psh, pout);
    14611461                        setinputstring(pstr, 1);
    14621462                }
     
    14651465        while (*nlpp)
    14661466                nlpp = &(*nlpp)->next;
    1467         *nlpp = (struct nodelist *)stalloc(sizeof (struct nodelist));
     1467        *nlpp = (struct nodelist *)stalloc(psh, sizeof (struct nodelist));
    14681468        (*nlpp)->next = NULL;
    14691469        parsebackquote = oldstyle;
     
    14921492                tokpushback = 0;
    14931493        }
    1494         while (stackblocksize() <= savelen)
    1495                 growstackblock();
    1496         STARTSTACKSTR(out);
     1494        while (stackblocksize(psh) <= savelen)
     1495                growstackblock(psh);
     1496        STARTSTACKSTR(psh, out);
    14971497        if (str) {
    14981498                memcpy(out, str, savelen);
    1499                 STADJUST(savelen, out);
     1499                STADJUST(psh, savelen, out);
    15001500                INTOFF;
    15011501                ckfree(str);
     
    15061506        handler = savehandler;
    15071507        if (arinest || ISDBLQUOTE())
    1508                 USTPUTC(CTLBACKQ | CTLQUOTE, out);
     1508                USTPUTC(psh, CTLBACKQ | CTLQUOTE, out);
    15091509        else
    1510                 USTPUTC(CTLBACKQ, out);
     1510                USTPUTC(psh, CTLBACKQ, out);
    15111511        if (oldstyle)
    15121512                goto parsebackq_oldreturn;
     
    15231523                prevsyntax = syntax;
    15241524                syntax = ARISYNTAX;
    1525                 USTPUTC(CTLARI, out);
     1525                USTPUTC(psh, CTLARI, out);
    15261526                if (ISDBLQUOTE())
    1527                         USTPUTC('"',out);
     1527                        USTPUTC(psh, '"',out);
    15281528                else
    1529                         USTPUTC(' ',out);
     1529                        USTPUTC(psh, ' ',out);
    15301530        } else {
    15311531                /*
     
    15331533                 * parenthesis, which should be equivalent
    15341534                 */
    1535                 USTPUTC('(', out);
     1535                USTPUTC(psh, '(', out);
    15361536        }
    15371537        goto parsearith_return;
  • trunk/src/kash/redir.c

    r809 r1198  
    206206                break;
    207207        case NTO:
    208                 if (Cflag)
     208                if (Cflag(psh))
    209209                        oflags |= O_EXCL;
    210210                /* FALLTHROUGH */
     
    267267                len = strlen(redir->nhere.doc->narg.text);
    268268                if (len <= PIPESIZE) {
    269                         xwrite(pip[1], redir->nhere.doc->narg.text, len);
     269                        xwrite(psh, pip[1], redir->nhere.doc->narg.text, len);
    270270                        goto out;
    271271                }
     
    281281                signal(SIGPIPE, SIG_DFL);
    282282                if (redir->type == NHERE)
    283                         xwrite(pip[1], redir->nhere.doc->narg.text, len);
     283                        xwrite(psh, pip[1], redir->nhere.doc->narg.text, len);
    284284                else
    285285                        expandhere(redir->nhere.doc, pip[1]);
  • trunk/src/kash/shfile.h

    r884 r1198  
    22/** @file
    33 *
    4  * File management. 
     4 * File management.
    55 *
    66 * Copyright (c) 2007 knut st. osmundsen <[email protected]>
     
    5555int shfile_pipe(shfdtab *, int [2]);
    5656int shfile_close(shfdtab *, unsigned);
     57long shfile_read(shfdtab *, int, void *, size_t);
     58long shfile_write(shfdtab *, int, const void *, size_t);
     59long shfile_lseek(shfdtab *, int, long, int);
    5760int shfile_fcntl(shfdtab *, int fd, int cmd, int arg);
    5861#ifdef _MSC_VER
     
    7174int shfile_chdir(shfdtab *, const char *);
    7275char *shfile_getcwd(shfdtab *, char *, int);
    73          
     76int shfile_isatty(shfdtab *, int);
     77
    7478#endif
    7579
  • trunk/src/kash/shinstance.c

    r883 r1198  
    3030/**
    3131 * Creates a root shell instance.
    32  * 
     32 *
    3333 * @param   inherit     The shell to inherit from. If NULL inherit from environment and such.
    3434 * @param   argc        The argument count.
    3535 * @param   argv        The argument vector.
    36  * 
     36 *
    3737 * @returns pointer to root shell on success, NULL on failure.
    3838 */
     
    4545    {
    4646        memset(psh, 0, sizeof(*psh));
    47         psh->
     47
     48        /* memalloc.c */
     49        psh->stacknleft = MINSIZE;
     50        psh->herefd = -1;
     51        psh->stackp = &psh->stackbase;
     52        psh->stacknxt = psh->stackbase.space;
     53
    4854    }
    4955    return psh;
  • trunk/src/kash/shinstance.h

    r884 r1198  
    3131#include "shthread.h"
    3232#include "shfile.h"
     33#include "output.h"
     34#include "options.h"
    3335
    3436#include "var.h"
     37
     38#define MINSIZE 504             /* minimum size of a block */
     39struct stack_block {
     40        struct stack_block *prev;
     41        char space[MINSIZE];
     42};
    3543
    3644
     
    97105#ifdef _MSC_VER
    98106    struct var          vpath2;
    99 #endif 
     107#endif
    100108    struct var          vps1;
    101109    struct var          vps2;
     
    115123
    116124    /* memalloc.h */
    117     char               *stacknxt;
    118     int                 stacknleft;
     125    char               *stacknxt/* = stackbase.space*/;
     126    int                 stacknleft/* = MINSIZE*/;
    119127    int                 sstrnleft;
    120     int                 herefd;
     128    int                 herefd/* = -1 */;
     129
     130    /* memalloc.c */
     131    struct stack_block  stackbase;
     132    struct stack_block *stackp/* = &stackbase*/;
     133    struct stackmark   *markp;
     134
    121135
    122136    /* jobs.h */
     
    151165    /* cd.c */
    152166    char               *curdir;         /**< current working directory */
    153     char               *prevdir;        /**< previous working directory */
     167    char               *prevdir;        /**< previous working directory */
    154168    char               *cdcomppath;
    155169    int                 getpwd_first;   /**< static in getpwd. (initialized to 1!) */
     
    160174    /* eval.c */
    161175    int                 vforked;
     176
     177    /* mail.c */
     178#define MAXMBOXES 10
     179    int                 nmboxes;        /**< number of mailboxes */
     180    time_t              mailtime[MAXMBOXES]; /**< times of mailboxes */
     181
    162182} shinstance;
    163183
     
    172192#else
    173193    typedef sigset_t sh_sigset_t;
    174 #endif 
     194#endif
    175195
    176196typedef void (*sh_handler)(int);
     
    179199void sh_sigemptyset(sh_sigset_t *set);
    180200int sh_sigprocmask(shinstance *, int op, sh_sigset_t const *new, sh_sigset_t *old);
     201void sh_abort(shinstance *);
    181202
    182203/* times */
     
    193214#   include <times.h>
    194215    typedef struct tms sh_tms;
    195 #endif 
     216#endif
    196217clock_t sh_times(sh_tms *);
    197218int sh_sysconf_clk_tck(void);
     
    219240#else
    220241#   include <sys/wait.h>
    221 #endif 
     242#endif
    222243pid_t sh_waitpid(shinstance *, pid_t, int *, int);
    223244void sh__exit(shinstance *, int);
    224245
    225 #endif
     246
     247#endif
  • trunk/src/kash/show.c

    r809 r1198  
    276276trputc(int c)
    277277{
    278         if (debug != 1)
     278        if (debug(psh) != 1)
    279279                return;
    280280        putc(c, tracefile);
     
    283283
    284284void
    285 trace(const char *fmt, ...)
     285trace(shinstance *psh, const char *fmt, ...)
    286286{
    287287#ifdef DEBUG
    288288        va_list va;
    289289
    290         if (debug != 1)
     290        if (debug(psh) != 1)
    291291                return;
    292292        fprintf(tracefile, "[%d] ", getpid());
     
    298298
    299299void
    300 tracev(const char *fmt, va_list va)
    301 {
    302 #ifdef DEBUG
    303         if (debug != 1)
     300tracev(shinstance *psh, const char *fmt, va_list va)
     301{
     302#ifdef DEBUG
     303        if (debug(psh) != 1)
    304304                return;
    305305        fprintf(tracefile, "[%d] ", getpid());
     
    313313trputs(const char *s)
    314314{
    315         if (debug != 1)
     315        if (debug(psh) != 1)
    316316                return;
    317317        fputs(s, tracefile);
     
    325325        char c;
    326326
    327         if (debug != 1)
     327        if (debug(psh) != 1)
    328328                return;
    329329        putc('"', tracefile);
     
    361361
    362362void
    363 trargs(char **ap)
    364 {
    365 #ifdef DEBUG
    366         if (debug != 1)
     363trargs(shinstance *psh, char **ap)
     364{
     365#ifdef DEBUG
     366        if (debug(psh) != 1)
    367367                return;
    368368        while (*ap) {
     
    386386#endif
    387387
    388         if (debug != 1) {
     388        if (debug(psh) != 1) {
    389389                if (tracefile)
    390390                        fflush(tracefile);
     
    410410                if (!freopen(s, "a", tracefile)) {
    411411                        fprintf(stderr, "Can't re-open %s\n", s);
    412                         debug = 0;
     412                        debug(psh) = 0;
    413413                        return;
    414414                }
     
    416416                if ((tracefile = fopen(s, "a")) == NULL) {
    417417                        fprintf(stderr, "Can't open %s\n", s);
    418                         debug = 0;
     418                        debug(psh) = 0;
    419419                        return;
    420420                }
  • trunk/src/kash/trap.c

    r809 r1198  
    102102
    103103        if (is_number(p))
    104                 return number(p);
     104                return number(psh, p);
    105105
    106106        if (strcasecmp(p, "exit") == 0 )
     
    190190        while (*ap) {
    191191                if (is_number(*ap))
    192                         signo = number(*ap);
     192                        signo = number(psh, *ap);
    193193                else
    194194                        signo = signame_to_signum(*ap);
     
    264264                switch (signo) {
    265265                case SIGINT:
    266                         if (iflag || minusc || sflag == 0)
     266                        if (iflag(psh) || minusc || sflag(psh) == 0)
    267267                                action = S_CATCH;
    268268                        break;
    269269                case SIGQUIT:
    270270#ifdef DEBUG
    271                         if (debug)
     271                        if (debug(psh))
    272272                                break;
    273273#endif
    274274                        /* FALLTHROUGH */
    275275                case SIGTERM:
    276                         if (iflag)
     276                        if (iflag(psh))
    277277                                action = S_IGN;
    278278                        break;
     
    280280                case SIGTSTP:
    281281                case SIGTTOU:
    282                         if (mflag)
     282                        if (mflag(psh))
    283283                                action = S_IGN;
    284284                        break;
     
    302302                }
    303303                if (sigact == SIG_IGN) {
    304                         if (mflag && (signo == SIGTSTP ||
     304                        if (mflag(psh) && (signo == SIGTSTP ||
    305305                             signo == SIGTTIN || signo == SIGTTOU)) {
    306306                                tsig = S_IGN;   /* don't hard ignore these */
  • trunk/src/kash/var.c

    r888 r1198  
    228228            if (i > 0)
    229229            {
    230                 psz[0] = psz[1] = psz[2] = psz[3] = '\0'; 
     230                psz[0] = psz[1] = psz[2] = psz[3] = '\0';
    231231                rc = DosQueryExtLIBPATH(psz, i);
    232232            }
     
    365365        int nlen;
    366366
    367         if (aflag)
     367        if (aflag(psh))
    368368                flags |= VEXPORT;
    369369        vp = find_var(s, &vpp, &nlen);
     
    501501                                nenv++;
    502502        }
    503         ep = env = stalloc((nenv + 1) * sizeof *env);
     503        ep = env = stalloc(psh, (nenv + 1) * sizeof *env);
    504504        for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) {
    505505                for (vp = *vpp ; vp ; vp = vp->next)
     
    706706        char *name;
    707707
    708         if (! in_function())
     708        if (! in_function(psh))
    709709                error("Not in a function");
    710710        while ((name = *argptr++) != NULL) {
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