1b2d5d167SMark Peek /* $Header: /src/pub/tcsh/sh.misc.c,v 3.26 2003/03/12 19:14:51 christos Exp $ */ 2c80476e4SDavid E. O'Brien /* 3c80476e4SDavid E. O'Brien * sh.misc.c: Miscelaneous functions 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.misc.c,v 3.26 2003/03/12 19:14:51 christos Exp $") 36c80476e4SDavid E. O'Brien 37c80476e4SDavid E. O'Brien static int renum __P((int, int)); 38c80476e4SDavid E. O'Brien static Char **blkend __P((Char **)); 39c80476e4SDavid E. O'Brien static Char **blkcat __P((Char **, Char **)); 40c80476e4SDavid E. O'Brien 41c80476e4SDavid E. O'Brien /* 42c80476e4SDavid E. O'Brien * C Shell 43c80476e4SDavid E. O'Brien */ 44c80476e4SDavid E. O'Brien 45c80476e4SDavid E. O'Brien int 46c80476e4SDavid E. O'Brien any(s, c) 47c80476e4SDavid E. O'Brien register char *s; 48c80476e4SDavid E. O'Brien register int c; 49c80476e4SDavid E. O'Brien { 50c80476e4SDavid E. O'Brien if (!s) 51c80476e4SDavid E. O'Brien return (0); /* Check for nil pointer */ 52c80476e4SDavid E. O'Brien while (*s) 53c80476e4SDavid E. O'Brien if (*s++ == c) 54c80476e4SDavid E. O'Brien return (1); 55c80476e4SDavid E. O'Brien return (0); 56c80476e4SDavid E. O'Brien } 57c80476e4SDavid E. O'Brien 58c80476e4SDavid E. O'Brien void 59c80476e4SDavid E. O'Brien setzero(cp, i) 60c80476e4SDavid E. O'Brien char *cp; 61c80476e4SDavid E. O'Brien int i; 62c80476e4SDavid E. O'Brien { 63c80476e4SDavid E. O'Brien if (i != 0) 64c80476e4SDavid E. O'Brien do 65c80476e4SDavid E. O'Brien *cp++ = 0; 66c80476e4SDavid E. O'Brien while (--i); 67c80476e4SDavid E. O'Brien } 68c80476e4SDavid E. O'Brien 69c80476e4SDavid E. O'Brien char * 70c80476e4SDavid E. O'Brien strsave(s) 71c80476e4SDavid E. O'Brien register const char *s; 72c80476e4SDavid E. O'Brien { 73c80476e4SDavid E. O'Brien char *n; 74c80476e4SDavid E. O'Brien register char *p; 75c80476e4SDavid E. O'Brien 76c80476e4SDavid E. O'Brien if (s == NULL) 77c80476e4SDavid E. O'Brien s = (const char *) ""; 78c80476e4SDavid E. O'Brien for (p = (char *) s; *p++ != '\0';) 79c80476e4SDavid E. O'Brien continue; 80c80476e4SDavid E. O'Brien n = p = (char *) xmalloc((size_t) 81c80476e4SDavid E. O'Brien ((((const char *) p) - s) * sizeof(char))); 82c80476e4SDavid E. O'Brien while ((*p++ = *s++) != '\0') 83c80476e4SDavid E. O'Brien continue; 84c80476e4SDavid E. O'Brien return (n); 85c80476e4SDavid E. O'Brien } 86c80476e4SDavid E. O'Brien 87c80476e4SDavid E. O'Brien static Char ** 88c80476e4SDavid E. O'Brien blkend(up) 89c80476e4SDavid E. O'Brien register Char **up; 90c80476e4SDavid E. O'Brien { 91c80476e4SDavid E. O'Brien 92c80476e4SDavid E. O'Brien while (*up) 93c80476e4SDavid E. O'Brien up++; 94c80476e4SDavid E. O'Brien return (up); 95c80476e4SDavid E. O'Brien } 96c80476e4SDavid E. O'Brien 97c80476e4SDavid E. O'Brien 98c80476e4SDavid E. O'Brien void 99c80476e4SDavid E. O'Brien blkpr(av) 100c80476e4SDavid E. O'Brien register Char **av; 101c80476e4SDavid E. O'Brien { 102c80476e4SDavid E. O'Brien 103c80476e4SDavid E. O'Brien for (; *av; av++) { 104c80476e4SDavid E. O'Brien xprintf("%S", *av); 105c80476e4SDavid E. O'Brien if (av[1]) 106c80476e4SDavid E. O'Brien xprintf(" "); 107c80476e4SDavid E. O'Brien } 108c80476e4SDavid E. O'Brien } 109c80476e4SDavid E. O'Brien 110c80476e4SDavid E. O'Brien void 111c80476e4SDavid E. O'Brien blkexpand(av, str) 112c80476e4SDavid E. O'Brien register Char **av; 113c80476e4SDavid E. O'Brien Char *str; 114c80476e4SDavid E. O'Brien { 115c80476e4SDavid E. O'Brien *str = '\0'; 116c80476e4SDavid E. O'Brien for (; *av; av++) { 117c80476e4SDavid E. O'Brien (void) Strcat(str, *av); 118c80476e4SDavid E. O'Brien if (av[1]) 119c80476e4SDavid E. O'Brien (void) Strcat(str, STRspace); 120c80476e4SDavid E. O'Brien } 121c80476e4SDavid E. O'Brien } 122c80476e4SDavid E. O'Brien 123c80476e4SDavid E. O'Brien int 124c80476e4SDavid E. O'Brien blklen(av) 125c80476e4SDavid E. O'Brien register Char **av; 126c80476e4SDavid E. O'Brien { 127c80476e4SDavid E. O'Brien register int i = 0; 128c80476e4SDavid E. O'Brien 129c80476e4SDavid E. O'Brien while (*av++) 130c80476e4SDavid E. O'Brien i++; 131c80476e4SDavid E. O'Brien return (i); 132c80476e4SDavid E. O'Brien } 133c80476e4SDavid E. O'Brien 134c80476e4SDavid E. O'Brien Char ** 135c80476e4SDavid E. O'Brien blkcpy(oav, bv) 136c80476e4SDavid E. O'Brien Char **oav; 137c80476e4SDavid E. O'Brien register Char **bv; 138c80476e4SDavid E. O'Brien { 139c80476e4SDavid E. O'Brien register Char **av = oav; 140c80476e4SDavid E. O'Brien 141c80476e4SDavid E. O'Brien while ((*av++ = *bv++) != NULL) 142c80476e4SDavid E. O'Brien continue; 143c80476e4SDavid E. O'Brien return (oav); 144c80476e4SDavid E. O'Brien } 145c80476e4SDavid E. O'Brien 146c80476e4SDavid E. O'Brien static Char ** 147c80476e4SDavid E. O'Brien blkcat(up, vp) 148c80476e4SDavid E. O'Brien Char **up, **vp; 149c80476e4SDavid E. O'Brien { 150c80476e4SDavid E. O'Brien 151c80476e4SDavid E. O'Brien (void) blkcpy(blkend(up), vp); 152c80476e4SDavid E. O'Brien return (up); 153c80476e4SDavid E. O'Brien } 154c80476e4SDavid E. O'Brien 155c80476e4SDavid E. O'Brien void 156c80476e4SDavid E. O'Brien blkfree(av0) 157c80476e4SDavid E. O'Brien Char **av0; 158c80476e4SDavid E. O'Brien { 159c80476e4SDavid E. O'Brien register Char **av = av0; 160c80476e4SDavid E. O'Brien 161c80476e4SDavid E. O'Brien if (!av0) 162c80476e4SDavid E. O'Brien return; 163c80476e4SDavid E. O'Brien for (; *av; av++) 164c80476e4SDavid E. O'Brien xfree((ptr_t) * av); 165c80476e4SDavid E. O'Brien xfree((ptr_t) av0); 166c80476e4SDavid E. O'Brien } 167c80476e4SDavid E. O'Brien 168c80476e4SDavid E. O'Brien Char ** 169c80476e4SDavid E. O'Brien saveblk(v) 170c80476e4SDavid E. O'Brien register Char **v; 171c80476e4SDavid E. O'Brien { 172c80476e4SDavid E. O'Brien register Char **newv = 173c80476e4SDavid E. O'Brien (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **)); 174c80476e4SDavid E. O'Brien Char **onewv = newv; 175c80476e4SDavid E. O'Brien 176c80476e4SDavid E. O'Brien while (*v) 177c80476e4SDavid E. O'Brien *newv++ = Strsave(*v++); 178c80476e4SDavid E. O'Brien return (onewv); 179c80476e4SDavid E. O'Brien } 180c80476e4SDavid E. O'Brien 181c80476e4SDavid E. O'Brien #if !defined(SHORT_STRINGS) && !defined(POSIX) 182c80476e4SDavid E. O'Brien char * 183c80476e4SDavid E. O'Brien strstr(s, t) 184c80476e4SDavid E. O'Brien register const char *s, *t; 185c80476e4SDavid E. O'Brien { 186c80476e4SDavid E. O'Brien do { 187c80476e4SDavid E. O'Brien register const char *ss = s; 188c80476e4SDavid E. O'Brien register const char *tt = t; 189c80476e4SDavid E. O'Brien 190c80476e4SDavid E. O'Brien do 191c80476e4SDavid E. O'Brien if (*tt == '\0') 192c80476e4SDavid E. O'Brien return ((char *) s); 193c80476e4SDavid E. O'Brien while (*ss++ == *tt++); 194c80476e4SDavid E. O'Brien } while (*s++ != '\0'); 195c80476e4SDavid E. O'Brien return (NULL); 196c80476e4SDavid E. O'Brien } 197c80476e4SDavid E. O'Brien 198c80476e4SDavid E. O'Brien #endif /* !SHORT_STRINGS && !POSIX */ 199c80476e4SDavid E. O'Brien 200c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS 201c80476e4SDavid E. O'Brien char * 202c80476e4SDavid E. O'Brien strspl(cp, dp) 203c80476e4SDavid E. O'Brien char *cp, *dp; 204c80476e4SDavid E. O'Brien { 205c80476e4SDavid E. O'Brien char *ep; 206c80476e4SDavid E. O'Brien register char *p, *q; 207c80476e4SDavid E. O'Brien 208c80476e4SDavid E. O'Brien if (!cp) 209c80476e4SDavid E. O'Brien cp = ""; 210c80476e4SDavid E. O'Brien if (!dp) 211c80476e4SDavid E. O'Brien dp = ""; 212c80476e4SDavid E. O'Brien for (p = cp; *p++ != '\0';) 213c80476e4SDavid E. O'Brien continue; 214c80476e4SDavid E. O'Brien for (q = dp; *q++ != '\0';) 215c80476e4SDavid E. O'Brien continue; 216c80476e4SDavid E. O'Brien ep = (char *) xmalloc((size_t) (((p - cp) + (q - dp) - 1) * sizeof(char))); 217c80476e4SDavid E. O'Brien for (p = ep, q = cp; (*p++ = *q++) != '\0';) 218c80476e4SDavid E. O'Brien continue; 219c80476e4SDavid E. O'Brien for (p--, q = dp; (*p++ = *q++) != '\0';) 220c80476e4SDavid E. O'Brien continue; 221c80476e4SDavid E. O'Brien return (ep); 222c80476e4SDavid E. O'Brien } 223c80476e4SDavid E. O'Brien 224c80476e4SDavid E. O'Brien #endif /* !SHORT_STRINGS */ 225c80476e4SDavid E. O'Brien 226c80476e4SDavid E. O'Brien Char ** 227c80476e4SDavid E. O'Brien blkspl(up, vp) 228c80476e4SDavid E. O'Brien register Char **up, **vp; 229c80476e4SDavid E. O'Brien { 230c80476e4SDavid E. O'Brien register Char **wp = 231c80476e4SDavid E. O'Brien (Char **) xcalloc((size_t) (blklen(up) + blklen(vp) + 1), 232c80476e4SDavid E. O'Brien sizeof(Char **)); 233c80476e4SDavid E. O'Brien 234c80476e4SDavid E. O'Brien (void) blkcpy(wp, up); 235c80476e4SDavid E. O'Brien return (blkcat(wp, vp)); 236c80476e4SDavid E. O'Brien } 237c80476e4SDavid E. O'Brien 238c80476e4SDavid E. O'Brien Char 239c80476e4SDavid E. O'Brien lastchr(cp) 240c80476e4SDavid E. O'Brien register Char *cp; 241c80476e4SDavid E. O'Brien { 242c80476e4SDavid E. O'Brien 243c80476e4SDavid E. O'Brien if (!cp) 244c80476e4SDavid E. O'Brien return (0); 245c80476e4SDavid E. O'Brien if (!*cp) 246c80476e4SDavid E. O'Brien return (0); 247c80476e4SDavid E. O'Brien while (cp[1]) 248c80476e4SDavid E. O'Brien cp++; 249c80476e4SDavid E. O'Brien return (*cp); 250c80476e4SDavid E. O'Brien } 251c80476e4SDavid E. O'Brien 252c80476e4SDavid E. O'Brien /* 253c80476e4SDavid E. O'Brien * This routine is called after an error to close up 254c80476e4SDavid E. O'Brien * any units which may have been left open accidentally. 255c80476e4SDavid E. O'Brien */ 256c80476e4SDavid E. O'Brien void 257c80476e4SDavid E. O'Brien closem() 258c80476e4SDavid E. O'Brien { 259c80476e4SDavid E. O'Brien register int f; 260c80476e4SDavid E. O'Brien 261b2d5d167SMark Peek #ifdef NLS_BUGS 262b2d5d167SMark Peek #ifdef NLS_CATALOGS 263b2d5d167SMark Peek (void)catclose(catd); 264b2d5d167SMark Peek #endif /* NLS_CATALOGS */ 265b2d5d167SMark Peek #endif /* NLS_BUGS */ 266c80476e4SDavid E. O'Brien #ifdef YPBUGS 267c80476e4SDavid E. O'Brien /* suggested by Justin Bur; thanks to Karl Kleinpaste */ 268c80476e4SDavid E. O'Brien fix_yp_bugs(); 269c80476e4SDavid E. O'Brien #endif /* YPBUGS */ 270c80476e4SDavid E. O'Brien for (f = 0; f < NOFILE; f++) 271c80476e4SDavid E. O'Brien if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD && 272c80476e4SDavid E. O'Brien f != FSHTTY 273c80476e4SDavid E. O'Brien #ifdef MALLOC_TRACE 274c80476e4SDavid E. O'Brien && f != 25 275c80476e4SDavid E. O'Brien #endif /* MALLOC_TRACE */ 276c80476e4SDavid E. O'Brien ) 277c80476e4SDavid E. O'Brien { 278c80476e4SDavid E. O'Brien (void) close(f); 279c80476e4SDavid E. O'Brien #ifdef NISPLUS 280c80476e4SDavid E. O'Brien if(f < 3) 281b2d5d167SMark Peek (void) open(_PATH_DEVNULL, O_RDONLY|O_LARGEFILE); 282c80476e4SDavid E. O'Brien #endif /* NISPLUS */ 283c80476e4SDavid E. O'Brien } 284b2d5d167SMark Peek #ifdef NLS_BUGS 285b2d5d167SMark Peek #ifdef NLS_CATALOGS 286b2d5d167SMark Peek nlsinit(); 287b2d5d167SMark Peek #endif /* NLS_CATALOGS */ 288b2d5d167SMark Peek #endif /* NLS_BUGS */ 289c80476e4SDavid E. O'Brien } 290c80476e4SDavid E. O'Brien 291c80476e4SDavid E. O'Brien #ifndef CLOSE_ON_EXEC 292c80476e4SDavid E. O'Brien /* 293c80476e4SDavid E. O'Brien * Close files before executing a file. 294c80476e4SDavid E. O'Brien * We could be MUCH more intelligent, since (on a version 7 system) 295c80476e4SDavid E. O'Brien * we need only close files here during a source, the other 296c80476e4SDavid E. O'Brien * shell fd's being in units 16-19 which are closed automatically! 297c80476e4SDavid E. O'Brien */ 298c80476e4SDavid E. O'Brien void 299c80476e4SDavid E. O'Brien closech() 300c80476e4SDavid E. O'Brien { 301c80476e4SDavid E. O'Brien register int f; 302c80476e4SDavid E. O'Brien 303c80476e4SDavid E. O'Brien if (didcch) 304c80476e4SDavid E. O'Brien return; 305c80476e4SDavid E. O'Brien didcch = 1; 306c80476e4SDavid E. O'Brien SHIN = 0; 307c80476e4SDavid E. O'Brien SHOUT = 1; 308c80476e4SDavid E. O'Brien SHDIAG = 2; 309c80476e4SDavid E. O'Brien OLDSTD = 0; 310c80476e4SDavid E. O'Brien isoutatty = isatty(SHOUT); 311c80476e4SDavid E. O'Brien isdiagatty = isatty(SHDIAG); 312c80476e4SDavid E. O'Brien for (f = 3; f < NOFILE; f++) 313c80476e4SDavid E. O'Brien (void) close(f); 314c80476e4SDavid E. O'Brien } 315c80476e4SDavid E. O'Brien 316c80476e4SDavid E. O'Brien #endif /* CLOSE_ON_EXEC */ 317c80476e4SDavid E. O'Brien 318c80476e4SDavid E. O'Brien void 319c80476e4SDavid E. O'Brien donefds() 320c80476e4SDavid E. O'Brien { 321c80476e4SDavid E. O'Brien 322c80476e4SDavid E. O'Brien (void) close(0); 323c80476e4SDavid E. O'Brien (void) close(1); 324c80476e4SDavid E. O'Brien (void) close(2); 325c80476e4SDavid E. O'Brien didfds = 0; 326c80476e4SDavid E. O'Brien #ifdef NISPLUS 327c80476e4SDavid E. O'Brien { 328b2d5d167SMark Peek int fd = open(_PATH_DEVNULL, O_RDONLY|O_LARGEFILE); 329c80476e4SDavid E. O'Brien (void) dup2(fd, 1); 330c80476e4SDavid E. O'Brien (void) dup2(fd, 2); 331c80476e4SDavid E. O'Brien if (fd != 0) { 332c80476e4SDavid E. O'Brien (void) dup2(fd, 0); 333c80476e4SDavid E. O'Brien (void) close(fd); 334c80476e4SDavid E. O'Brien } 335c80476e4SDavid E. O'Brien } 336c80476e4SDavid E. O'Brien #endif /*NISPLUS*/ 337c80476e4SDavid E. O'Brien } 338c80476e4SDavid E. O'Brien 339c80476e4SDavid E. O'Brien /* 340c80476e4SDavid E. O'Brien * Move descriptor i to j. 341c80476e4SDavid E. O'Brien * If j is -1 then we just want to get i to a safe place, 342c80476e4SDavid E. O'Brien * i.e. to a unit > 2. This also happens in dcopy. 343c80476e4SDavid E. O'Brien */ 344c80476e4SDavid E. O'Brien int 345c80476e4SDavid E. O'Brien dmove(i, j) 346c80476e4SDavid E. O'Brien register int i, j; 347c80476e4SDavid E. O'Brien { 348c80476e4SDavid E. O'Brien 349c80476e4SDavid E. O'Brien if (i == j || i < 0) 350c80476e4SDavid E. O'Brien return (i); 351c80476e4SDavid E. O'Brien #ifdef HAVEDUP2 352c80476e4SDavid E. O'Brien if (j >= 0) { 353c80476e4SDavid E. O'Brien (void) dup2(i, j); 354c80476e4SDavid E. O'Brien if (j != i) 355c80476e4SDavid E. O'Brien (void) close(i); 356c80476e4SDavid E. O'Brien return (j); 357c80476e4SDavid E. O'Brien } 358c80476e4SDavid E. O'Brien #endif 359c80476e4SDavid E. O'Brien j = dcopy(i, j); 360c80476e4SDavid E. O'Brien if (j != i) 361c80476e4SDavid E. O'Brien (void) close(i); 362c80476e4SDavid E. O'Brien return (j); 363c80476e4SDavid E. O'Brien } 364c80476e4SDavid E. O'Brien 365c80476e4SDavid E. O'Brien int 366c80476e4SDavid E. O'Brien dcopy(i, j) 367c80476e4SDavid E. O'Brien register int i, j; 368c80476e4SDavid E. O'Brien { 369c80476e4SDavid E. O'Brien 370c80476e4SDavid E. O'Brien if (i == j || i < 0 || (j < 0 && i > 2)) 371c80476e4SDavid E. O'Brien return (i); 372c80476e4SDavid E. O'Brien if (j >= 0) { 373c80476e4SDavid E. O'Brien #ifdef HAVEDUP2 374c80476e4SDavid E. O'Brien (void) dup2(i, j); 375c80476e4SDavid E. O'Brien return (j); 376c80476e4SDavid E. O'Brien #else 377c80476e4SDavid E. O'Brien (void) close(j); 378c80476e4SDavid E. O'Brien #endif 379c80476e4SDavid E. O'Brien } 380c80476e4SDavid E. O'Brien return (renum(i, j)); 381c80476e4SDavid E. O'Brien } 382c80476e4SDavid E. O'Brien 383c80476e4SDavid E. O'Brien static int 384c80476e4SDavid E. O'Brien renum(i, j) 385c80476e4SDavid E. O'Brien register int i, j; 386c80476e4SDavid E. O'Brien { 387c80476e4SDavid E. O'Brien register int k = dup(i); 388c80476e4SDavid E. O'Brien 389c80476e4SDavid E. O'Brien if (k < 0) 390c80476e4SDavid E. O'Brien return (-1); 391c80476e4SDavid E. O'Brien if (j == -1 && k > 2) 392c80476e4SDavid E. O'Brien return (k); 393c80476e4SDavid E. O'Brien if (k != j) { 394c80476e4SDavid E. O'Brien j = renum(k, j); 395c80476e4SDavid E. O'Brien (void) close(k); 396c80476e4SDavid E. O'Brien return (j); 397c80476e4SDavid E. O'Brien } 398c80476e4SDavid E. O'Brien return (k); 399c80476e4SDavid E. O'Brien } 400c80476e4SDavid E. O'Brien 401c80476e4SDavid E. O'Brien /* 402c80476e4SDavid E. O'Brien * Left shift a command argument list, discarding 403c80476e4SDavid E. O'Brien * the first c arguments. Used in "shift" commands 404c80476e4SDavid E. O'Brien * as well as by commands like "repeat". 405c80476e4SDavid E. O'Brien */ 406c80476e4SDavid E. O'Brien void 407c80476e4SDavid E. O'Brien lshift(v, c) 408c80476e4SDavid E. O'Brien register Char **v; 409c80476e4SDavid E. O'Brien register int c; 410c80476e4SDavid E. O'Brien { 411c80476e4SDavid E. O'Brien register Char **u; 412c80476e4SDavid E. O'Brien 413c80476e4SDavid E. O'Brien for (u = v; *u && --c >= 0; u++) 414c80476e4SDavid E. O'Brien xfree((ptr_t) *u); 415c80476e4SDavid E. O'Brien (void) blkcpy(v, u); 416c80476e4SDavid E. O'Brien } 417c80476e4SDavid E. O'Brien 418c80476e4SDavid E. O'Brien int 419c80476e4SDavid E. O'Brien number(cp) 420c80476e4SDavid E. O'Brien Char *cp; 421c80476e4SDavid E. O'Brien { 422c80476e4SDavid E. O'Brien if (!cp) 423c80476e4SDavid E. O'Brien return (0); 424c80476e4SDavid E. O'Brien if (*cp == '-') { 425c80476e4SDavid E. O'Brien cp++; 426c80476e4SDavid E. O'Brien if (!Isdigit(*cp)) 427c80476e4SDavid E. O'Brien return (0); 428c80476e4SDavid E. O'Brien cp++; 429c80476e4SDavid E. O'Brien } 430c80476e4SDavid E. O'Brien while (*cp && Isdigit(*cp)) 431c80476e4SDavid E. O'Brien cp++; 432c80476e4SDavid E. O'Brien return (*cp == 0); 433c80476e4SDavid E. O'Brien } 434c80476e4SDavid E. O'Brien 435c80476e4SDavid E. O'Brien Char ** 436c80476e4SDavid E. O'Brien copyblk(v) 437c80476e4SDavid E. O'Brien register Char **v; 438c80476e4SDavid E. O'Brien { 439c80476e4SDavid E. O'Brien register Char **nv = 440c80476e4SDavid E. O'Brien (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **)); 441c80476e4SDavid E. O'Brien 442c80476e4SDavid E. O'Brien return (blkcpy(nv, v)); 443c80476e4SDavid E. O'Brien } 444c80476e4SDavid E. O'Brien 445c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS 446c80476e4SDavid E. O'Brien char * 447c80476e4SDavid E. O'Brien strend(cp) 448c80476e4SDavid E. O'Brien register char *cp; 449c80476e4SDavid E. O'Brien { 450c80476e4SDavid E. O'Brien if (!cp) 451c80476e4SDavid E. O'Brien return (cp); 452c80476e4SDavid E. O'Brien while (*cp) 453c80476e4SDavid E. O'Brien cp++; 454c80476e4SDavid E. O'Brien return (cp); 455c80476e4SDavid E. O'Brien } 456c80476e4SDavid E. O'Brien 457c80476e4SDavid E. O'Brien #endif /* SHORT_STRINGS */ 458c80476e4SDavid E. O'Brien 459c80476e4SDavid E. O'Brien Char * 460c80476e4SDavid E. O'Brien strip(cp) 461c80476e4SDavid E. O'Brien Char *cp; 462c80476e4SDavid E. O'Brien { 463c80476e4SDavid E. O'Brien register Char *dp = cp; 464c80476e4SDavid E. O'Brien 465c80476e4SDavid E. O'Brien if (!cp) 466c80476e4SDavid E. O'Brien return (cp); 467c80476e4SDavid E. O'Brien while ((*dp++ &= TRIM) != '\0') 468c80476e4SDavid E. O'Brien continue; 469c80476e4SDavid E. O'Brien return (cp); 470c80476e4SDavid E. O'Brien } 471c80476e4SDavid E. O'Brien 472c80476e4SDavid E. O'Brien Char * 473c80476e4SDavid E. O'Brien quote(cp) 474c80476e4SDavid E. O'Brien Char *cp; 475c80476e4SDavid E. O'Brien { 476c80476e4SDavid E. O'Brien register Char *dp = cp; 477c80476e4SDavid E. O'Brien 478c80476e4SDavid E. O'Brien if (!cp) 479c80476e4SDavid E. O'Brien return (cp); 480c80476e4SDavid E. O'Brien while (*dp != '\0') 481c80476e4SDavid E. O'Brien *dp++ |= QUOTE; 482c80476e4SDavid E. O'Brien return (cp); 483c80476e4SDavid E. O'Brien } 484c80476e4SDavid E. O'Brien 485c80476e4SDavid E. O'Brien Char * 486c80476e4SDavid E. O'Brien quote_meta(d, s) 487c80476e4SDavid E. O'Brien Char *d; 488c80476e4SDavid E. O'Brien const Char *s; 489c80476e4SDavid E. O'Brien { 490c80476e4SDavid E. O'Brien Char *r = d; 491c80476e4SDavid E. O'Brien while (*s != '\0') { 492c80476e4SDavid E. O'Brien if (cmap(*s, _META | _DOL | _QF | _QB | _ESC | _GLOB)) 493c80476e4SDavid E. O'Brien *d++ = '\\'; 494c80476e4SDavid E. O'Brien *d++ = *s++; 495c80476e4SDavid E. O'Brien } 496c80476e4SDavid E. O'Brien *d = '\0'; 497c80476e4SDavid E. O'Brien return r; 498c80476e4SDavid E. O'Brien } 499c80476e4SDavid E. O'Brien 500c80476e4SDavid E. O'Brien void 501c80476e4SDavid E. O'Brien udvar(name) 502c80476e4SDavid E. O'Brien Char *name; 503c80476e4SDavid E. O'Brien { 504c80476e4SDavid E. O'Brien 505c80476e4SDavid E. O'Brien setname(short2str(name)); 506c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_UNDVAR); 507c80476e4SDavid E. O'Brien } 508c80476e4SDavid E. O'Brien 509c80476e4SDavid E. O'Brien int 510c80476e4SDavid E. O'Brien prefix(sub, str) 511c80476e4SDavid E. O'Brien register Char *sub, *str; 512c80476e4SDavid E. O'Brien { 513c80476e4SDavid E. O'Brien 514c80476e4SDavid E. O'Brien for (;;) { 515c80476e4SDavid E. O'Brien if (*sub == 0) 516c80476e4SDavid E. O'Brien return (1); 517c80476e4SDavid E. O'Brien if (*str == 0) 518c80476e4SDavid E. O'Brien return (0); 519c80476e4SDavid E. O'Brien if ((*sub++ & TRIM) != (*str++ & TRIM)) 520c80476e4SDavid E. O'Brien return (0); 521c80476e4SDavid E. O'Brien } 522c80476e4SDavid E. O'Brien } 523