1b2d5d167SMark Peek /* $Header: /src/pub/tcsh/sh.set.c,v 3.48 2004/03/21 16:48:14 christos Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * sh.set.c: Setting and Clearing of variables 4c80476e4SDavid E. O'Brien */ 5c80476e4SDavid E. O'Brien /*- 6c80476e4SDavid E. O'Brien * Copyright (c) 1980, 1991 The Regents of the University of California. 7c80476e4SDavid E. O'Brien * All rights reserved. 8c80476e4SDavid E. O'Brien * 9c80476e4SDavid E. O'Brien * Redistribution and use in source and binary forms, with or without 10c80476e4SDavid E. O'Brien * modification, are permitted provided that the following conditions 11c80476e4SDavid E. O'Brien * are met: 12c80476e4SDavid E. O'Brien * 1. Redistributions of source code must retain the above copyright 13c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer. 14c80476e4SDavid E. O'Brien * 2. Redistributions in binary form must reproduce the above copyright 15c80476e4SDavid E. O'Brien * notice, this list of conditions and the following disclaimer in the 16c80476e4SDavid E. O'Brien * documentation and/or other materials provided with the distribution. 1729301572SMark Peek * 3. Neither the name of the University nor the names of its contributors 18c80476e4SDavid E. O'Brien * may be used to endorse or promote products derived from this software 19c80476e4SDavid E. O'Brien * without specific prior written permission. 20c80476e4SDavid E. O'Brien * 21c80476e4SDavid E. O'Brien * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 22c80476e4SDavid E. O'Brien * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23c80476e4SDavid E. O'Brien * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24c80476e4SDavid E. O'Brien * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 25c80476e4SDavid E. O'Brien * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26c80476e4SDavid E. O'Brien * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27c80476e4SDavid E. O'Brien * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28c80476e4SDavid E. O'Brien * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29c80476e4SDavid E. O'Brien * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30c80476e4SDavid E. O'Brien * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31c80476e4SDavid E. O'Brien * SUCH DAMAGE. 32c80476e4SDavid E. O'Brien */ 33c80476e4SDavid E. O'Brien #include "sh.h" 34c80476e4SDavid E. O'Brien 35b2d5d167SMark Peek RCSID("$Id: sh.set.c,v 3.48 2004/03/21 16:48:14 christos Exp $") 36c80476e4SDavid E. O'Brien 37c80476e4SDavid E. O'Brien #include "ed.h" 38c80476e4SDavid E. O'Brien #include "tw.h" 39c80476e4SDavid E. O'Brien 40c80476e4SDavid E. O'Brien extern Char HistLit; 41c80476e4SDavid E. O'Brien extern bool GotTermCaps; 42b2d5d167SMark Peek int numeof = 0; 43c80476e4SDavid E. O'Brien 44c80476e4SDavid E. O'Brien static void update_vars __P((Char *)); 45c80476e4SDavid E. O'Brien static Char *getinx __P((Char *, int *)); 46c80476e4SDavid E. O'Brien static void asx __P((Char *, int, Char *)); 47c80476e4SDavid E. O'Brien static struct varent *getvx __P((Char *, int)); 48c80476e4SDavid E. O'Brien static Char *xset __P((Char *, Char ***)); 49c80476e4SDavid E. O'Brien static Char *operate __P((int, Char *, Char *)); 50c80476e4SDavid E. O'Brien static void putn1 __P((int)); 51c80476e4SDavid E. O'Brien static struct varent *madrof __P((Char *, struct varent *)); 52c80476e4SDavid E. O'Brien static void unsetv1 __P((struct varent *)); 53c80476e4SDavid E. O'Brien static void exportpath __P((Char **)); 54c80476e4SDavid E. O'Brien static void balance __P((struct varent *, int, int)); 55c80476e4SDavid E. O'Brien 56c80476e4SDavid E. O'Brien /* 57c80476e4SDavid E. O'Brien * C Shell 58c80476e4SDavid E. O'Brien */ 59c80476e4SDavid E. O'Brien 60c80476e4SDavid E. O'Brien static void 61c80476e4SDavid E. O'Brien update_vars(vp) 62c80476e4SDavid E. O'Brien Char *vp; 63c80476e4SDavid E. O'Brien { 64c80476e4SDavid E. O'Brien if (eq(vp, STRpath)) { 65c80476e4SDavid E. O'Brien exportpath(adrof(STRpath)->vec); 66c80476e4SDavid E. O'Brien dohash(NULL, NULL); 67c80476e4SDavid E. O'Brien } 68c80476e4SDavid E. O'Brien else if (eq(vp, STRhistchars)) { 69c80476e4SDavid E. O'Brien register Char *pn = varval(vp); 70c80476e4SDavid E. O'Brien 71c80476e4SDavid E. O'Brien HIST = *pn++; 72c80476e4SDavid E. O'Brien HISTSUB = *pn; 73c80476e4SDavid E. O'Brien } 74c80476e4SDavid E. O'Brien else if (eq(vp, STRpromptchars)) { 75c80476e4SDavid E. O'Brien register Char *pn = varval(vp); 76c80476e4SDavid E. O'Brien 77c80476e4SDavid E. O'Brien PRCH = *pn++; 78c80476e4SDavid E. O'Brien PRCHROOT = *pn; 79c80476e4SDavid E. O'Brien } 80c80476e4SDavid E. O'Brien else if (eq(vp, STRhistlit)) { 81c80476e4SDavid E. O'Brien HistLit = 1; 82c80476e4SDavid E. O'Brien } 83c80476e4SDavid E. O'Brien else if (eq(vp, STRuser)) { 84c80476e4SDavid E. O'Brien tsetenv(STRKUSER, varval(vp)); 85c80476e4SDavid E. O'Brien tsetenv(STRLOGNAME, varval(vp)); 86c80476e4SDavid E. O'Brien } 87c80476e4SDavid E. O'Brien else if (eq(vp, STRgroup)) { 88c80476e4SDavid E. O'Brien tsetenv(STRKGROUP, varval(vp)); 89c80476e4SDavid E. O'Brien } 90c80476e4SDavid E. O'Brien else if (eq(vp, STRwordchars)) { 91c80476e4SDavid E. O'Brien word_chars = varval(vp); 92c80476e4SDavid E. O'Brien } 93c80476e4SDavid E. O'Brien else if (eq(vp, STRloginsh)) { 94c80476e4SDavid E. O'Brien loginsh = 1; 95c80476e4SDavid E. O'Brien } 96c80476e4SDavid E. O'Brien else if (eq(vp, STRsymlinks)) { 97c80476e4SDavid E. O'Brien register Char *pn = varval(vp); 98c80476e4SDavid E. O'Brien 99c80476e4SDavid E. O'Brien if (eq(pn, STRignore)) 100c80476e4SDavid E. O'Brien symlinks = SYM_IGNORE; 101c80476e4SDavid E. O'Brien else if (eq(pn, STRexpand)) 102c80476e4SDavid E. O'Brien symlinks = SYM_EXPAND; 103c80476e4SDavid E. O'Brien else if (eq(pn, STRchase)) 104c80476e4SDavid E. O'Brien symlinks = SYM_CHASE; 105c80476e4SDavid E. O'Brien else 106c80476e4SDavid E. O'Brien symlinks = 0; 107c80476e4SDavid E. O'Brien } 108c80476e4SDavid E. O'Brien else if (eq(vp, STRterm)) { 109c80476e4SDavid E. O'Brien Char *cp = varval(vp); 110c80476e4SDavid E. O'Brien tsetenv(STRKTERM, cp); 111c80476e4SDavid E. O'Brien #ifdef DOESNT_WORK_RIGHT 112c80476e4SDavid E. O'Brien cp = getenv("TERMCAP"); 113c80476e4SDavid E. O'Brien if (cp && (*cp != '/')) /* if TERMCAP and not a path */ 114c80476e4SDavid E. O'Brien Unsetenv(STRTERMCAP); 115c80476e4SDavid E. O'Brien #endif /* DOESNT_WORK_RIGHT */ 116c80476e4SDavid E. O'Brien GotTermCaps = 0; 117c80476e4SDavid E. O'Brien if (noediting && Strcmp(cp, STRnetwork) != 0 && 118c80476e4SDavid E. O'Brien Strcmp(cp, STRunknown) != 0 && Strcmp(cp, STRdumb) != 0) { 119c80476e4SDavid E. O'Brien editing = 1; 120c80476e4SDavid E. O'Brien noediting = 0; 121c80476e4SDavid E. O'Brien set(STRedit, Strsave(STRNULL), VAR_READWRITE); 122c80476e4SDavid E. O'Brien } 123c80476e4SDavid E. O'Brien ed_Init(); /* reset the editor */ 124c80476e4SDavid E. O'Brien } 125c80476e4SDavid E. O'Brien else if (eq(vp, STRhome)) { 126b2d5d167SMark Peek Char *cp; 127c80476e4SDavid E. O'Brien 128c80476e4SDavid E. O'Brien cp = Strsave(varval(vp)); /* get the old value back */ 129c80476e4SDavid E. O'Brien 130c80476e4SDavid E. O'Brien /* 131c80476e4SDavid E. O'Brien * convert to cononical pathname (possibly resolving symlinks) 132c80476e4SDavid E. O'Brien */ 133c80476e4SDavid E. O'Brien cp = dcanon(cp, cp); 134c80476e4SDavid E. O'Brien 135c80476e4SDavid E. O'Brien set(vp, Strsave(cp), VAR_READWRITE); /* have to save the new val */ 136c80476e4SDavid E. O'Brien 137c80476e4SDavid E. O'Brien /* and now mirror home with HOME */ 138c80476e4SDavid E. O'Brien tsetenv(STRKHOME, cp); 139c80476e4SDavid E. O'Brien /* fix directory stack for new tilde home */ 140c80476e4SDavid E. O'Brien dtilde(); 141c80476e4SDavid E. O'Brien xfree((ptr_t) cp); 142c80476e4SDavid E. O'Brien } 143c80476e4SDavid E. O'Brien else if (eq(vp, STRedit)) { 144c80476e4SDavid E. O'Brien editing = 1; 145c80476e4SDavid E. O'Brien noediting = 0; 146c80476e4SDavid E. O'Brien /* PWP: add more stuff in here later */ 147c80476e4SDavid E. O'Brien } 148c80476e4SDavid E. O'Brien else if (eq(vp, STRshlvl)) { 149c80476e4SDavid E. O'Brien tsetenv(STRKSHLVL, varval(vp)); 150c80476e4SDavid E. O'Brien } 151b2d5d167SMark Peek else if (eq(vp, STRignoreeof)) { 152b2d5d167SMark Peek Char *cp; 153b2d5d167SMark Peek numeof = 0; 154b2d5d167SMark Peek for ((cp = varval(STRignoreeof)); cp && *cp; cp++) { 155b2d5d167SMark Peek if (!Isdigit(*cp)) { 156b2d5d167SMark Peek numeof = 0; 157b2d5d167SMark Peek break; 158b2d5d167SMark Peek } 159b2d5d167SMark Peek numeof = numeof * 10 + *cp - '0'; 160b2d5d167SMark Peek } 161b2d5d167SMark Peek if (numeof <= 0) numeof = 26; /* Sanity check */ 162b2d5d167SMark Peek } 163c80476e4SDavid E. O'Brien else if (eq(vp, STRbackslash_quote)) { 164c80476e4SDavid E. O'Brien bslash_quote = 1; 165c80476e4SDavid E. O'Brien } 166c80476e4SDavid E. O'Brien else if (eq(vp, STRdirstack)) { 167c80476e4SDavid E. O'Brien dsetstack(); 168c80476e4SDavid E. O'Brien } 169c80476e4SDavid E. O'Brien else if (eq(vp, STRrecognize_only_executables)) { 170c80476e4SDavid E. O'Brien tw_cmd_free(); 171c80476e4SDavid E. O'Brien } 1726767bd61SMark Peek else if (eq(vp, STRkillring)) { 1736767bd61SMark Peek SetKillRing(getn(varval(vp))); 1746767bd61SMark Peek } 175c80476e4SDavid E. O'Brien #ifndef HAVENOUTMP 176c80476e4SDavid E. O'Brien else if (eq(vp, STRwatch)) { 177c80476e4SDavid E. O'Brien resetwatch(); 178c80476e4SDavid E. O'Brien } 179c80476e4SDavid E. O'Brien #endif /* HAVENOUTMP */ 180c80476e4SDavid E. O'Brien else if (eq(vp, STRimplicitcd)) { 181c80476e4SDavid E. O'Brien implicit_cd = ((eq(varval(vp), STRverbose)) ? 2 : 1); 182c80476e4SDavid E. O'Brien } 183c80476e4SDavid E. O'Brien #ifdef COLOR_LS_F 184c80476e4SDavid E. O'Brien else if (eq(vp, STRcolor)) { 185c80476e4SDavid E. O'Brien set_color_context(); 186c80476e4SDavid E. O'Brien } 187c80476e4SDavid E. O'Brien #endif /* COLOR_LS_F */ 188c80476e4SDavid E. O'Brien #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE) 189c80476e4SDavid E. O'Brien else if(eq(vp, CHECK_MBYTEVAR) || eq(vp, STRnokanji)) { 190c80476e4SDavid E. O'Brien update_dspmbyte_vars(); 191c80476e4SDavid E. O'Brien } 192c80476e4SDavid E. O'Brien #endif 1933b6eaa7bSAndrey A. Chernov #ifdef NLS_CATALOGS 1943b6eaa7bSAndrey A. Chernov else if (eq(vp, STRcatalog)) { 1953b6eaa7bSAndrey A. Chernov (void) catclose(catd); 1963b6eaa7bSAndrey A. Chernov nlsinit(); 1973b6eaa7bSAndrey A. Chernov } 19829301572SMark Peek #if defined(FILEC) && defined(TIOCSTI) 19929301572SMark Peek else if (eq(vp, STRfilec)) 20029301572SMark Peek filec = 1; 20129301572SMark Peek #endif 2023b6eaa7bSAndrey A. Chernov #endif /* NLS_CATALOGS */ 203c80476e4SDavid E. O'Brien } 204c80476e4SDavid E. O'Brien 205c80476e4SDavid E. O'Brien 206c80476e4SDavid E. O'Brien /*ARGSUSED*/ 207c80476e4SDavid E. O'Brien void 208c80476e4SDavid E. O'Brien doset(v, c) 209c80476e4SDavid E. O'Brien register Char **v; 210c80476e4SDavid E. O'Brien struct command *c; 211c80476e4SDavid E. O'Brien { 212c80476e4SDavid E. O'Brien register Char *p; 213c80476e4SDavid E. O'Brien Char *vp, op; 214c80476e4SDavid E. O'Brien Char **vecp; 215c80476e4SDavid E. O'Brien bool hadsub; 216c80476e4SDavid E. O'Brien int subscr; 217c80476e4SDavid E. O'Brien int flags = VAR_READWRITE; 218c80476e4SDavid E. O'Brien bool first_match = 0; 219c80476e4SDavid E. O'Brien bool last_match = 0; 220c80476e4SDavid E. O'Brien bool changed = 0; 221c80476e4SDavid E. O'Brien 222c80476e4SDavid E. O'Brien USE(c); 223c80476e4SDavid E. O'Brien v++; 224c80476e4SDavid E. O'Brien do { 225c80476e4SDavid E. O'Brien changed = 0; 226c80476e4SDavid E. O'Brien /* 227c80476e4SDavid E. O'Brien * Readonly addition From: Tim P. Starrin <noid@cyborg.larc.nasa.gov> 228c80476e4SDavid E. O'Brien */ 229c80476e4SDavid E. O'Brien if (*v && eq(*v, STRmr)) { 230c80476e4SDavid E. O'Brien flags = VAR_READONLY; 231c80476e4SDavid E. O'Brien v++; 232c80476e4SDavid E. O'Brien changed = 1; 233c80476e4SDavid E. O'Brien } 234c80476e4SDavid E. O'Brien if (*v && eq(*v, STRmf) && !last_match) { 235c80476e4SDavid E. O'Brien first_match = 1; 236c80476e4SDavid E. O'Brien v++; 237c80476e4SDavid E. O'Brien changed = 1; 238c80476e4SDavid E. O'Brien } 239c80476e4SDavid E. O'Brien if (*v && eq(*v, STRml) && !first_match) { 240c80476e4SDavid E. O'Brien last_match = 1; 241c80476e4SDavid E. O'Brien v++; 242c80476e4SDavid E. O'Brien changed = 1; 243c80476e4SDavid E. O'Brien } 244c80476e4SDavid E. O'Brien } while(changed); 245c80476e4SDavid E. O'Brien p = *v++; 246c80476e4SDavid E. O'Brien if (p == 0) { 247c80476e4SDavid E. O'Brien plist(&shvhed, flags); 248c80476e4SDavid E. O'Brien return; 249c80476e4SDavid E. O'Brien } 250c80476e4SDavid E. O'Brien do { 251c80476e4SDavid E. O'Brien hadsub = 0; 252c80476e4SDavid E. O'Brien vp = p; 253c80476e4SDavid E. O'Brien if (letter(*p)) 254c80476e4SDavid E. O'Brien for (; alnum(*p); p++) 255c80476e4SDavid E. O'Brien continue; 256c80476e4SDavid E. O'Brien if (vp == p || !letter(*vp)) 257c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_VARBEGIN); 258c80476e4SDavid E. O'Brien if ((p - vp) > MAXVARLEN) { 259c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_VARTOOLONG); 260c80476e4SDavid E. O'Brien return; 261c80476e4SDavid E. O'Brien } 262c80476e4SDavid E. O'Brien if (*p == '[') { 263c80476e4SDavid E. O'Brien hadsub++; 264c80476e4SDavid E. O'Brien p = getinx(p, &subscr); 265c80476e4SDavid E. O'Brien } 266c80476e4SDavid E. O'Brien if ((op = *p) != 0) { 267c80476e4SDavid E. O'Brien *p++ = 0; 268c80476e4SDavid E. O'Brien if (*p == 0 && *v && **v == '(') 269c80476e4SDavid E. O'Brien p = *v++; 270c80476e4SDavid E. O'Brien } 271c80476e4SDavid E. O'Brien else if (*v && eq(*v, STRequal)) { 272c80476e4SDavid E. O'Brien op = '=', v++; 273c80476e4SDavid E. O'Brien if (*v) 274c80476e4SDavid E. O'Brien p = *v++; 275c80476e4SDavid E. O'Brien } 276c80476e4SDavid E. O'Brien if (op && op != '=') 277c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_SYNTAX); 278c80476e4SDavid E. O'Brien if (eq(p, STRLparen)) { 279c80476e4SDavid E. O'Brien register Char **e = v; 280c80476e4SDavid E. O'Brien 281c80476e4SDavid E. O'Brien if (hadsub) 282c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_SYNTAX); 283c80476e4SDavid E. O'Brien for (;;) { 284c80476e4SDavid E. O'Brien if (!*e) 285c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_MISSING, ')'); 286c80476e4SDavid E. O'Brien if (**e == ')') 287c80476e4SDavid E. O'Brien break; 288c80476e4SDavid E. O'Brien e++; 289c80476e4SDavid E. O'Brien } 290c80476e4SDavid E. O'Brien p = *e; 291c80476e4SDavid E. O'Brien *e = 0; 292c80476e4SDavid E. O'Brien vecp = saveblk(v); 293c80476e4SDavid E. O'Brien if (first_match) 294c80476e4SDavid E. O'Brien flags |= VAR_FIRST; 295c80476e4SDavid E. O'Brien else if (last_match) 296c80476e4SDavid E. O'Brien flags |= VAR_LAST; 297c80476e4SDavid E. O'Brien 298c80476e4SDavid E. O'Brien set1(vp, vecp, &shvhed, flags); 299c80476e4SDavid E. O'Brien *e = p; 300c80476e4SDavid E. O'Brien v = e + 1; 301c80476e4SDavid E. O'Brien } 302c80476e4SDavid E. O'Brien else if (hadsub) 303c80476e4SDavid E. O'Brien asx(vp, subscr, Strsave(p)); 304c80476e4SDavid E. O'Brien else 305c80476e4SDavid E. O'Brien set(vp, Strsave(p), flags); 306c80476e4SDavid E. O'Brien update_vars(vp); 307c80476e4SDavid E. O'Brien } while ((p = *v++) != NULL); 308c80476e4SDavid E. O'Brien } 309c80476e4SDavid E. O'Brien 310c80476e4SDavid E. O'Brien static Char * 311c80476e4SDavid E. O'Brien getinx(cp, ip) 312c80476e4SDavid E. O'Brien register Char *cp; 313c80476e4SDavid E. O'Brien register int *ip; 314c80476e4SDavid E. O'Brien { 315c80476e4SDavid E. O'Brien *ip = 0; 316c80476e4SDavid E. O'Brien *cp++ = 0; 317c80476e4SDavid E. O'Brien while (*cp && Isdigit(*cp)) 318c80476e4SDavid E. O'Brien *ip = *ip * 10 + *cp++ - '0'; 319c80476e4SDavid E. O'Brien if (*cp++ != ']') 320c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_SUBSCRIPT); 321c80476e4SDavid E. O'Brien return (cp); 322c80476e4SDavid E. O'Brien } 323c80476e4SDavid E. O'Brien 324c80476e4SDavid E. O'Brien static void 325c80476e4SDavid E. O'Brien asx(vp, subscr, p) 326c80476e4SDavid E. O'Brien Char *vp; 327c80476e4SDavid E. O'Brien int subscr; 328c80476e4SDavid E. O'Brien Char *p; 329c80476e4SDavid E. O'Brien { 330c80476e4SDavid E. O'Brien register struct varent *v = getvx(vp, subscr); 331c80476e4SDavid E. O'Brien 332c80476e4SDavid E. O'Brien if (v->v_flags & VAR_READONLY) 333c80476e4SDavid E. O'Brien stderror(ERR_READONLY|ERR_NAME, v->v_name); 334c80476e4SDavid E. O'Brien xfree((ptr_t) v->vec[subscr - 1]); 335c80476e4SDavid E. O'Brien v->vec[subscr - 1] = globone(p, G_APPEND); 336c80476e4SDavid E. O'Brien } 337c80476e4SDavid E. O'Brien 338c80476e4SDavid E. O'Brien static struct varent * 339c80476e4SDavid E. O'Brien getvx(vp, subscr) 340c80476e4SDavid E. O'Brien Char *vp; 341c80476e4SDavid E. O'Brien int subscr; 342c80476e4SDavid E. O'Brien { 343c80476e4SDavid E. O'Brien register struct varent *v = adrof(vp); 344c80476e4SDavid E. O'Brien 345c80476e4SDavid E. O'Brien if (v == 0) 346c80476e4SDavid E. O'Brien udvar(vp); 347c80476e4SDavid E. O'Brien if (subscr < 1 || subscr > blklen(v->vec)) 348c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_RANGE); 349c80476e4SDavid E. O'Brien return (v); 350c80476e4SDavid E. O'Brien } 351c80476e4SDavid E. O'Brien 352c80476e4SDavid E. O'Brien /*ARGSUSED*/ 353c80476e4SDavid E. O'Brien void 354c80476e4SDavid E. O'Brien dolet(v, dummy) 355c80476e4SDavid E. O'Brien Char **v; 356c80476e4SDavid E. O'Brien struct command *dummy; 357c80476e4SDavid E. O'Brien { 358c80476e4SDavid E. O'Brien register Char *p; 359c80476e4SDavid E. O'Brien Char *vp, c, op; 360c80476e4SDavid E. O'Brien bool hadsub; 361c80476e4SDavid E. O'Brien int subscr; 362c80476e4SDavid E. O'Brien 363c80476e4SDavid E. O'Brien USE(dummy); 364c80476e4SDavid E. O'Brien v++; 365c80476e4SDavid E. O'Brien p = *v++; 366c80476e4SDavid E. O'Brien if (p == 0) { 367c80476e4SDavid E. O'Brien prvars(); 368c80476e4SDavid E. O'Brien return; 369c80476e4SDavid E. O'Brien } 370c80476e4SDavid E. O'Brien do { 371c80476e4SDavid E. O'Brien hadsub = 0; 372c80476e4SDavid E. O'Brien vp = p; 373c80476e4SDavid E. O'Brien if (letter(*p)) 374c80476e4SDavid E. O'Brien for (; alnum(*p); p++) 375c80476e4SDavid E. O'Brien continue; 376c80476e4SDavid E. O'Brien if (vp == p || !letter(*vp)) 377c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_VARBEGIN); 378c80476e4SDavid E. O'Brien if ((p - vp) > MAXVARLEN) 379c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_VARTOOLONG); 380c80476e4SDavid E. O'Brien if (*p == '[') { 381c80476e4SDavid E. O'Brien hadsub++; 382c80476e4SDavid E. O'Brien p = getinx(p, &subscr); 383c80476e4SDavid E. O'Brien } 384c80476e4SDavid E. O'Brien if (*p == 0 && *v) 385c80476e4SDavid E. O'Brien p = *v++; 386c80476e4SDavid E. O'Brien if ((op = *p) != 0) 387c80476e4SDavid E. O'Brien *p++ = 0; 388c80476e4SDavid E. O'Brien else 389c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_ASSIGN); 390c80476e4SDavid E. O'Brien 391c80476e4SDavid E. O'Brien /* 392c80476e4SDavid E. O'Brien * if there is no expression after the '=' then print a "Syntax Error" 393c80476e4SDavid E. O'Brien * message - strike 394c80476e4SDavid E. O'Brien */ 395c80476e4SDavid E. O'Brien if (*p == '\0' && *v == NULL) 396c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_ASSIGN); 397c80476e4SDavid E. O'Brien 398c80476e4SDavid E. O'Brien vp = Strsave(vp); 399c80476e4SDavid E. O'Brien if (op == '=') { 400c80476e4SDavid E. O'Brien c = '='; 401c80476e4SDavid E. O'Brien p = xset(p, &v); 402c80476e4SDavid E. O'Brien } 403c80476e4SDavid E. O'Brien else { 404c80476e4SDavid E. O'Brien c = *p++; 405c80476e4SDavid E. O'Brien if (any("+-", c)) { 406c80476e4SDavid E. O'Brien if (c != op || *p) 407c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_UNKNOWNOP); 408c80476e4SDavid E. O'Brien p = Strsave(STR1); 409c80476e4SDavid E. O'Brien } 410c80476e4SDavid E. O'Brien else { 411c80476e4SDavid E. O'Brien if (any("<>", op)) { 412c80476e4SDavid E. O'Brien if (c != op) 413c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_UNKNOWNOP); 414c80476e4SDavid E. O'Brien c = *p++; 415c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_SYNTAX); 416c80476e4SDavid E. O'Brien } 417c80476e4SDavid E. O'Brien if (c != '=') 418c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_UNKNOWNOP); 419c80476e4SDavid E. O'Brien p = xset(p, &v); 420c80476e4SDavid E. O'Brien } 421c80476e4SDavid E. O'Brien } 422c80476e4SDavid E. O'Brien if (op == '=') { 423c80476e4SDavid E. O'Brien if (hadsub) 424c80476e4SDavid E. O'Brien asx(vp, subscr, p); 425c80476e4SDavid E. O'Brien else 426c80476e4SDavid E. O'Brien set(vp, p, VAR_READWRITE); 427c80476e4SDavid E. O'Brien } 428c80476e4SDavid E. O'Brien else if (hadsub) { 429c80476e4SDavid E. O'Brien struct varent *gv = getvx(vp, subscr); 430c80476e4SDavid E. O'Brien 431c80476e4SDavid E. O'Brien asx(vp, subscr, operate(op, gv->vec[subscr - 1], p)); 432c80476e4SDavid E. O'Brien } 433c80476e4SDavid E. O'Brien else 434c80476e4SDavid E. O'Brien set(vp, operate(op, varval(vp), p), VAR_READWRITE); 435c80476e4SDavid E. O'Brien update_vars(vp); 436c80476e4SDavid E. O'Brien xfree((ptr_t) vp); 437c80476e4SDavid E. O'Brien if (c != '=') 438c80476e4SDavid E. O'Brien xfree((ptr_t) p); 439c80476e4SDavid E. O'Brien } while ((p = *v++) != NULL); 440c80476e4SDavid E. O'Brien } 441c80476e4SDavid E. O'Brien 442c80476e4SDavid E. O'Brien static Char * 443c80476e4SDavid E. O'Brien xset(cp, vp) 444c80476e4SDavid E. O'Brien Char *cp, ***vp; 445c80476e4SDavid E. O'Brien { 446c80476e4SDavid E. O'Brien register Char *dp; 447c80476e4SDavid E. O'Brien 448c80476e4SDavid E. O'Brien if (*cp) { 449c80476e4SDavid E. O'Brien dp = Strsave(cp); 450c80476e4SDavid E. O'Brien --(*vp); 451c80476e4SDavid E. O'Brien xfree((ptr_t) ** vp); 452c80476e4SDavid E. O'Brien **vp = dp; 453c80476e4SDavid E. O'Brien } 454c80476e4SDavid E. O'Brien return (putn(expr(vp))); 455c80476e4SDavid E. O'Brien } 456c80476e4SDavid E. O'Brien 457c80476e4SDavid E. O'Brien static Char * 458c80476e4SDavid E. O'Brien operate(op, vp, p) 459c80476e4SDavid E. O'Brien int op; 460c80476e4SDavid E. O'Brien Char *vp, *p; 461c80476e4SDavid E. O'Brien { 462c80476e4SDavid E. O'Brien Char opr[2]; 463c80476e4SDavid E. O'Brien Char *vec[5]; 464c80476e4SDavid E. O'Brien register Char **v = vec; 465c80476e4SDavid E. O'Brien Char **vecp = v; 466c80476e4SDavid E. O'Brien register int i; 467c80476e4SDavid E. O'Brien 468c80476e4SDavid E. O'Brien if (op != '=') { 469c80476e4SDavid E. O'Brien if (*vp) 470c80476e4SDavid E. O'Brien *v++ = vp; 471c80476e4SDavid E. O'Brien opr[0] = (Char) op; 472c80476e4SDavid E. O'Brien opr[1] = 0; 473c80476e4SDavid E. O'Brien *v++ = opr; 474c80476e4SDavid E. O'Brien if (op == '<' || op == '>') 475c80476e4SDavid E. O'Brien *v++ = opr; 476c80476e4SDavid E. O'Brien } 477c80476e4SDavid E. O'Brien *v++ = p; 478c80476e4SDavid E. O'Brien *v++ = 0; 479c80476e4SDavid E. O'Brien i = expr(&vecp); 480c80476e4SDavid E. O'Brien if (*vecp) 481c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_EXPRESSION); 482c80476e4SDavid E. O'Brien return (putn(i)); 483c80476e4SDavid E. O'Brien } 484c80476e4SDavid E. O'Brien 485c80476e4SDavid E. O'Brien static Char *putp, nbuf[50]; 486c80476e4SDavid E. O'Brien 487c80476e4SDavid E. O'Brien Char * 488c80476e4SDavid E. O'Brien putn(n) 489c80476e4SDavid E. O'Brien register int n; 490c80476e4SDavid E. O'Brien { 491c80476e4SDavid E. O'Brien int num; 492c80476e4SDavid E. O'Brien 493c80476e4SDavid E. O'Brien putp = nbuf; 494c80476e4SDavid E. O'Brien if (n < 0) { 495c80476e4SDavid E. O'Brien n = -n; 496c80476e4SDavid E. O'Brien *putp++ = '-'; 497c80476e4SDavid E. O'Brien } 498c80476e4SDavid E. O'Brien num = 2; /* confuse lint */ 499c80476e4SDavid E. O'Brien if (sizeof(int) == num && ((unsigned int) n) == 0x8000) { 500c80476e4SDavid E. O'Brien *putp++ = '3'; 501c80476e4SDavid E. O'Brien n = 2768; 502c80476e4SDavid E. O'Brien #ifdef pdp11 503c80476e4SDavid E. O'Brien } 504c80476e4SDavid E. O'Brien #else /* !pdp11 */ 505c80476e4SDavid E. O'Brien } 506c80476e4SDavid E. O'Brien else { 507c80476e4SDavid E. O'Brien num = 4; /* confuse lint */ 508c80476e4SDavid E. O'Brien if (sizeof(int) == num && ((unsigned int) n) == 0x80000000) { 509c80476e4SDavid E. O'Brien *putp++ = '2'; 510c80476e4SDavid E. O'Brien n = 147483648; 511c80476e4SDavid E. O'Brien } 512c80476e4SDavid E. O'Brien } 513c80476e4SDavid E. O'Brien #endif /* pdp11 */ 514c80476e4SDavid E. O'Brien putn1(n); 515c80476e4SDavid E. O'Brien *putp = 0; 516c80476e4SDavid E. O'Brien return (Strsave(nbuf)); 517c80476e4SDavid E. O'Brien } 518c80476e4SDavid E. O'Brien 519c80476e4SDavid E. O'Brien static void 520c80476e4SDavid E. O'Brien putn1(n) 521c80476e4SDavid E. O'Brien register int n; 522c80476e4SDavid E. O'Brien { 523c80476e4SDavid E. O'Brien if (n > 9) 524c80476e4SDavid E. O'Brien putn1(n / 10); 525c80476e4SDavid E. O'Brien *putp++ = n % 10 + '0'; 526c80476e4SDavid E. O'Brien } 527c80476e4SDavid E. O'Brien 528c80476e4SDavid E. O'Brien int 529c80476e4SDavid E. O'Brien getn(cp) 530c80476e4SDavid E. O'Brien register Char *cp; 531c80476e4SDavid E. O'Brien { 532c80476e4SDavid E. O'Brien register int n; 533c80476e4SDavid E. O'Brien int sign; 534c80476e4SDavid E. O'Brien 535c80476e4SDavid E. O'Brien if (!cp) /* PWP: extra error checking */ 536c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_BADNUM); 537c80476e4SDavid E. O'Brien 538c80476e4SDavid E. O'Brien sign = 0; 539c80476e4SDavid E. O'Brien if (cp[0] == '+' && cp[1]) 540c80476e4SDavid E. O'Brien cp++; 541c80476e4SDavid E. O'Brien if (*cp == '-') { 542c80476e4SDavid E. O'Brien sign++; 543c80476e4SDavid E. O'Brien cp++; 544c80476e4SDavid E. O'Brien if (!Isdigit(*cp)) 545c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_BADNUM); 546c80476e4SDavid E. O'Brien } 547c80476e4SDavid E. O'Brien n = 0; 548c80476e4SDavid E. O'Brien while (Isdigit(*cp)) 549c80476e4SDavid E. O'Brien n = n * 10 + *cp++ - '0'; 550c80476e4SDavid E. O'Brien if (*cp) 551c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_BADNUM); 552c80476e4SDavid E. O'Brien return (sign ? -n : n); 553c80476e4SDavid E. O'Brien } 554c80476e4SDavid E. O'Brien 555c80476e4SDavid E. O'Brien Char * 556c80476e4SDavid E. O'Brien value1(var, head) 557c80476e4SDavid E. O'Brien Char *var; 558c80476e4SDavid E. O'Brien struct varent *head; 559c80476e4SDavid E. O'Brien { 560c80476e4SDavid E. O'Brien register struct varent *vp; 561c80476e4SDavid E. O'Brien 562c80476e4SDavid E. O'Brien if (!var || !head) /* PWP: extra error checking */ 563c80476e4SDavid E. O'Brien return (STRNULL); 564c80476e4SDavid E. O'Brien 565c80476e4SDavid E. O'Brien vp = adrof1(var, head); 56629301572SMark Peek return ((vp == NULL || vp->vec == NULL || vp->vec[0] == NULL) ? 56729301572SMark Peek STRNULL : vp->vec[0]); 568c80476e4SDavid E. O'Brien } 569c80476e4SDavid E. O'Brien 570c80476e4SDavid E. O'Brien static struct varent * 571c80476e4SDavid E. O'Brien madrof(pat, vp) 572c80476e4SDavid E. O'Brien Char *pat; 573c80476e4SDavid E. O'Brien register struct varent *vp; 574c80476e4SDavid E. O'Brien { 575c80476e4SDavid E. O'Brien register struct varent *vp1; 576c80476e4SDavid E. O'Brien 577c80476e4SDavid E. O'Brien for (vp = vp->v_left; vp; vp = vp->v_right) { 578c80476e4SDavid E. O'Brien if (vp->v_left && (vp1 = madrof(pat, vp)) != NULL) 579c80476e4SDavid E. O'Brien return vp1; 580c80476e4SDavid E. O'Brien if (Gmatch(vp->v_name, pat)) 581c80476e4SDavid E. O'Brien return vp; 582c80476e4SDavid E. O'Brien } 583c80476e4SDavid E. O'Brien return vp; 584c80476e4SDavid E. O'Brien } 585c80476e4SDavid E. O'Brien 586c80476e4SDavid E. O'Brien struct varent * 587c80476e4SDavid E. O'Brien adrof1(name, v) 588c80476e4SDavid E. O'Brien register Char *name; 589c80476e4SDavid E. O'Brien register struct varent *v; 590c80476e4SDavid E. O'Brien { 591c80476e4SDavid E. O'Brien int cmp; 592c80476e4SDavid E. O'Brien 593c80476e4SDavid E. O'Brien v = v->v_left; 594c80476e4SDavid E. O'Brien while (v && ((cmp = *name - *v->v_name) != 0 || 595c80476e4SDavid E. O'Brien (cmp = Strcmp(name, v->v_name)) != 0)) 596c80476e4SDavid E. O'Brien if (cmp < 0) 597c80476e4SDavid E. O'Brien v = v->v_left; 598c80476e4SDavid E. O'Brien else 599c80476e4SDavid E. O'Brien v = v->v_right; 600c80476e4SDavid E. O'Brien return v; 601c80476e4SDavid E. O'Brien } 602c80476e4SDavid E. O'Brien 603c80476e4SDavid E. O'Brien /* 604c80476e4SDavid E. O'Brien * The caller is responsible for putting value in a safe place 605c80476e4SDavid E. O'Brien */ 606c80476e4SDavid E. O'Brien void 607c80476e4SDavid E. O'Brien set(var, val, flags) 608c80476e4SDavid E. O'Brien Char *var, *val; 609c80476e4SDavid E. O'Brien int flags; 610c80476e4SDavid E. O'Brien { 611c80476e4SDavid E. O'Brien register Char **vec = (Char **) xmalloc((size_t) (2 * sizeof(Char **))); 612c80476e4SDavid E. O'Brien 613c80476e4SDavid E. O'Brien vec[0] = val; 614c80476e4SDavid E. O'Brien vec[1] = 0; 615c80476e4SDavid E. O'Brien set1(var, vec, &shvhed, flags); 616c80476e4SDavid E. O'Brien } 617c80476e4SDavid E. O'Brien 618c80476e4SDavid E. O'Brien void 619c80476e4SDavid E. O'Brien set1(var, vec, head, flags) 620c80476e4SDavid E. O'Brien Char *var, **vec; 621c80476e4SDavid E. O'Brien struct varent *head; 622c80476e4SDavid E. O'Brien int flags; 623c80476e4SDavid E. O'Brien { 624c80476e4SDavid E. O'Brien register Char **oldv = vec; 625c80476e4SDavid E. O'Brien 626c80476e4SDavid E. O'Brien if ((flags & VAR_NOGLOB) == 0) { 627c80476e4SDavid E. O'Brien gflag = 0; 628c80476e4SDavid E. O'Brien tglob(oldv); 629c80476e4SDavid E. O'Brien if (gflag) { 630c80476e4SDavid E. O'Brien vec = globall(oldv); 631c80476e4SDavid E. O'Brien if (vec == 0) { 632c80476e4SDavid E. O'Brien blkfree(oldv); 633c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_NOMATCH); 634c80476e4SDavid E. O'Brien return; 635c80476e4SDavid E. O'Brien } 636c80476e4SDavid E. O'Brien blkfree(oldv); 637c80476e4SDavid E. O'Brien gargv = 0; 638c80476e4SDavid E. O'Brien } 639c80476e4SDavid E. O'Brien } 640c80476e4SDavid E. O'Brien /* 641c80476e4SDavid E. O'Brien * Uniqueness addition from: Michael Veksler <mveksler@vnet.ibm.com> 642c80476e4SDavid E. O'Brien */ 643c80476e4SDavid E. O'Brien if ( flags & (VAR_FIRST | VAR_LAST) ) { 644c80476e4SDavid E. O'Brien /* 645c80476e4SDavid E. O'Brien * Code for -f (VAR_FIRST) and -l (VAR_LAST) options. 646c80476e4SDavid E. O'Brien * Method: 647c80476e4SDavid E. O'Brien * Delete all duplicate words leaving "holes" in the word array (vec). 648c80476e4SDavid E. O'Brien * Then remove the "holes", keeping the order of the words unchanged. 649c80476e4SDavid E. O'Brien */ 650c80476e4SDavid E. O'Brien if (vec && vec[0] && vec[1]) { /* more than one word ? */ 651c80476e4SDavid E. O'Brien int i, j; 652c80476e4SDavid E. O'Brien int num_items; 653c80476e4SDavid E. O'Brien 654c80476e4SDavid E. O'Brien for (num_items = 0; vec[num_items]; num_items++) 655c80476e4SDavid E. O'Brien continue; 656c80476e4SDavid E. O'Brien if (flags & VAR_FIRST) { 657c80476e4SDavid E. O'Brien /* delete duplications, keeping first occurance */ 658c80476e4SDavid E. O'Brien for (i = 1; i < num_items; i++) 659c80476e4SDavid E. O'Brien for (j = 0; j < i; j++) 660c80476e4SDavid E. O'Brien /* If have earlier identical item, remove i'th item */ 661c80476e4SDavid E. O'Brien if (vec[i] && vec[j] && Strcmp(vec[j], vec[i]) == 0) { 662c80476e4SDavid E. O'Brien free(vec[i]); 663c80476e4SDavid E. O'Brien vec[i] = NULL; 664c80476e4SDavid E. O'Brien break; 665c80476e4SDavid E. O'Brien } 666c80476e4SDavid E. O'Brien } else if (flags & VAR_LAST) { 667c80476e4SDavid E. O'Brien /* delete duplications, keeping last occurance */ 668c80476e4SDavid E. O'Brien for (i = 0; i < num_items - 1; i++) 669c80476e4SDavid E. O'Brien for (j = i + 1; j < num_items; j++) 670c80476e4SDavid E. O'Brien /* If have later identical item, remove i'th item */ 671c80476e4SDavid E. O'Brien if (vec[i] && vec[j] && Strcmp(vec[j], vec[i]) == 0) { 672c80476e4SDavid E. O'Brien /* remove identical item (the first) */ 673c80476e4SDavid E. O'Brien free(vec[i]); 674c80476e4SDavid E. O'Brien vec[i] = NULL; 675c80476e4SDavid E. O'Brien } 676c80476e4SDavid E. O'Brien } 677c80476e4SDavid E. O'Brien /* Compress items - remove empty items */ 678c80476e4SDavid E. O'Brien for (j = i = 0; i < num_items; i++) 679c80476e4SDavid E. O'Brien if (vec[i]) 680c80476e4SDavid E. O'Brien vec[j++] = vec[i]; 681c80476e4SDavid E. O'Brien 682c80476e4SDavid E. O'Brien /* NULL-fy remaining items */ 683c80476e4SDavid E. O'Brien for (; j < num_items; j++) 684c80476e4SDavid E. O'Brien vec[j] = NULL; 685c80476e4SDavid E. O'Brien } 686c80476e4SDavid E. O'Brien /* don't let the attribute propagate */ 687c80476e4SDavid E. O'Brien flags &= ~(VAR_FIRST|VAR_LAST); 688c80476e4SDavid E. O'Brien } 689c80476e4SDavid E. O'Brien setq(var, vec, head, flags); 690c80476e4SDavid E. O'Brien } 691c80476e4SDavid E. O'Brien 692c80476e4SDavid E. O'Brien 693c80476e4SDavid E. O'Brien void 694c80476e4SDavid E. O'Brien setq(name, vec, p, flags) 695c80476e4SDavid E. O'Brien Char *name, **vec; 696c80476e4SDavid E. O'Brien register struct varent *p; 697c80476e4SDavid E. O'Brien int flags; 698c80476e4SDavid E. O'Brien { 699c80476e4SDavid E. O'Brien register struct varent *c; 700c80476e4SDavid E. O'Brien register int f; 701c80476e4SDavid E. O'Brien 702c80476e4SDavid E. O'Brien f = 0; /* tree hangs off the header's left link */ 703c80476e4SDavid E. O'Brien while ((c = p->v_link[f]) != 0) { 704c80476e4SDavid E. O'Brien if ((f = *name - *c->v_name) == 0 && 705c80476e4SDavid E. O'Brien (f = Strcmp(name, c->v_name)) == 0) { 706c80476e4SDavid E. O'Brien if (c->v_flags & VAR_READONLY) 707c80476e4SDavid E. O'Brien stderror(ERR_READONLY|ERR_NAME, c->v_name); 708c80476e4SDavid E. O'Brien blkfree(c->vec); 709c80476e4SDavid E. O'Brien c->v_flags = flags; 710c80476e4SDavid E. O'Brien trim(c->vec = vec); 711c80476e4SDavid E. O'Brien return; 712c80476e4SDavid E. O'Brien } 713c80476e4SDavid E. O'Brien p = c; 714c80476e4SDavid E. O'Brien f = f > 0; 715c80476e4SDavid E. O'Brien } 716c80476e4SDavid E. O'Brien p->v_link[f] = c = (struct varent *) xmalloc((size_t)sizeof(struct varent)); 717c80476e4SDavid E. O'Brien c->v_name = Strsave(name); 718c80476e4SDavid E. O'Brien c->v_flags = flags; 719c80476e4SDavid E. O'Brien c->v_bal = 0; 720c80476e4SDavid E. O'Brien c->v_left = c->v_right = 0; 721c80476e4SDavid E. O'Brien c->v_parent = p; 722c80476e4SDavid E. O'Brien balance(p, f, 0); 723c80476e4SDavid E. O'Brien trim(c->vec = vec); 724c80476e4SDavid E. O'Brien } 725c80476e4SDavid E. O'Brien 726c80476e4SDavid E. O'Brien /*ARGSUSED*/ 727c80476e4SDavid E. O'Brien void 728c80476e4SDavid E. O'Brien unset(v, c) 729c80476e4SDavid E. O'Brien Char **v; 730c80476e4SDavid E. O'Brien struct command *c; 731c80476e4SDavid E. O'Brien { 732c80476e4SDavid E. O'Brien bool did_roe, did_edit; 733c80476e4SDavid E. O'Brien 734c80476e4SDavid E. O'Brien USE(c); 735c80476e4SDavid E. O'Brien did_roe = adrof(STRrecognize_only_executables) != NULL; 736c80476e4SDavid E. O'Brien did_edit = adrof(STRedit) != NULL; 737c80476e4SDavid E. O'Brien unset1(v, &shvhed); 73829301572SMark Peek 73929301572SMark Peek #if defined(FILEC) && defined(TIOCSTI) 74029301572SMark Peek if (adrof(STRfilec) == 0) 74129301572SMark Peek filec = 0; 74229301572SMark Peek #endif /* FILEC && TIOCSTI */ 74329301572SMark Peek 744c80476e4SDavid E. O'Brien if (adrof(STRhistchars) == 0) { 745c80476e4SDavid E. O'Brien HIST = '!'; 746c80476e4SDavid E. O'Brien HISTSUB = '^'; 747c80476e4SDavid E. O'Brien } 748b2d5d167SMark Peek if (adrof(STRignoreeof) == 0) 749b2d5d167SMark Peek numeof = 0; 750c80476e4SDavid E. O'Brien if (adrof(STRpromptchars) == 0) { 751c80476e4SDavid E. O'Brien PRCH = '>'; 752c80476e4SDavid E. O'Brien PRCHROOT = '#'; 753c80476e4SDavid E. O'Brien } 754c80476e4SDavid E. O'Brien if (adrof(STRhistlit) == 0) 755c80476e4SDavid E. O'Brien HistLit = 0; 756c80476e4SDavid E. O'Brien if (adrof(STRloginsh) == 0) 757c80476e4SDavid E. O'Brien loginsh = 0; 758c80476e4SDavid E. O'Brien if (adrof(STRwordchars) == 0) 759c80476e4SDavid E. O'Brien word_chars = STR_WORD_CHARS; 760c80476e4SDavid E. O'Brien if (adrof(STRedit) == 0) 761c80476e4SDavid E. O'Brien editing = 0; 762c80476e4SDavid E. O'Brien if (adrof(STRbackslash_quote) == 0) 763c80476e4SDavid E. O'Brien bslash_quote = 0; 764c80476e4SDavid E. O'Brien if (adrof(STRsymlinks) == 0) 765c80476e4SDavid E. O'Brien symlinks = 0; 766c80476e4SDavid E. O'Brien if (adrof(STRimplicitcd) == 0) 767c80476e4SDavid E. O'Brien implicit_cd = 0; 7686767bd61SMark Peek if (adrof(STRkillring) == 0) 7696767bd61SMark Peek SetKillRing(0); 770c80476e4SDavid E. O'Brien if (did_edit && noediting && adrof(STRedit) == 0) 771c80476e4SDavid E. O'Brien noediting = 0; 772c80476e4SDavid E. O'Brien if (did_roe && adrof(STRrecognize_only_executables) == 0) 773c80476e4SDavid E. O'Brien tw_cmd_free(); 774c80476e4SDavid E. O'Brien #ifdef COLOR_LS_F 775c80476e4SDavid E. O'Brien if (adrof(STRcolor) == 0) 776c80476e4SDavid E. O'Brien set_color_context(); 777c80476e4SDavid E. O'Brien #endif /* COLOR_LS_F */ 778c80476e4SDavid E. O'Brien #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE) 779c80476e4SDavid E. O'Brien update_dspmbyte_vars(); 780c80476e4SDavid E. O'Brien #endif 7813b6eaa7bSAndrey A. Chernov #ifdef NLS_CATALOGS 7823b6eaa7bSAndrey A. Chernov (void) catclose(catd); 7833b6eaa7bSAndrey A. Chernov nlsinit(); 7843b6eaa7bSAndrey A. Chernov #endif /* NLS_CATALOGS */ 785c80476e4SDavid E. O'Brien } 786c80476e4SDavid E. O'Brien 787c80476e4SDavid E. O'Brien void 788c80476e4SDavid E. O'Brien unset1(v, head) 789c80476e4SDavid E. O'Brien register Char *v[]; 790c80476e4SDavid E. O'Brien struct varent *head; 791c80476e4SDavid E. O'Brien { 792c80476e4SDavid E. O'Brien register struct varent *vp; 793c80476e4SDavid E. O'Brien register int cnt; 794c80476e4SDavid E. O'Brien 795c80476e4SDavid E. O'Brien while (*++v) { 796c80476e4SDavid E. O'Brien cnt = 0; 797c80476e4SDavid E. O'Brien while ((vp = madrof(*v, head)) != NULL) 798c80476e4SDavid E. O'Brien if (vp->v_flags & VAR_READONLY) 799c80476e4SDavid E. O'Brien stderror(ERR_READONLY|ERR_NAME, vp->v_name); 800c80476e4SDavid E. O'Brien else 801c80476e4SDavid E. O'Brien unsetv1(vp), cnt++; 802c80476e4SDavid E. O'Brien if (cnt == 0) 803c80476e4SDavid E. O'Brien setname(short2str(*v)); 804c80476e4SDavid E. O'Brien } 805c80476e4SDavid E. O'Brien } 806c80476e4SDavid E. O'Brien 807c80476e4SDavid E. O'Brien void 808c80476e4SDavid E. O'Brien unsetv(var) 809c80476e4SDavid E. O'Brien Char *var; 810c80476e4SDavid E. O'Brien { 811c80476e4SDavid E. O'Brien register struct varent *vp; 812c80476e4SDavid E. O'Brien 813c80476e4SDavid E. O'Brien if ((vp = adrof1(var, &shvhed)) == 0) 814c80476e4SDavid E. O'Brien udvar(var); 815c80476e4SDavid E. O'Brien unsetv1(vp); 816c80476e4SDavid E. O'Brien } 817c80476e4SDavid E. O'Brien 818c80476e4SDavid E. O'Brien static void 819c80476e4SDavid E. O'Brien unsetv1(p) 820c80476e4SDavid E. O'Brien register struct varent *p; 821c80476e4SDavid E. O'Brien { 822c80476e4SDavid E. O'Brien register struct varent *c, *pp; 823c80476e4SDavid E. O'Brien register int f; 824c80476e4SDavid E. O'Brien 825c80476e4SDavid E. O'Brien /* 826c80476e4SDavid E. O'Brien * Free associated memory first to avoid complications. 827c80476e4SDavid E. O'Brien */ 828c80476e4SDavid E. O'Brien blkfree(p->vec); 829c80476e4SDavid E. O'Brien xfree((ptr_t) p->v_name); 830c80476e4SDavid E. O'Brien /* 831c80476e4SDavid E. O'Brien * If p is missing one child, then we can move the other into where p is. 832c80476e4SDavid E. O'Brien * Otherwise, we find the predecessor of p, which is guaranteed to have no 833c80476e4SDavid E. O'Brien * right child, copy it into p, and move it's left child into it. 834c80476e4SDavid E. O'Brien */ 835c80476e4SDavid E. O'Brien if (p->v_right == 0) 836c80476e4SDavid E. O'Brien c = p->v_left; 837c80476e4SDavid E. O'Brien else if (p->v_left == 0) 838c80476e4SDavid E. O'Brien c = p->v_right; 839c80476e4SDavid E. O'Brien else { 840c80476e4SDavid E. O'Brien for (c = p->v_left; c->v_right; c = c->v_right) 841c80476e4SDavid E. O'Brien continue; 842c80476e4SDavid E. O'Brien p->v_name = c->v_name; 843c80476e4SDavid E. O'Brien p->v_flags = c->v_flags; 844c80476e4SDavid E. O'Brien p->vec = c->vec; 845c80476e4SDavid E. O'Brien p = c; 846c80476e4SDavid E. O'Brien c = p->v_left; 847c80476e4SDavid E. O'Brien } 848c80476e4SDavid E. O'Brien 849c80476e4SDavid E. O'Brien /* 850c80476e4SDavid E. O'Brien * Move c into where p is. 851c80476e4SDavid E. O'Brien */ 852c80476e4SDavid E. O'Brien pp = p->v_parent; 853c80476e4SDavid E. O'Brien f = pp->v_right == p; 854c80476e4SDavid E. O'Brien if ((pp->v_link[f] = c) != 0) 855c80476e4SDavid E. O'Brien c->v_parent = pp; 856c80476e4SDavid E. O'Brien /* 857c80476e4SDavid E. O'Brien * Free the deleted node, and rebalance. 858c80476e4SDavid E. O'Brien */ 859c80476e4SDavid E. O'Brien xfree((ptr_t) p); 860c80476e4SDavid E. O'Brien balance(pp, f, 1); 861c80476e4SDavid E. O'Brien } 862c80476e4SDavid E. O'Brien 863c80476e4SDavid E. O'Brien void 864c80476e4SDavid E. O'Brien setNS(cp) 865c80476e4SDavid E. O'Brien Char *cp; 866c80476e4SDavid E. O'Brien { 867c80476e4SDavid E. O'Brien set(cp, Strsave(STRNULL), VAR_READWRITE); 868c80476e4SDavid E. O'Brien } 869c80476e4SDavid E. O'Brien 870c80476e4SDavid E. O'Brien /*ARGSUSED*/ 871c80476e4SDavid E. O'Brien void 872c80476e4SDavid E. O'Brien shift(v, c) 873c80476e4SDavid E. O'Brien register Char **v; 874c80476e4SDavid E. O'Brien struct command *c; 875c80476e4SDavid E. O'Brien { 876c80476e4SDavid E. O'Brien register struct varent *argv; 877c80476e4SDavid E. O'Brien register Char *name; 878c80476e4SDavid E. O'Brien 879c80476e4SDavid E. O'Brien USE(c); 880c80476e4SDavid E. O'Brien v++; 881c80476e4SDavid E. O'Brien name = *v; 882c80476e4SDavid E. O'Brien if (name == 0) 883c80476e4SDavid E. O'Brien name = STRargv; 884c80476e4SDavid E. O'Brien else 885c80476e4SDavid E. O'Brien (void) strip(name); 886c80476e4SDavid E. O'Brien argv = adrof(name); 88729301572SMark Peek if (argv == NULL || argv->vec == NULL) 888c80476e4SDavid E. O'Brien udvar(name); 889c80476e4SDavid E. O'Brien if (argv->vec[0] == 0) 890c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_NOMORE); 891c80476e4SDavid E. O'Brien lshift(argv->vec, 1); 892c80476e4SDavid E. O'Brien update_vars(name); 893c80476e4SDavid E. O'Brien } 894c80476e4SDavid E. O'Brien 895c80476e4SDavid E. O'Brien static Char STRsep[2] = { PATHSEP, '\0' }; 896c80476e4SDavid E. O'Brien 897c80476e4SDavid E. O'Brien static void 898c80476e4SDavid E. O'Brien exportpath(val) 899c80476e4SDavid E. O'Brien Char **val; 900c80476e4SDavid E. O'Brien { 901c80476e4SDavid E. O'Brien Char *exppath; 902c80476e4SDavid E. O'Brien size_t exppath_size = BUFSIZE; 903c80476e4SDavid E. O'Brien exppath = (Char *)xmalloc(sizeof(Char)*exppath_size); 904c80476e4SDavid E. O'Brien 905c80476e4SDavid E. O'Brien exppath[0] = 0; 906c80476e4SDavid E. O'Brien if (val) 907c80476e4SDavid E. O'Brien while (*val) { 908c80476e4SDavid E. O'Brien while (Strlen(*val) + Strlen(exppath) + 2 > exppath_size) { 909c80476e4SDavid E. O'Brien if ((exppath 910c80476e4SDavid E. O'Brien = (Char *)xrealloc(exppath, sizeof(Char)*(exppath_size *= 2))) 911c80476e4SDavid E. O'Brien == NULL) { 912c80476e4SDavid E. O'Brien xprintf(CGETS(18, 1, 913c80476e4SDavid E. O'Brien "Warning: ridiculously long PATH truncated\n")); 914c80476e4SDavid E. O'Brien break; 915c80476e4SDavid E. O'Brien } 916c80476e4SDavid E. O'Brien } 917c80476e4SDavid E. O'Brien (void) Strcat(exppath, *val++); 918c80476e4SDavid E. O'Brien if (*val == 0 || eq(*val, STRRparen)) 919c80476e4SDavid E. O'Brien break; 920c80476e4SDavid E. O'Brien (void) Strcat(exppath, STRsep); 921c80476e4SDavid E. O'Brien } 922c80476e4SDavid E. O'Brien tsetenv(STRKPATH, exppath); 923c80476e4SDavid E. O'Brien free(exppath); 924c80476e4SDavid E. O'Brien } 925c80476e4SDavid E. O'Brien 926c80476e4SDavid E. O'Brien #ifndef lint 927c80476e4SDavid E. O'Brien /* 928c80476e4SDavid E. O'Brien * Lint thinks these have null effect 929c80476e4SDavid E. O'Brien */ 930c80476e4SDavid E. O'Brien /* macros to do single rotations on node p */ 931c80476e4SDavid E. O'Brien # define rright(p) (\ 932c80476e4SDavid E. O'Brien t = (p)->v_left,\ 933c80476e4SDavid E. O'Brien (t)->v_parent = (p)->v_parent,\ 934c80476e4SDavid E. O'Brien (((p)->v_left = t->v_right) != NULL) ?\ 935c80476e4SDavid E. O'Brien (t->v_right->v_parent = (p)) : 0,\ 936c80476e4SDavid E. O'Brien (t->v_right = (p))->v_parent = t,\ 937c80476e4SDavid E. O'Brien (p) = t) 938c80476e4SDavid E. O'Brien # define rleft(p) (\ 939c80476e4SDavid E. O'Brien t = (p)->v_right,\ 940c80476e4SDavid E. O'Brien ((t)->v_parent = (p)->v_parent,\ 941c80476e4SDavid E. O'Brien ((p)->v_right = t->v_left) != NULL) ? \ 942c80476e4SDavid E. O'Brien (t->v_left->v_parent = (p)) : 0,\ 943c80476e4SDavid E. O'Brien (t->v_left = (p))->v_parent = t,\ 944c80476e4SDavid E. O'Brien (p) = t) 945c80476e4SDavid E. O'Brien #else 946c80476e4SDavid E. O'Brien static struct varent * 947c80476e4SDavid E. O'Brien rleft(p) 948c80476e4SDavid E. O'Brien struct varent *p; 949c80476e4SDavid E. O'Brien { 950c80476e4SDavid E. O'Brien return (p); 951c80476e4SDavid E. O'Brien } 952c80476e4SDavid E. O'Brien static struct varent * 953c80476e4SDavid E. O'Brien rright(p) 954c80476e4SDavid E. O'Brien struct varent *p; 955c80476e4SDavid E. O'Brien { 956c80476e4SDavid E. O'Brien return (p); 957c80476e4SDavid E. O'Brien } 958c80476e4SDavid E. O'Brien 959c80476e4SDavid E. O'Brien #endif /* ! lint */ 960c80476e4SDavid E. O'Brien 961c80476e4SDavid E. O'Brien 962c80476e4SDavid E. O'Brien /* 963c80476e4SDavid E. O'Brien * Rebalance a tree, starting at p and up. 964c80476e4SDavid E. O'Brien * F == 0 means we've come from p's left child. 965c80476e4SDavid E. O'Brien * D == 1 means we've just done a delete, otherwise an insert. 966c80476e4SDavid E. O'Brien */ 967c80476e4SDavid E. O'Brien static void 968c80476e4SDavid E. O'Brien balance(p, f, d) 969c80476e4SDavid E. O'Brien register struct varent *p; 970c80476e4SDavid E. O'Brien register int f, d; 971c80476e4SDavid E. O'Brien { 972c80476e4SDavid E. O'Brien register struct varent *pp; 973c80476e4SDavid E. O'Brien 974c80476e4SDavid E. O'Brien #ifndef lint 975c80476e4SDavid E. O'Brien register struct varent *t; /* used by the rotate macros */ 976c80476e4SDavid E. O'Brien #endif /* !lint */ 977c80476e4SDavid E. O'Brien register int ff; 978c80476e4SDavid E. O'Brien #ifdef lint 979c80476e4SDavid E. O'Brien ff = 0; /* Sun's lint is dumb! */ 980c80476e4SDavid E. O'Brien #endif 981c80476e4SDavid E. O'Brien 982c80476e4SDavid E. O'Brien /* 983c80476e4SDavid E. O'Brien * Ok, from here on, p is the node we're operating on; pp is it's parent; f 984c80476e4SDavid E. O'Brien * is the branch of p from which we have come; ff is the branch of pp which 985c80476e4SDavid E. O'Brien * is p. 986c80476e4SDavid E. O'Brien */ 987c80476e4SDavid E. O'Brien for (; (pp = p->v_parent) != 0; p = pp, f = ff) { 988c80476e4SDavid E. O'Brien ff = pp->v_right == p; 989c80476e4SDavid E. O'Brien if (f ^ d) { /* right heavy */ 990c80476e4SDavid E. O'Brien switch (p->v_bal) { 991c80476e4SDavid E. O'Brien case -1: /* was left heavy */ 992c80476e4SDavid E. O'Brien p->v_bal = 0; 993c80476e4SDavid E. O'Brien break; 994c80476e4SDavid E. O'Brien case 0: /* was balanced */ 995c80476e4SDavid E. O'Brien p->v_bal = 1; 996c80476e4SDavid E. O'Brien break; 997c80476e4SDavid E. O'Brien case 1: /* was already right heavy */ 998c80476e4SDavid E. O'Brien switch (p->v_right->v_bal) { 999c80476e4SDavid E. O'Brien case 1: /* sigle rotate */ 1000c80476e4SDavid E. O'Brien pp->v_link[ff] = rleft(p); 1001c80476e4SDavid E. O'Brien p->v_left->v_bal = 0; 1002c80476e4SDavid E. O'Brien p->v_bal = 0; 1003c80476e4SDavid E. O'Brien break; 1004c80476e4SDavid E. O'Brien case 0: /* single rotate */ 1005c80476e4SDavid E. O'Brien pp->v_link[ff] = rleft(p); 1006c80476e4SDavid E. O'Brien p->v_left->v_bal = 1; 1007c80476e4SDavid E. O'Brien p->v_bal = -1; 1008c80476e4SDavid E. O'Brien break; 1009c80476e4SDavid E. O'Brien case -1: /* double rotate */ 1010c80476e4SDavid E. O'Brien (void) rright(p->v_right); 1011c80476e4SDavid E. O'Brien pp->v_link[ff] = rleft(p); 1012c80476e4SDavid E. O'Brien p->v_left->v_bal = 1013c80476e4SDavid E. O'Brien p->v_bal < 1 ? 0 : -1; 1014c80476e4SDavid E. O'Brien p->v_right->v_bal = 1015c80476e4SDavid E. O'Brien p->v_bal > -1 ? 0 : 1; 1016c80476e4SDavid E. O'Brien p->v_bal = 0; 1017c80476e4SDavid E. O'Brien break; 1018c80476e4SDavid E. O'Brien default: 1019c80476e4SDavid E. O'Brien break; 1020c80476e4SDavid E. O'Brien } 1021c80476e4SDavid E. O'Brien break; 1022c80476e4SDavid E. O'Brien default: 1023c80476e4SDavid E. O'Brien break; 1024c80476e4SDavid E. O'Brien } 1025c80476e4SDavid E. O'Brien } 1026c80476e4SDavid E. O'Brien else { /* left heavy */ 1027c80476e4SDavid E. O'Brien switch (p->v_bal) { 1028c80476e4SDavid E. O'Brien case 1: /* was right heavy */ 1029c80476e4SDavid E. O'Brien p->v_bal = 0; 1030c80476e4SDavid E. O'Brien break; 1031c80476e4SDavid E. O'Brien case 0: /* was balanced */ 1032c80476e4SDavid E. O'Brien p->v_bal = -1; 1033c80476e4SDavid E. O'Brien break; 1034c80476e4SDavid E. O'Brien case -1: /* was already left heavy */ 1035c80476e4SDavid E. O'Brien switch (p->v_left->v_bal) { 1036c80476e4SDavid E. O'Brien case -1: /* single rotate */ 1037c80476e4SDavid E. O'Brien pp->v_link[ff] = rright(p); 1038c80476e4SDavid E. O'Brien p->v_right->v_bal = 0; 1039c80476e4SDavid E. O'Brien p->v_bal = 0; 1040c80476e4SDavid E. O'Brien break; 1041c80476e4SDavid E. O'Brien case 0: /* signle rotate */ 1042c80476e4SDavid E. O'Brien pp->v_link[ff] = rright(p); 1043c80476e4SDavid E. O'Brien p->v_right->v_bal = -1; 1044c80476e4SDavid E. O'Brien p->v_bal = 1; 1045c80476e4SDavid E. O'Brien break; 1046c80476e4SDavid E. O'Brien case 1: /* double rotate */ 1047c80476e4SDavid E. O'Brien (void) rleft(p->v_left); 1048c80476e4SDavid E. O'Brien pp->v_link[ff] = rright(p); 1049c80476e4SDavid E. O'Brien p->v_left->v_bal = 1050c80476e4SDavid E. O'Brien p->v_bal < 1 ? 0 : -1; 1051c80476e4SDavid E. O'Brien p->v_right->v_bal = 1052c80476e4SDavid E. O'Brien p->v_bal > -1 ? 0 : 1; 1053c80476e4SDavid E. O'Brien p->v_bal = 0; 1054c80476e4SDavid E. O'Brien break; 1055c80476e4SDavid E. O'Brien default: 1056c80476e4SDavid E. O'Brien break; 1057c80476e4SDavid E. O'Brien } 1058c80476e4SDavid E. O'Brien break; 1059c80476e4SDavid E. O'Brien default: 1060c80476e4SDavid E. O'Brien break; 1061c80476e4SDavid E. O'Brien } 1062c80476e4SDavid E. O'Brien } 1063c80476e4SDavid E. O'Brien /* 1064c80476e4SDavid E. O'Brien * If from insert, then we terminate when p is balanced. If from 1065c80476e4SDavid E. O'Brien * delete, then we terminate when p is unbalanced. 1066c80476e4SDavid E. O'Brien */ 1067c80476e4SDavid E. O'Brien if ((p->v_bal == 0) ^ d) 1068c80476e4SDavid E. O'Brien break; 1069c80476e4SDavid E. O'Brien } 1070c80476e4SDavid E. O'Brien } 1071c80476e4SDavid E. O'Brien 1072c80476e4SDavid E. O'Brien void 1073c80476e4SDavid E. O'Brien plist(p, what) 1074c80476e4SDavid E. O'Brien register struct varent *p; 1075c80476e4SDavid E. O'Brien int what; 1076c80476e4SDavid E. O'Brien { 1077c80476e4SDavid E. O'Brien register struct varent *c; 1078c80476e4SDavid E. O'Brien register int len; 1079c80476e4SDavid E. O'Brien 1080c80476e4SDavid E. O'Brien if (setintr) 1081c80476e4SDavid E. O'Brien #ifdef BSDSIGS 1082c80476e4SDavid E. O'Brien (void) sigsetmask(sigblock((sigmask_t) 0) & ~sigmask(SIGINT)); 1083c80476e4SDavid E. O'Brien #else /* !BSDSIGS */ 1084c80476e4SDavid E. O'Brien (void) sigrelse(SIGINT); 1085c80476e4SDavid E. O'Brien #endif /* BSDSIGS */ 1086c80476e4SDavid E. O'Brien 1087c80476e4SDavid E. O'Brien for (;;) { 1088c80476e4SDavid E. O'Brien while (p->v_left) 1089c80476e4SDavid E. O'Brien p = p->v_left; 1090c80476e4SDavid E. O'Brien x: 1091c80476e4SDavid E. O'Brien if (p->v_parent == 0) /* is it the header? */ 1092c80476e4SDavid E. O'Brien return; 1093c80476e4SDavid E. O'Brien if ((p->v_flags & what) != 0) { 1094c80476e4SDavid E. O'Brien len = blklen(p->vec); 1095c80476e4SDavid E. O'Brien xprintf("%S\t", p->v_name); 1096c80476e4SDavid E. O'Brien if (len != 1) 1097c80476e4SDavid E. O'Brien xputchar('('); 1098c80476e4SDavid E. O'Brien blkpr(p->vec); 1099c80476e4SDavid E. O'Brien if (len != 1) 1100c80476e4SDavid E. O'Brien xputchar(')'); 1101c80476e4SDavid E. O'Brien xputchar('\n'); 1102c80476e4SDavid E. O'Brien } 1103c80476e4SDavid E. O'Brien if (p->v_right) { 1104c80476e4SDavid E. O'Brien p = p->v_right; 1105c80476e4SDavid E. O'Brien continue; 1106c80476e4SDavid E. O'Brien } 1107c80476e4SDavid E. O'Brien do { 1108c80476e4SDavid E. O'Brien c = p; 1109c80476e4SDavid E. O'Brien p = p->v_parent; 1110c80476e4SDavid E. O'Brien } while (p->v_right == c); 1111c80476e4SDavid E. O'Brien goto x; 1112c80476e4SDavid E. O'Brien } 1113c80476e4SDavid E. O'Brien } 1114c80476e4SDavid E. O'Brien 1115c80476e4SDavid E. O'Brien #if defined(KANJI) && defined(SHORT_STRINGS) && defined(DSPMBYTE) 1116c80476e4SDavid E. O'Brien bool dspmbyte_ls; 1117c80476e4SDavid E. O'Brien 1118c80476e4SDavid E. O'Brien void 1119c80476e4SDavid E. O'Brien update_dspmbyte_vars() 1120c80476e4SDavid E. O'Brien { 1121c80476e4SDavid E. O'Brien int lp, iskcode; 1122c80476e4SDavid E. O'Brien Char *dstr1; 1123c80476e4SDavid E. O'Brien struct varent *vp; 1124c80476e4SDavid E. O'Brien 1125c80476e4SDavid E. O'Brien /* if variable "nokanji" is set, multi-byte display is disabled */ 1126c80476e4SDavid E. O'Brien if ((vp = adrof(CHECK_MBYTEVAR)) && !adrof(STRnokanji)) { 1127c80476e4SDavid E. O'Brien _enable_mbdisp = 1; 1128c80476e4SDavid E. O'Brien dstr1 = vp->vec[0]; 1129c80476e4SDavid E. O'Brien if(eq (dstr1, STRKSJIS)) 1130c80476e4SDavid E. O'Brien iskcode = 1; 1131c80476e4SDavid E. O'Brien else if (eq(dstr1, STRKEUC)) 1132c80476e4SDavid E. O'Brien iskcode = 2; 11336767bd61SMark Peek else if (eq(dstr1, STRKBIG5)) 11346767bd61SMark Peek iskcode = 3; 113529301572SMark Peek else if (eq(dstr1, STRKUTF8)) 113629301572SMark Peek iskcode = 4; 1137c80476e4SDavid E. O'Brien else if ((dstr1[0] - '0') >= 0 && (dstr1[0] - '0') <= 3) { 1138c80476e4SDavid E. O'Brien iskcode = 0; 1139c80476e4SDavid E. O'Brien } 1140c80476e4SDavid E. O'Brien else { 1141c80476e4SDavid E. O'Brien xprintf(CGETS(18, 2, 1142c80476e4SDavid E. O'Brien "Warning: unknown multibyte display; using default(euc(JP))\n")); 1143c80476e4SDavid E. O'Brien iskcode = 2; 1144c80476e4SDavid E. O'Brien } 1145c80476e4SDavid E. O'Brien if (dstr1 && vp->vec[1] && eq(vp->vec[1], STRls)) 1146c80476e4SDavid E. O'Brien dspmbyte_ls = 1; 1147c80476e4SDavid E. O'Brien else 1148c80476e4SDavid E. O'Brien dspmbyte_ls = 0; 1149c80476e4SDavid E. O'Brien for (lp = 0; lp < 256 && iskcode > 0; lp++) { 1150c80476e4SDavid E. O'Brien switch (iskcode) { 1151c80476e4SDavid E. O'Brien case 1: 1152c80476e4SDavid E. O'Brien /* Shift-JIS */ 1153c80476e4SDavid E. O'Brien _cmap[lp] = _cmap_mbyte[lp]; 1154c80476e4SDavid E. O'Brien _mbmap[lp] = _mbmap_sjis[lp]; 1155c80476e4SDavid E. O'Brien break; 1156c80476e4SDavid E. O'Brien case 2: 1157c80476e4SDavid E. O'Brien /* 2 ... euc */ 1158c80476e4SDavid E. O'Brien _cmap[lp] = _cmap_mbyte[lp]; 1159c80476e4SDavid E. O'Brien _mbmap[lp] = _mbmap_euc[lp]; 1160c80476e4SDavid E. O'Brien break; 11616767bd61SMark Peek case 3: 11626767bd61SMark Peek /* 3 ... big5 */ 11636767bd61SMark Peek _cmap[lp] = _cmap_mbyte[lp]; 11646767bd61SMark Peek _mbmap[lp] = _mbmap_big5[lp]; 11656767bd61SMark Peek break; 116629301572SMark Peek case 4: 116729301572SMark Peek /* 4 ... utf8 */ 116829301572SMark Peek _cmap[lp] = _cmap_mbyte[lp]; 116929301572SMark Peek _mbmap[lp] = _mbmap_utf8[lp]; 117029301572SMark Peek break; 1171c80476e4SDavid E. O'Brien default: 1172c80476e4SDavid E. O'Brien xprintf(CGETS(18, 3, 1173c80476e4SDavid E. O'Brien "Warning: unknown multibyte code %d; multibyte disabled\n"), 1174c80476e4SDavid E. O'Brien iskcode); 1175c80476e4SDavid E. O'Brien _cmap[lp] = _cmap_c[lp]; 1176c80476e4SDavid E. O'Brien _mbmap[lp] = 0; /* Default map all 0 */ 1177c80476e4SDavid E. O'Brien _enable_mbdisp = 0; 1178c80476e4SDavid E. O'Brien break; 1179c80476e4SDavid E. O'Brien } 1180c80476e4SDavid E. O'Brien } 1181c80476e4SDavid E. O'Brien if (iskcode == 0) { 1182c80476e4SDavid E. O'Brien /* check original table */ 1183c80476e4SDavid E. O'Brien if (Strlen(dstr1) != 256) { 1184c80476e4SDavid E. O'Brien xprintf(CGETS(18, 4, 1185c80476e4SDavid E. O'Brien "Warning: Invalid multibyte table length (%d); multibyte disabled\n"), 1186c80476e4SDavid E. O'Brien Strlen(dstr1)); 1187c80476e4SDavid E. O'Brien _enable_mbdisp = 0; 1188c80476e4SDavid E. O'Brien } 1189c80476e4SDavid E. O'Brien for (lp = 0; lp < 256 && _enable_mbdisp == 1; lp++) { 1190c80476e4SDavid E. O'Brien if (!((dstr1[lp] - '0') >= 0 && (dstr1[lp] - '0') <= 3)) { 1191c80476e4SDavid E. O'Brien xprintf(CGETS(18, 4, 1192c80476e4SDavid E. O'Brien "Warning: bad multibyte code at offset +%d; multibyte diabled\n"), 1193c80476e4SDavid E. O'Brien lp); 1194c80476e4SDavid E. O'Brien _enable_mbdisp = 0; 1195c80476e4SDavid E. O'Brien break; 1196c80476e4SDavid E. O'Brien } 1197c80476e4SDavid E. O'Brien } 1198c80476e4SDavid E. O'Brien /* set original table */ 1199c80476e4SDavid E. O'Brien for (lp = 0; lp < 256; lp++) { 1200c80476e4SDavid E. O'Brien if (_enable_mbdisp == 1) { 1201c80476e4SDavid E. O'Brien _cmap[lp] = _cmap_mbyte[lp]; 1202c80476e4SDavid E. O'Brien _mbmap[lp] = (unsigned short) ((dstr1[lp] - '0') & 0x0f); 1203c80476e4SDavid E. O'Brien } 1204c80476e4SDavid E. O'Brien else { 1205c80476e4SDavid E. O'Brien _cmap[lp] = _cmap_c[lp]; 1206c80476e4SDavid E. O'Brien _mbmap[lp] = 0; /* Default map all 0 */ 1207c80476e4SDavid E. O'Brien } 1208c80476e4SDavid E. O'Brien } 1209c80476e4SDavid E. O'Brien } 1210c80476e4SDavid E. O'Brien } 1211c80476e4SDavid E. O'Brien else { 1212c80476e4SDavid E. O'Brien for (lp = 0; lp < 256; lp++) { 1213c80476e4SDavid E. O'Brien _cmap[lp] = _cmap_c[lp]; 1214c80476e4SDavid E. O'Brien _mbmap[lp] = 0; /* Default map all 0 */ 1215c80476e4SDavid E. O'Brien } 1216c80476e4SDavid E. O'Brien _enable_mbdisp = 0; 1217c80476e4SDavid E. O'Brien dspmbyte_ls = 0; 1218c80476e4SDavid E. O'Brien } 1219c80476e4SDavid E. O'Brien #ifdef MBYTEDEBUG /* Sorry, use for beta testing */ 1220c80476e4SDavid E. O'Brien { 1221c80476e4SDavid E. O'Brien Char mbmapstr[300]; 1222c80476e4SDavid E. O'Brien for (lp = 0; lp < 256; lp++) { 1223c80476e4SDavid E. O'Brien mbmapstr[lp] = _mbmap[lp] + '0'; 1224c80476e4SDavid E. O'Brien mbmapstr[lp+1] = 0; 1225c80476e4SDavid E. O'Brien } 1226c80476e4SDavid E. O'Brien set(STRmbytemap, Strsave(mbmapstr), VAR_READWRITE); 1227c80476e4SDavid E. O'Brien } 1228c80476e4SDavid E. O'Brien #endif /* MBYTEMAP */ 1229c80476e4SDavid E. O'Brien } 1230c80476e4SDavid E. O'Brien 1231c80476e4SDavid E. O'Brien /* dspkanji/dspmbyte autosetting */ 1232c80476e4SDavid E. O'Brien /* PATCH IDEA FROM Issei.Suzuki VERY THANKS */ 1233c80476e4SDavid E. O'Brien void 1234c80476e4SDavid E. O'Brien autoset_dspmbyte(pcp) 1235c80476e4SDavid E. O'Brien Char *pcp; 1236c80476e4SDavid E. O'Brien { 1237c80476e4SDavid E. O'Brien int i; 1238c80476e4SDavid E. O'Brien struct dspm_autoset_Table { 1239c80476e4SDavid E. O'Brien Char *n; 1240c80476e4SDavid E. O'Brien Char *v; 1241c80476e4SDavid E. O'Brien } dspmt[] = { 12428e66bd9eSDavid E. O'Brien { STRLANGEUCJP, STRKEUC }, 12438e66bd9eSDavid E. O'Brien { STRLANGEUCKR, STRKEUC }, 1244ad35f55dSMark Peek { STRLANGEUCZH, STRKEUC }, 12458e66bd9eSDavid E. O'Brien { STRLANGEUCJPB, STRKEUC }, 12468e66bd9eSDavid E. O'Brien { STRLANGEUCKRB, STRKEUC }, 1247ad35f55dSMark Peek { STRLANGEUCZHB, STRKEUC }, 1248b2d5d167SMark Peek #ifdef linux 1249b2d5d167SMark Peek { STRLANGEUCJPC, STRKEUC }, 1250b2d5d167SMark Peek #endif 1251c80476e4SDavid E. O'Brien { STRLANGSJIS, STRKSJIS }, 1252c80476e4SDavid E. O'Brien { STRLANGSJISB, STRKSJIS }, 12536767bd61SMark Peek { STRLANGBIG5, STRKBIG5 }, 1254b2d5d167SMark Peek { STRSTARKUTF8, STRKUTF8 }, 1255c80476e4SDavid E. O'Brien { NULL, NULL } 1256c80476e4SDavid E. O'Brien }; 1257c80476e4SDavid E. O'Brien 1258c80476e4SDavid E. O'Brien if (*pcp == '\0') 1259c80476e4SDavid E. O'Brien return; 1260c80476e4SDavid E. O'Brien 1261c80476e4SDavid E. O'Brien for (i = 0; dspmt[i].n; i++) { 1262b2d5d167SMark Peek Char *estr; 1263b2d5d167SMark Peek if (t_pmatch(pcp, dspmt[i].n, &estr, 1) > 0) { 1264c80476e4SDavid E. O'Brien set(CHECK_MBYTEVAR, Strsave(dspmt[i].v), VAR_READWRITE); 1265c80476e4SDavid E. O'Brien update_dspmbyte_vars(); 1266c80476e4SDavid E. O'Brien break; 1267c80476e4SDavid E. O'Brien } 1268c80476e4SDavid E. O'Brien } 1269c80476e4SDavid E. O'Brien } 1270c80476e4SDavid E. O'Brien #endif 1271