VirtualBox

Changeset 1209 in kBuild for trunk


Ignore:
Timestamp:
Oct 7, 2007 6:05:13 PM (17 years ago)
Author:
bird
Message:

var.c ++.

Location:
trunk/src/kash
Files:
5 edited

Legend:

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

    r1208 r1209  
    5151        bltin/echo.c \
    5252        bltin/test.c \
     53        trap.c \
     54        var.c \
    5355        \
    54         trap.c \
    5556        parser.c \
    5657        redir.c \
    57         var.c \
    5858        bltin/kill.c \
    5959        $(PATH_TARGET)/arith.c \
  • trunk/src/kash/histedit.c

    r1207 r1209  
    178178
    179179void
    180 sethistsize(const char *hs)
     180sethistsize(shinstance *psh, const char *hs)
    181181{
    182182        int histsize;
     
    192192
    193193void
    194 setterm(const char *term)
     194setterm(shinstance *psh, const char *term)
    195195{
    196196        if (el != NULL && term != NULL)
  • trunk/src/kash/shinstance.h

    r1208 r1209  
    174174#ifndef SMALL
    175175    struct var          vterm;
    176     struct var          vtermcap;
    177176    struct var          vhistsize;
    178177#endif
     178    struct var          voptind;
     179#ifdef PC_OS2_LIBPATHS
     180    struct var          libpath_vars[4];
     181#endif
     182#ifdef SMALL
     183# define VTABSIZE 39
     184#else
     185# define VTABSIZE 517
     186#endif
     187    struct var         *vartab[VTABSIZE];
    179188
    180189    /* myhistedit.h */
  • trunk/src/kash/var.c

    r1208 r1209  
    4545
    4646#include <unistd.h>
     47#include <stddef.h>
    4748#include <stdlib.h>
    4849#include <strings.h>
     
    101102#include "myhistedit.h"
    102103#endif
    103 
    104 #ifdef SMALL
    105 #define VTABSIZE 39
    106 #else
    107 #define VTABSIZE 517
    108 #endif
     104#include "shinstance.h"
     105
     106//#ifdef SMALL
     107//#define VTABSIZE 39
     108//#else
     109//#define VTABSIZE 517
     110//#endif
    109111
    110112
    111113struct varinit {
    112         struct var *var;
     114        unsigned var_off;
    113115        int flags;
    114116        const char *text;
    115         void (*func)(const char *);
     117        void (*func)(shinstance *, const char *);
    116118};
    117119
    118120
    119 #if ATTY
    120 struct var vatty;
    121 #endif
    122 #ifndef SMALL
    123 struct var vhistsize;
    124 struct var vterm;
    125 #endif
    126 struct var vifs;
    127 struct var vmail;
    128 struct var vmpath;
    129 struct var vpath;
    130 #ifdef _MSC_VER
    131 struct var vpath2;
    132 #endif
    133 struct var vps1;
    134 struct var vps2;
    135 struct var vps4;
    136 struct var vvers;
    137 struct var voptind;
     121//#if ATTY
     122//struct var vatty;
     123//#endif
     124//#ifndef SMALL
     125//struct var vhistsize;
     126//struct var vterm;
     127//#endif
     128//struct var vifs;
     129//struct var vmail;
     130//struct var vmpath;
     131//struct var vpath;
     132//#ifdef _MSC_VER
     133//struct var vpath2;
     134//#endif
     135//struct var vps1;
     136//struct var vps2;
     137//struct var vps4;
     138//struct var vvers; - unused
     139//struct var voptind;
    138140
    139141#ifdef PC_OS2_LIBPATHS
    140 static struct var libpath_vars[4];
    141 static const char *libpath_envs[4] = {"LIBPATH=", "BEGINLIBPATH=", "ENDLIBPATH=", "LIBPATHSTRICT="};
     142//static struct var libpath_vars[4];
     143static const char * const libpath_envs[4] = {"LIBPATH=", "BEGINLIBPATH=", "ENDLIBPATH=", "LIBPATHSTRICT="};
    142144#endif
    143145
    144146const struct varinit varinit[] = {
    145147#if ATTY
    146         { &vatty,       VSTRFIXED|VTEXTFIXED|VUNSET,    "ATTY=",
     148        { offsetof(shinstance, vatty),  VSTRFIXED|VTEXTFIXED|VUNSET,    "ATTY=",
    147149          NULL },
    148150#endif
    149151#ifndef SMALL
    150         { &vhistsize,   VSTRFIXED|VTEXTFIXED|VUNSET,    "HISTSIZE=",
     152        { offsetof(shinstance, vhistsize),      VSTRFIXED|VTEXTFIXED|VUNSET,    "HISTSIZE=",
    151153          sethistsize },
    152154#endif
    153         { &vifs,        VSTRFIXED|VTEXTFIXED,           "IFS= \t\n",
     155        { offsetof(shinstance, vifs),   VSTRFIXED|VTEXTFIXED,           "IFS= \t\n",
    154156          NULL },
    155         { &vmail,       VSTRFIXED|VTEXTFIXED|VUNSET,    "MAIL=",
     157        { offsetof(shinstance, vmail),  VSTRFIXED|VTEXTFIXED|VUNSET,    "MAIL=",
    156158          NULL },
    157         { &vmpath,      VSTRFIXED|VTEXTFIXED|VUNSET,    "MAILPATH=",
     159        { offsetof(shinstance, vmpath), VSTRFIXED|VTEXTFIXED|VUNSET,    "MAILPATH=",
    158160          NULL },
    159         { &vpath,       VSTRFIXED|VTEXTFIXED,           "PATH=" _PATH_DEFPATH,
     161        { offsetof(shinstance, vpath),  VSTRFIXED|VTEXTFIXED,           "PATH=" _PATH_DEFPATH,
    160162          changepath },
    161163#ifdef _MSC_VER
    162         { &vpath2,      VSTRFIXED|VTEXTFIXED,           "Path=",
     164        { offsetof(shinstance, vpath2), VSTRFIXED|VTEXTFIXED,           "Path=",
    163165          changepath },
    164166#endif
     
    166168         * vps1 depends on uid
    167169         */
    168         { &vps2,        VSTRFIXED|VTEXTFIXED,           "PS2=> ",
     170        { offsetof(shinstance, vps2),   VSTRFIXED|VTEXTFIXED,           "PS2=> ",
    169171          NULL },
    170         { &vps4,        VSTRFIXED|VTEXTFIXED,           "PS4=+ ",
     172        { offsetof(shinstance, vps4),   VSTRFIXED|VTEXTFIXED,           "PS4=+ ",
    171173          NULL },
    172174#ifndef SMALL
    173         { &vterm,       VSTRFIXED|VTEXTFIXED|VUNSET,    "TERM=",
     175        { offsetof(shinstance, vterm),  VSTRFIXED|VTEXTFIXED|VUNSET,    "TERM=",
    174176          setterm },
    175177#endif
    176         { &voptind,     VSTRFIXED|VTEXTFIXED|VNOFUNC,   "OPTIND=1",
     178        { offsetof(shinstance, voptind),        VSTRFIXED|VTEXTFIXED|VNOFUNC,   "OPTIND=1",
    177179          getoptsreset },
    178         { NULL, 0,                              NULL,
     180        { 0,    0,                              NULL,
    179181          NULL }
    180182};
    181183
    182 struct var *vartab[VTABSIZE];
     184//struct var *vartab[VTABSIZE];
    183185
    184186STATIC int strequal(const char *, const char *);
    185 STATIC struct var *find_var(const char *, struct var ***, int *);
     187STATIC struct var *find_var(shinstance *, const char *, struct var ***, int *);
    186188
    187189/*
     
    211213
    212214void
    213 initvar(void)
     215initvar(shinstance *psh)
    214216{
    215217        const struct varinit *ip;
    216218        struct var *vp;
    217219        struct var **vpp;
    218 
    219220#ifdef PC_OS2_LIBPATHS
    220         char *psz = ckmalloc(2048);
    221         int rc;
    222         int i;
    223         for (i = 0; i < 4; i++)
    224         {
    225             libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH;
    226             libpath_vars[i].func = NULL;
    227 
    228             if (i > 0)
    229             {
    230                 psz[0] = psz[1] = psz[2] = psz[3] = '\0';
    231                 rc = DosQueryExtLIBPATH(psz, i);
    232             }
    233             else
    234             {
    235                 rc = DosQueryHeaderInfo(NULLHANDLE, 0, psz, 2048, QHINF_LIBPATH);
    236                 libpath_vars[i].flags |= VREADONLY;
    237             }
    238             if (!rc && *psz)
    239             {
    240                 int cch1 = strlen(libpath_envs[i]);
    241                 int cch2 = strlen(psz) + 1;
    242                 libpath_vars[i].text = ckmalloc(cch1 + cch2);
    243                 memcpy(libpath_vars[i].text, libpath_envs[i], cch1);
    244                 memcpy(libpath_vars[i].text + cch1, psz, cch2);
    245             }
    246             else
    247             {
    248                 libpath_vars[i].flags |= VUNSET | VTEXTFIXED;
    249                 libpath_vars[i].text = (char*)libpath_envs[i];
    250             }
    251             if (find_var(libpath_vars[i].text, &vpp, &libpath_vars[i].name_len) != NULL)
    252                     continue;
    253             libpath_vars[i].next = *vpp;
    254             *vpp = &libpath_vars[i];
    255         }
    256         free(psz);
    257 #endif
    258 
    259         for (ip = varinit ; (vp = ip->var) != NULL ; ip++) {
    260                 if (find_var(ip->text, &vpp, &vp->name_len) != NULL)
     221        char *psz = ckmalloc(2048);
     222        int rc;
     223        int i;
     224
     225        for (i = 0; i < 4; i++)
     226        {
     227                psh->libpath_vars[i].flags = VSTRFIXED | VOS2LIBPATH;
     228                psh->libpath_vars[i].func = NULL;
     229
     230                if (i > 0)
     231                {
     232                        psz[0] = psz[1] = psz[2] = psz[3] = '\0';
     233                        rc = DosQueryExtLIBPATH(psz, i);
     234                }
     235                else
     236                {
     237                        rc = DosQueryHeaderInfo(NULLHANDLE, 0, psz, 2048, QHINF_LIBPATH);
     238                        psh->libpath_vars[i].flags |= VREADONLY;
     239                }
     240                if (!rc && *psz)
     241                {
     242                        int cch1 = strlen(libpath_envs[i]);
     243                        int cch2 = strlen(psz) + 1;
     244                        psh->libpath_vars[i].text = ckmalloc(cch1 + cch2);
     245                        memcpy(psh->libpath_vars[i].text, libpath_envs[i], cch1);
     246                        memcpy(psh->libpath_vars[i].text + cch1, psz, cch2);
     247                }
     248                else
     249                {
     250                        psh->libpath_vars[i].flags |= VUNSET | VTEXTFIXED;
     251                        psh->libpath_vars[i].text = (char*)libpath_envs[i];
     252                }
     253                if (find_var(psh, psh->libpath_vars[i].text, &vpp, &psh->libpath_vars[i].name_len) != NULL)
     254                        continue;
     255                psh->libpath_vars[i].next = *vpp;
     256                *vpp = &psh->libpath_vars[i];
     257        }
     258        free(psz);
     259#endif
     260
     261        for (ip = varinit; ip->text; ip++) {
     262                vp = (struct var *)((char *)psh + ip->var_off);
     263                if (find_var(psh, ip->text, &vpp, &vp->name_len) != NULL)
    261264                        continue;
    262265                vp->next = *vpp;
     
    269272         * PS1 depends on uid
    270273         */
    271         if (find_var("PS1", &vpp, &vps1.name_len) == NULL) {
    272                 vps1.next = *vpp;
    273                 *vpp = &vps1;
    274                 vps1.text = strdup(sh_geteuid(psh) ? "PS1=$ " : "PS1=# ");
    275                 vps1.flags = VSTRFIXED|VTEXTFIXED;
     274        if (find_var(psh, "PS1", &vpp, &psh->vps1.name_len) == NULL) {
     275                psh->vps1.next = *vpp;
     276                *vpp = &psh->vps1;
     277                psh->vps1.text = strdup(sh_geteuid(psh) ? "PS1=$ " : "PS1=# ");
     278                psh->vps1.flags = VSTRFIXED|VTEXTFIXED;
    276279        }
    277280}
     
    282285
    283286int
    284 setvarsafe(const char *name, const char *val, int flags)
     287setvarsafe(shinstance *psh, const char *name, const char *val, int flags)
    285288{
    286289        struct jmploc jmploc;
     
    307310
    308311void
    309 setvar(const char *name, const char *val, int flags)
     312setvar(shinstance *psh, const char *name, const char *val, int flags)
    310313{
    311314        const char *p;
    312315        const char *q;
    313316        char *d;
    314         int len;
     317        size_t len;
    315318        int namelen;
    316319        char *nameeq;
     
    330333                p++;
    331334        }
    332         namelen = p - name;
     335        namelen = (int)(p - name);
    333336        if (isbad)
    334337                error(psh, "%.*s: bad variable name", namelen, name);
     
    360363
    361364void
    362 setvareq(char *s, int flags)
     365setvareq(shinstance *psh, char *s, int flags)
    363366{
    364367        struct var *vp, **vpp;
     
    367370        if (aflag(psh))
    368371                flags |= VEXPORT;
    369         vp = find_var(s, &vpp, &nlen);
     372        vp = find_var(psh, s, &vpp, &nlen);
    370373        if (vp != NULL) {
    371374                if (vp->flags & VREADONLY)
     
    376379
    377380                if (vp->func && (flags & VNOFUNC) == 0)
    378                         (*vp->func)(s + vp->name_len + 1);
     381                        (*vp->func)(psh, s + vp->name_len + 1);
    379382
    380383                if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0)
     
    385388                vp->text = s;
    386389#ifdef PC_OS2_LIBPATHS
    387                 if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT))
    388                     vp->flags &= ~VEXPORT;
     390                if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT))
     391                        vp->flags &= ~VEXPORT;
    389392#endif
    390393
     
    393396                 * a regular variable function callback, but why bother?
    394397                 */
    395                 if (vp == &vmpath || (vp == &vmail && ! mpathset()))
     398                if (vp == &psh->vmpath || (vp == &psh->vmail && ! mpathset(psh)))
    396399                        chkmail(psh, 1);
    397400                INTON;
     
    417420
    418421void
    419 listsetvar(struct strlist *list, int flags)
     422listsetvar(shinstance *psh, struct strlist *list, int flags)
    420423{
    421424        struct strlist *lp;
     
    429432
    430433void
    431 listmklocal(struct strlist *list, int flags)
     434listmklocal(shinstance *psh, struct strlist *list, int flags)
    432435{
    433436        struct strlist *lp;
     
    443446
    444447char *
    445 lookupvar(const char *name)
     448lookupvar(shinstance *psh, const char *name)
    446449{
    447450        struct var *v;
    448451
    449         v = find_var(name, NULL, NULL);
     452        v = find_var(psh, name, NULL, NULL);
    450453        if (v == NULL || v->flags & VUNSET)
    451454                return NULL;
     
    462465
    463466char *
    464 bltinlookup(const char *name, int doall)
     467bltinlookup(shinstance *psh, const char *name, int doall)
    465468{
    466469        struct strlist *sp;
    467470        struct var *v;
    468471
    469         for (sp = cmdenviron ; sp ; sp = sp->next) {
     472        for (sp = psh->cmdenviron ; sp ; sp = sp->next) {
    470473                if (strequal(sp->text, name))
    471474                        return strchr(sp->text, '=') + 1;
    472475        }
    473476
    474         v = find_var(name, NULL, NULL);
     477        v = find_var(psh, name, NULL, NULL);
    475478
    476479        if (v == NULL || v->flags & VUNSET || (!doall && !(v->flags & VEXPORT)))
     
    487490
    488491char **
    489 environment(void)
     492environment(shinstance *psh)
    490493{
    491494        int nenv;
     
    496499
    497500        nenv = 0;
    498         for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) {
     501        for (vpp = psh->vartab ; vpp < psh->vartab + VTABSIZE ; vpp++) {
    499502                for (vp = *vpp ; vp ; vp = vp->next)
    500503                        if (vp->flags & VEXPORT)
     
    502505        }
    503506        ep = env = stalloc(psh, (nenv + 1) * sizeof *env);
    504         for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) {
     507        for (vpp = psh->vartab ; vpp < psh->vartab + VTABSIZE ; vpp++) {
    505508                for (vp = *vpp ; vp ; vp = vp->next)
    506509                        if (vp->flags & VEXPORT)
     
    510513
    511514#ifdef PC_OS2_LIBPATHS
    512         /*
    513         * Set the libpaths now as this is exec() time.
    514         */
    515         for (nenv = 0; nenv < 3; nenv++)
    516             DosSetExtLIBPATH(strchr(libpath_vars[nenv].text, '=') + 1, nenv);
     515        /*
     516        * Set the libpaths now as this is exec() time.
     517        */
     518        for (nenv = 0; nenv < 3; nenv++)
     519                DosSetExtLIBPATH(strchr(psh->libpath_vars[nenv].text, '=') + 1, nenv);
    517520#endif
    518521
     
    570573
    571574void
    572 print_quoted(const char *p)
     575print_quoted(shinstance *psh, const char *p)
    573576{
    574577        const char *q;
     
    613616
    614617int
    615 showvars(const char *name, int flag, int show_value)
     618showvars(shinstance *psh, const char *name, int flag, int show_value)
    616619{
    617620        struct var **vpp;
     
    625628        if (!list) {
    626629                list_len = 32;
    627                 list = ckmalloc(list_len * sizeof *list);
    628         }
    629 
    630         for (vpp = vartab ; vpp < vartab + VTABSIZE ; vpp++) {
     630                list = ckmalloc(list_len * sizeof(*list));
     631        }
     632
     633        for (vpp = psh->vartab ; vpp < psh->vartab + VTABSIZE ; vpp++) {
    631634                for (vp = *vpp ; vp ; vp = vp->next) {
    632635                        if (flag && !(vp->flags & flag))
     
    636639                        if (count >= list_len) {
    637640                                list = ckrealloc(list,
    638                                         (list_len << 1) * sizeof *list);
     641                                        (list_len << 1) * sizeof(*list));
    639642                                list_len <<= 1;
    640643                        }
     
    643646        }
    644647
    645         qsort(list, count, sizeof *list, sort_var);
     648        qsort(list, count, sizeof(*list), sort_var);
    646649
    647650        for (vpp = list; count--; vpp++) {
     
    667670
    668671int
    669 exportcmd(int argc, char **argv)
     672exportcmd(shinstance *psh, int argc, char **argv)
    670673{
    671674        struct var *vp;
     
    685688                        p++;
    686689                } else {
    687                         vp = find_var(name, NULL, NULL);
     690                        vp = find_var(psh, name, NULL, NULL);
    688691                        if (vp != NULL) {
    689692                                vp->flags |= flag;
     
    702705
    703706int
    704 localcmd(int argc, char **argv)
     707localcmd(shinstance *psh, int argc, char **argv)
    705708{
    706709        char *name;
     
    723726
    724727void
    725 mklocal(const char *name, int flags)
     728mklocal(shinstance *psh, const char *name, int flags)
    726729{
    727730        struct localvar *lvp;
     
    734737                char *p;
    735738                p = ckmalloc(sizeof_optlist);
    736                 lvp->text = memcpy(p, optlist, sizeof_optlist);
     739                lvp->text = memcpy(p, psh->optlist, sizeof_optlist);
    737740                vp = NULL;
    738741        } else {
    739                 vp = find_var(name, &vpp, NULL);
     742                vp = find_var(psh, name, &vpp, NULL);
    740743                if (vp == NULL) {
    741744                        if (strchr(name, '='))
     
    755758        }
    756759        lvp->vp = vp;
    757         lvp->next = localvars;
    758         localvars = lvp;
     760        lvp->next = psh->localvars;
     761        psh->localvars = lvp;
    759762        INTON;
    760763}
     
    766769
    767770void
    768 poplocalvars(void)
     771poplocalvars(shinstance *psh)
    769772{
    770773        struct localvar *lvp;
    771774        struct var *vp;
    772775
    773         while ((lvp = localvars) != NULL) {
    774                 localvars = lvp->next;
     776        while ((lvp = psh->localvars) != NULL) {
     777                psh->localvars = lvp->next;
    775778                vp = lvp->vp;
    776779                TRACE((psh, "poplocalvar %s", vp ? vp->text : "-"));
    777780                if (vp == NULL) {       /* $- saved */
    778                         memcpy(optlist, lvp->text, sizeof_optlist);
     781                        memcpy(psh->optlist, lvp->text, sizeof_optlist);
    779782                        ckfree(lvp->text);
    780783                } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) {
     
    782785                } else {
    783786                        if (vp->func && (vp->flags & VNOFUNC) == 0)
    784                                 (*vp->func)(lvp->text + vp->name_len + 1);
     787                                (*vp->func)(psh, lvp->text + vp->name_len + 1);
    785788                        if ((vp->flags & VTEXTFIXED) == 0)
    786789                                ckfree(vp->text);
     
    794797
    795798int
    796 setvarcmd(int argc, char **argv)
     799setvarcmd(shinstance *psh, int argc, char **argv)
    797800{
    798801        if (argc <= 2)
     
    813816
    814817int
    815 unsetcmd(int argc, char **argv)
     818unsetcmd(shinstance *psh, int argc, char **argv)
    816819{
    817820        char **ap;
     
    845848
    846849int
    847 unsetvar(const char *s, int unexport)
     850unsetvar(shinstance *psh, const char *s, int unexport)
    848851{
    849852        struct var **vpp;
    850853        struct var *vp;
    851854
    852         vp = find_var(s, &vpp, NULL);
     855        vp = find_var(psh, s, &vpp, NULL);
    853856        if (vp == NULL)
    854857                return 1;
     
    903906
    904907STATIC struct var *
    905 find_var(const char *name, struct var ***vppp, int *lenp)
     908find_var(shinstance *psh, const char *name, struct var ***vppp, int *lenp)
    906909{
    907910        unsigned int hashval;
     
    913916        while (*p && *p != '=')
    914917                hashval = 2 * hashval + (unsigned char)*p++;
    915         len = p - name;
     918        len = (int)(p - name);
    916919
    917920        if (lenp)
    918921                *lenp = len;
    919         vpp = &vartab[hashval % VTABSIZE];
     922        vpp = &psh->vartab[hashval % VTABSIZE];
    920923        if (vppp)
    921924                *vppp = vpp;
  • trunk/src/kash/var.h

    r1202 r1209  
    6161        char *text;                     /* name=value */
    6262        int name_len;                   /* length of name */
    63         void (*func)(const char *);
     63        void (*func)(struct shinstance *, const char *);
    6464                                        /* function to be called when  */
    6565                                        /* the variable gets set/unset */
Note: See TracChangeset for help on using the changeset viewer.

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