- Timestamp:
- Oct 7, 2007 6:05:13 PM (17 years ago)
- Location:
- trunk/src/kash
- Files:
-
- 5 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/kash/Makefile.kmk
r1208 r1209 51 51 bltin/echo.c \ 52 52 bltin/test.c \ 53 trap.c \ 54 var.c \ 53 55 \ 54 trap.c \55 56 parser.c \ 56 57 redir.c \ 57 var.c \58 58 bltin/kill.c \ 59 59 $(PATH_TARGET)/arith.c \ -
trunk/src/kash/histedit.c
r1207 r1209 178 178 179 179 void 180 sethistsize( const char *hs)180 sethistsize(shinstance *psh, const char *hs) 181 181 { 182 182 int histsize; … … 192 192 193 193 void 194 setterm( const char *term)194 setterm(shinstance *psh, const char *term) 195 195 { 196 196 if (el != NULL && term != NULL) -
trunk/src/kash/shinstance.h
r1208 r1209 174 174 #ifndef SMALL 175 175 struct var vterm; 176 struct var vtermcap;177 176 struct var vhistsize; 178 177 #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]; 179 188 180 189 /* myhistedit.h */ -
trunk/src/kash/var.c
r1208 r1209 45 45 46 46 #include <unistd.h> 47 #include <stddef.h> 47 48 #include <stdlib.h> 48 49 #include <strings.h> … … 101 102 #include "myhistedit.h" 102 103 #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 109 111 110 112 111 113 struct varinit { 112 struct var *var;114 unsigned var_off; 113 115 int flags; 114 116 const char *text; 115 void (*func)( const char *);117 void (*func)(shinstance *, const char *); 116 118 }; 117 119 118 120 119 #if ATTY120 struct var vatty;121 #endif122 #ifndef SMALL123 struct var vhistsize;124 struct var vterm;125 #endif126 struct var vifs;127 struct var vmail;128 struct var vmpath;129 struct var vpath;130 #ifdef _MSC_VER131 struct var vpath2;132 #endif133 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; 138 140 139 141 #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]; 143 static const char * const libpath_envs[4] = {"LIBPATH=", "BEGINLIBPATH=", "ENDLIBPATH=", "LIBPATHSTRICT="}; 142 144 #endif 143 145 144 146 const struct varinit varinit[] = { 145 147 #if ATTY 146 { &vatty, VSTRFIXED|VTEXTFIXED|VUNSET, "ATTY=",148 { offsetof(shinstance, vatty), VSTRFIXED|VTEXTFIXED|VUNSET, "ATTY=", 147 149 NULL }, 148 150 #endif 149 151 #ifndef SMALL 150 { &vhistsize, VSTRFIXED|VTEXTFIXED|VUNSET, "HISTSIZE=",152 { offsetof(shinstance, vhistsize), VSTRFIXED|VTEXTFIXED|VUNSET, "HISTSIZE=", 151 153 sethistsize }, 152 154 #endif 153 { &vifs, VSTRFIXED|VTEXTFIXED, "IFS= \t\n",155 { offsetof(shinstance, vifs), VSTRFIXED|VTEXTFIXED, "IFS= \t\n", 154 156 NULL }, 155 { &vmail, VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL=",157 { offsetof(shinstance, vmail), VSTRFIXED|VTEXTFIXED|VUNSET, "MAIL=", 156 158 NULL }, 157 { &vmpath, VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH=",159 { offsetof(shinstance, vmpath), VSTRFIXED|VTEXTFIXED|VUNSET, "MAILPATH=", 158 160 NULL }, 159 { &vpath, VSTRFIXED|VTEXTFIXED, "PATH=" _PATH_DEFPATH,161 { offsetof(shinstance, vpath), VSTRFIXED|VTEXTFIXED, "PATH=" _PATH_DEFPATH, 160 162 changepath }, 161 163 #ifdef _MSC_VER 162 { &vpath2, VSTRFIXED|VTEXTFIXED, "Path=",164 { offsetof(shinstance, vpath2), VSTRFIXED|VTEXTFIXED, "Path=", 163 165 changepath }, 164 166 #endif … … 166 168 * vps1 depends on uid 167 169 */ 168 { &vps2, VSTRFIXED|VTEXTFIXED, "PS2=> ",170 { offsetof(shinstance, vps2), VSTRFIXED|VTEXTFIXED, "PS2=> ", 169 171 NULL }, 170 { &vps4, VSTRFIXED|VTEXTFIXED, "PS4=+ ",172 { offsetof(shinstance, vps4), VSTRFIXED|VTEXTFIXED, "PS4=+ ", 171 173 NULL }, 172 174 #ifndef SMALL 173 { &vterm, VSTRFIXED|VTEXTFIXED|VUNSET, "TERM=",175 { offsetof(shinstance, vterm), VSTRFIXED|VTEXTFIXED|VUNSET, "TERM=", 174 176 setterm }, 175 177 #endif 176 { &voptind, VSTRFIXED|VTEXTFIXED|VNOFUNC, "OPTIND=1",178 { offsetof(shinstance, voptind), VSTRFIXED|VTEXTFIXED|VNOFUNC, "OPTIND=1", 177 179 getoptsreset }, 178 { NULL, 0, NULL,180 { 0, 0, NULL, 179 181 NULL } 180 182 }; 181 183 182 struct var *vartab[VTABSIZE];184 //struct var *vartab[VTABSIZE]; 183 185 184 186 STATIC int strequal(const char *, const char *); 185 STATIC struct var *find_var( const char *, struct var ***, int *);187 STATIC struct var *find_var(shinstance *, const char *, struct var ***, int *); 186 188 187 189 /* … … 211 213 212 214 void 213 initvar( void)215 initvar(shinstance *psh) 214 216 { 215 217 const struct varinit *ip; 216 218 struct var *vp; 217 219 struct var **vpp; 218 219 220 #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) 261 264 continue; 262 265 vp->next = *vpp; … … 269 272 * PS1 depends on uid 270 273 */ 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; 276 279 } 277 280 } … … 282 285 283 286 int 284 setvarsafe( const char *name, const char *val, int flags)287 setvarsafe(shinstance *psh, const char *name, const char *val, int flags) 285 288 { 286 289 struct jmploc jmploc; … … 307 310 308 311 void 309 setvar( const char *name, const char *val, int flags)312 setvar(shinstance *psh, const char *name, const char *val, int flags) 310 313 { 311 314 const char *p; 312 315 const char *q; 313 316 char *d; 314 int len;317 size_t len; 315 318 int namelen; 316 319 char *nameeq; … … 330 333 p++; 331 334 } 332 namelen = p - name;335 namelen = (int)(p - name); 333 336 if (isbad) 334 337 error(psh, "%.*s: bad variable name", namelen, name); … … 360 363 361 364 void 362 setvareq( char *s, int flags)365 setvareq(shinstance *psh, char *s, int flags) 363 366 { 364 367 struct var *vp, **vpp; … … 367 370 if (aflag(psh)) 368 371 flags |= VEXPORT; 369 vp = find_var( s, &vpp, &nlen);372 vp = find_var(psh, s, &vpp, &nlen); 370 373 if (vp != NULL) { 371 374 if (vp->flags & VREADONLY) … … 376 379 377 380 if (vp->func && (flags & VNOFUNC) == 0) 378 (*vp->func)( s + vp->name_len + 1);381 (*vp->func)(psh, s + vp->name_len + 1); 379 382 380 383 if ((vp->flags & (VTEXTFIXED|VSTACK)) == 0) … … 385 388 vp->text = s; 386 389 #ifdef PC_OS2_LIBPATHS 387 388 390 if ((vp->flags & VOS2LIBPATH) && (vp->flags & VEXPORT)) 391 vp->flags &= ~VEXPORT; 389 392 #endif 390 393 … … 393 396 * a regular variable function callback, but why bother? 394 397 */ 395 if (vp == & vmpath || (vp == &vmail && ! mpathset()))398 if (vp == &psh->vmpath || (vp == &psh->vmail && ! mpathset(psh))) 396 399 chkmail(psh, 1); 397 400 INTON; … … 417 420 418 421 void 419 listsetvar(s truct strlist *list, int flags)422 listsetvar(shinstance *psh, struct strlist *list, int flags) 420 423 { 421 424 struct strlist *lp; … … 429 432 430 433 void 431 listmklocal(s truct strlist *list, int flags)434 listmklocal(shinstance *psh, struct strlist *list, int flags) 432 435 { 433 436 struct strlist *lp; … … 443 446 444 447 char * 445 lookupvar( const char *name)448 lookupvar(shinstance *psh, const char *name) 446 449 { 447 450 struct var *v; 448 451 449 v = find_var( name, NULL, NULL);452 v = find_var(psh, name, NULL, NULL); 450 453 if (v == NULL || v->flags & VUNSET) 451 454 return NULL; … … 462 465 463 466 char * 464 bltinlookup( const char *name, int doall)467 bltinlookup(shinstance *psh, const char *name, int doall) 465 468 { 466 469 struct strlist *sp; 467 470 struct var *v; 468 471 469 for (sp = cmdenviron ; sp ; sp = sp->next) {472 for (sp = psh->cmdenviron ; sp ; sp = sp->next) { 470 473 if (strequal(sp->text, name)) 471 474 return strchr(sp->text, '=') + 1; 472 475 } 473 476 474 v = find_var( name, NULL, NULL);477 v = find_var(psh, name, NULL, NULL); 475 478 476 479 if (v == NULL || v->flags & VUNSET || (!doall && !(v->flags & VEXPORT))) … … 487 490 488 491 char ** 489 environment( void)492 environment(shinstance *psh) 490 493 { 491 494 int nenv; … … 496 499 497 500 nenv = 0; 498 for (vpp = vartab ; vpp <vartab + VTABSIZE ; vpp++) {501 for (vpp = psh->vartab ; vpp < psh->vartab + VTABSIZE ; vpp++) { 499 502 for (vp = *vpp ; vp ; vp = vp->next) 500 503 if (vp->flags & VEXPORT) … … 502 505 } 503 506 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++) { 505 508 for (vp = *vpp ; vp ; vp = vp->next) 506 509 if (vp->flags & VEXPORT) … … 510 513 511 514 #ifdef PC_OS2_LIBPATHS 512 513 514 515 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); 517 520 #endif 518 521 … … 570 573 571 574 void 572 print_quoted( const char *p)575 print_quoted(shinstance *psh, const char *p) 573 576 { 574 577 const char *q; … … 613 616 614 617 int 615 showvars( const char *name, int flag, int show_value)618 showvars(shinstance *psh, const char *name, int flag, int show_value) 616 619 { 617 620 struct var **vpp; … … 625 628 if (!list) { 626 629 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++) { 631 634 for (vp = *vpp ; vp ; vp = vp->next) { 632 635 if (flag && !(vp->flags & flag)) … … 636 639 if (count >= list_len) { 637 640 list = ckrealloc(list, 638 (list_len << 1) * sizeof *list);641 (list_len << 1) * sizeof(*list)); 639 642 list_len <<= 1; 640 643 } … … 643 646 } 644 647 645 qsort(list, count, sizeof *list, sort_var);648 qsort(list, count, sizeof(*list), sort_var); 646 649 647 650 for (vpp = list; count--; vpp++) { … … 667 670 668 671 int 669 exportcmd( int argc, char **argv)672 exportcmd(shinstance *psh, int argc, char **argv) 670 673 { 671 674 struct var *vp; … … 685 688 p++; 686 689 } else { 687 vp = find_var( name, NULL, NULL);690 vp = find_var(psh, name, NULL, NULL); 688 691 if (vp != NULL) { 689 692 vp->flags |= flag; … … 702 705 703 706 int 704 localcmd( int argc, char **argv)707 localcmd(shinstance *psh, int argc, char **argv) 705 708 { 706 709 char *name; … … 723 726 724 727 void 725 mklocal( const char *name, int flags)728 mklocal(shinstance *psh, const char *name, int flags) 726 729 { 727 730 struct localvar *lvp; … … 734 737 char *p; 735 738 p = ckmalloc(sizeof_optlist); 736 lvp->text = memcpy(p, optlist, sizeof_optlist);739 lvp->text = memcpy(p, psh->optlist, sizeof_optlist); 737 740 vp = NULL; 738 741 } else { 739 vp = find_var( name, &vpp, NULL);742 vp = find_var(psh, name, &vpp, NULL); 740 743 if (vp == NULL) { 741 744 if (strchr(name, '=')) … … 755 758 } 756 759 lvp->vp = vp; 757 lvp->next = localvars;758 localvars = lvp;760 lvp->next = psh->localvars; 761 psh->localvars = lvp; 759 762 INTON; 760 763 } … … 766 769 767 770 void 768 poplocalvars( void)771 poplocalvars(shinstance *psh) 769 772 { 770 773 struct localvar *lvp; 771 774 struct var *vp; 772 775 773 while ((lvp = localvars) != NULL) {774 localvars = lvp->next;776 while ((lvp = psh->localvars) != NULL) { 777 psh->localvars = lvp->next; 775 778 vp = lvp->vp; 776 779 TRACE((psh, "poplocalvar %s", vp ? vp->text : "-")); 777 780 if (vp == NULL) { /* $- saved */ 778 memcpy( optlist, lvp->text, sizeof_optlist);781 memcpy(psh->optlist, lvp->text, sizeof_optlist); 779 782 ckfree(lvp->text); 780 783 } else if ((lvp->flags & (VUNSET|VSTRFIXED)) == VUNSET) { … … 782 785 } else { 783 786 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); 785 788 if ((vp->flags & VTEXTFIXED) == 0) 786 789 ckfree(vp->text); … … 794 797 795 798 int 796 setvarcmd( int argc, char **argv)799 setvarcmd(shinstance *psh, int argc, char **argv) 797 800 { 798 801 if (argc <= 2) … … 813 816 814 817 int 815 unsetcmd( int argc, char **argv)818 unsetcmd(shinstance *psh, int argc, char **argv) 816 819 { 817 820 char **ap; … … 845 848 846 849 int 847 unsetvar( const char *s, int unexport)850 unsetvar(shinstance *psh, const char *s, int unexport) 848 851 { 849 852 struct var **vpp; 850 853 struct var *vp; 851 854 852 vp = find_var( s, &vpp, NULL);855 vp = find_var(psh, s, &vpp, NULL); 853 856 if (vp == NULL) 854 857 return 1; … … 903 906 904 907 STATIC struct var * 905 find_var( const char *name, struct var ***vppp, int *lenp)908 find_var(shinstance *psh, const char *name, struct var ***vppp, int *lenp) 906 909 { 907 910 unsigned int hashval; … … 913 916 while (*p && *p != '=') 914 917 hashval = 2 * hashval + (unsigned char)*p++; 915 len = p - name;918 len = (int)(p - name); 916 919 917 920 if (lenp) 918 921 *lenp = len; 919 vpp = & vartab[hashval % VTABSIZE];922 vpp = &psh->vartab[hashval % VTABSIZE]; 920 923 if (vppp) 921 924 *vppp = vpp; -
trunk/src/kash/var.h
r1202 r1209 61 61 char *text; /* name=value */ 62 62 int name_len; /* length of name */ 63 void (*func)( const char *);63 void (*func)(struct shinstance *, const char *); 64 64 /* function to be called when */ 65 65 /* the variable gets set/unset */
Note:
See TracChangeset
for help on using the changeset viewer.