129301572SMark Peek /* $Header: /src/pub/tcsh/sh.misc.c,v 3.24 2002/03/08 17:36:46 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 3529301572SMark Peek RCSID("$Id: sh.misc.c,v 3.24 2002/03/08 17:36:46 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 261c80476e4SDavid E. O'Brien #ifdef YPBUGS 262c80476e4SDavid E. O'Brien /* suggested by Justin Bur; thanks to Karl Kleinpaste */ 263c80476e4SDavid E. O'Brien fix_yp_bugs(); 264c80476e4SDavid E. O'Brien #endif /* YPBUGS */ 265c80476e4SDavid E. O'Brien for (f = 0; f < NOFILE; f++) 266c80476e4SDavid E. O'Brien if (f != SHIN && f != SHOUT && f != SHDIAG && f != OLDSTD && 267c80476e4SDavid E. O'Brien f != FSHTTY 268c80476e4SDavid E. O'Brien #ifdef MALLOC_TRACE 269c80476e4SDavid E. O'Brien && f != 25 270c80476e4SDavid E. O'Brien #endif /* MALLOC_TRACE */ 271c80476e4SDavid E. O'Brien ) 272c80476e4SDavid E. O'Brien { 273c80476e4SDavid E. O'Brien (void) close(f); 274c80476e4SDavid E. O'Brien #ifdef NISPLUS 275c80476e4SDavid E. O'Brien if(f < 3) 276c80476e4SDavid E. O'Brien (void) open(_PATH_DEVNULL, O_RDONLY); 277c80476e4SDavid E. O'Brien #endif /* NISPLUS */ 278c80476e4SDavid E. O'Brien } 279c80476e4SDavid E. O'Brien } 280c80476e4SDavid E. O'Brien 281c80476e4SDavid E. O'Brien #ifndef CLOSE_ON_EXEC 282c80476e4SDavid E. O'Brien /* 283c80476e4SDavid E. O'Brien * Close files before executing a file. 284c80476e4SDavid E. O'Brien * We could be MUCH more intelligent, since (on a version 7 system) 285c80476e4SDavid E. O'Brien * we need only close files here during a source, the other 286c80476e4SDavid E. O'Brien * shell fd's being in units 16-19 which are closed automatically! 287c80476e4SDavid E. O'Brien */ 288c80476e4SDavid E. O'Brien void 289c80476e4SDavid E. O'Brien closech() 290c80476e4SDavid E. O'Brien { 291c80476e4SDavid E. O'Brien register int f; 292c80476e4SDavid E. O'Brien 293c80476e4SDavid E. O'Brien if (didcch) 294c80476e4SDavid E. O'Brien return; 295c80476e4SDavid E. O'Brien didcch = 1; 296c80476e4SDavid E. O'Brien SHIN = 0; 297c80476e4SDavid E. O'Brien SHOUT = 1; 298c80476e4SDavid E. O'Brien SHDIAG = 2; 299c80476e4SDavid E. O'Brien OLDSTD = 0; 300c80476e4SDavid E. O'Brien isoutatty = isatty(SHOUT); 301c80476e4SDavid E. O'Brien isdiagatty = isatty(SHDIAG); 302c80476e4SDavid E. O'Brien for (f = 3; f < NOFILE; f++) 303c80476e4SDavid E. O'Brien (void) close(f); 304c80476e4SDavid E. O'Brien } 305c80476e4SDavid E. O'Brien 306c80476e4SDavid E. O'Brien #endif /* CLOSE_ON_EXEC */ 307c80476e4SDavid E. O'Brien 308c80476e4SDavid E. O'Brien void 309c80476e4SDavid E. O'Brien donefds() 310c80476e4SDavid E. O'Brien { 311c80476e4SDavid E. O'Brien 312c80476e4SDavid E. O'Brien (void) close(0); 313c80476e4SDavid E. O'Brien (void) close(1); 314c80476e4SDavid E. O'Brien (void) close(2); 315c80476e4SDavid E. O'Brien didfds = 0; 316c80476e4SDavid E. O'Brien #ifdef NISPLUS 317c80476e4SDavid E. O'Brien { 318c80476e4SDavid E. O'Brien int fd = open(_PATH_DEVNULL, O_RDONLY); 319c80476e4SDavid E. O'Brien (void) dup2(fd, 1); 320c80476e4SDavid E. O'Brien (void) dup2(fd, 2); 321c80476e4SDavid E. O'Brien if (fd != 0) { 322c80476e4SDavid E. O'Brien (void) dup2(fd, 0); 323c80476e4SDavid E. O'Brien (void) close(fd); 324c80476e4SDavid E. O'Brien } 325c80476e4SDavid E. O'Brien } 326c80476e4SDavid E. O'Brien #endif /*NISPLUS*/ 327c80476e4SDavid E. O'Brien } 328c80476e4SDavid E. O'Brien 329c80476e4SDavid E. O'Brien /* 330c80476e4SDavid E. O'Brien * Move descriptor i to j. 331c80476e4SDavid E. O'Brien * If j is -1 then we just want to get i to a safe place, 332c80476e4SDavid E. O'Brien * i.e. to a unit > 2. This also happens in dcopy. 333c80476e4SDavid E. O'Brien */ 334c80476e4SDavid E. O'Brien int 335c80476e4SDavid E. O'Brien dmove(i, j) 336c80476e4SDavid E. O'Brien register int i, j; 337c80476e4SDavid E. O'Brien { 338c80476e4SDavid E. O'Brien 339c80476e4SDavid E. O'Brien if (i == j || i < 0) 340c80476e4SDavid E. O'Brien return (i); 341c80476e4SDavid E. O'Brien #ifdef HAVEDUP2 342c80476e4SDavid E. O'Brien if (j >= 0) { 343c80476e4SDavid E. O'Brien (void) dup2(i, j); 344c80476e4SDavid E. O'Brien if (j != i) 345c80476e4SDavid E. O'Brien (void) close(i); 346c80476e4SDavid E. O'Brien return (j); 347c80476e4SDavid E. O'Brien } 348c80476e4SDavid E. O'Brien #endif 349c80476e4SDavid E. O'Brien j = dcopy(i, j); 350c80476e4SDavid E. O'Brien if (j != i) 351c80476e4SDavid E. O'Brien (void) close(i); 352c80476e4SDavid E. O'Brien return (j); 353c80476e4SDavid E. O'Brien } 354c80476e4SDavid E. O'Brien 355c80476e4SDavid E. O'Brien int 356c80476e4SDavid E. O'Brien dcopy(i, j) 357c80476e4SDavid E. O'Brien register int i, j; 358c80476e4SDavid E. O'Brien { 359c80476e4SDavid E. O'Brien 360c80476e4SDavid E. O'Brien if (i == j || i < 0 || (j < 0 && i > 2)) 361c80476e4SDavid E. O'Brien return (i); 362c80476e4SDavid E. O'Brien if (j >= 0) { 363c80476e4SDavid E. O'Brien #ifdef HAVEDUP2 364c80476e4SDavid E. O'Brien (void) dup2(i, j); 365c80476e4SDavid E. O'Brien return (j); 366c80476e4SDavid E. O'Brien #else 367c80476e4SDavid E. O'Brien (void) close(j); 368c80476e4SDavid E. O'Brien #endif 369c80476e4SDavid E. O'Brien } 370c80476e4SDavid E. O'Brien return (renum(i, j)); 371c80476e4SDavid E. O'Brien } 372c80476e4SDavid E. O'Brien 373c80476e4SDavid E. O'Brien static int 374c80476e4SDavid E. O'Brien renum(i, j) 375c80476e4SDavid E. O'Brien register int i, j; 376c80476e4SDavid E. O'Brien { 377c80476e4SDavid E. O'Brien register int k = dup(i); 378c80476e4SDavid E. O'Brien 379c80476e4SDavid E. O'Brien if (k < 0) 380c80476e4SDavid E. O'Brien return (-1); 381c80476e4SDavid E. O'Brien if (j == -1 && k > 2) 382c80476e4SDavid E. O'Brien return (k); 383c80476e4SDavid E. O'Brien if (k != j) { 384c80476e4SDavid E. O'Brien j = renum(k, j); 385c80476e4SDavid E. O'Brien (void) close(k); 386c80476e4SDavid E. O'Brien return (j); 387c80476e4SDavid E. O'Brien } 388c80476e4SDavid E. O'Brien return (k); 389c80476e4SDavid E. O'Brien } 390c80476e4SDavid E. O'Brien 391c80476e4SDavid E. O'Brien /* 392c80476e4SDavid E. O'Brien * Left shift a command argument list, discarding 393c80476e4SDavid E. O'Brien * the first c arguments. Used in "shift" commands 394c80476e4SDavid E. O'Brien * as well as by commands like "repeat". 395c80476e4SDavid E. O'Brien */ 396c80476e4SDavid E. O'Brien void 397c80476e4SDavid E. O'Brien lshift(v, c) 398c80476e4SDavid E. O'Brien register Char **v; 399c80476e4SDavid E. O'Brien register int c; 400c80476e4SDavid E. O'Brien { 401c80476e4SDavid E. O'Brien register Char **u; 402c80476e4SDavid E. O'Brien 403c80476e4SDavid E. O'Brien for (u = v; *u && --c >= 0; u++) 404c80476e4SDavid E. O'Brien xfree((ptr_t) *u); 405c80476e4SDavid E. O'Brien (void) blkcpy(v, u); 406c80476e4SDavid E. O'Brien } 407c80476e4SDavid E. O'Brien 408c80476e4SDavid E. O'Brien int 409c80476e4SDavid E. O'Brien number(cp) 410c80476e4SDavid E. O'Brien Char *cp; 411c80476e4SDavid E. O'Brien { 412c80476e4SDavid E. O'Brien if (!cp) 413c80476e4SDavid E. O'Brien return (0); 414c80476e4SDavid E. O'Brien if (*cp == '-') { 415c80476e4SDavid E. O'Brien cp++; 416c80476e4SDavid E. O'Brien if (!Isdigit(*cp)) 417c80476e4SDavid E. O'Brien return (0); 418c80476e4SDavid E. O'Brien cp++; 419c80476e4SDavid E. O'Brien } 420c80476e4SDavid E. O'Brien while (*cp && Isdigit(*cp)) 421c80476e4SDavid E. O'Brien cp++; 422c80476e4SDavid E. O'Brien return (*cp == 0); 423c80476e4SDavid E. O'Brien } 424c80476e4SDavid E. O'Brien 425c80476e4SDavid E. O'Brien Char ** 426c80476e4SDavid E. O'Brien copyblk(v) 427c80476e4SDavid E. O'Brien register Char **v; 428c80476e4SDavid E. O'Brien { 429c80476e4SDavid E. O'Brien register Char **nv = 430c80476e4SDavid E. O'Brien (Char **) xcalloc((size_t) (blklen(v) + 1), sizeof(Char **)); 431c80476e4SDavid E. O'Brien 432c80476e4SDavid E. O'Brien return (blkcpy(nv, v)); 433c80476e4SDavid E. O'Brien } 434c80476e4SDavid E. O'Brien 435c80476e4SDavid E. O'Brien #ifndef SHORT_STRINGS 436c80476e4SDavid E. O'Brien char * 437c80476e4SDavid E. O'Brien strend(cp) 438c80476e4SDavid E. O'Brien register char *cp; 439c80476e4SDavid E. O'Brien { 440c80476e4SDavid E. O'Brien if (!cp) 441c80476e4SDavid E. O'Brien return (cp); 442c80476e4SDavid E. O'Brien while (*cp) 443c80476e4SDavid E. O'Brien cp++; 444c80476e4SDavid E. O'Brien return (cp); 445c80476e4SDavid E. O'Brien } 446c80476e4SDavid E. O'Brien 447c80476e4SDavid E. O'Brien #endif /* SHORT_STRINGS */ 448c80476e4SDavid E. O'Brien 449c80476e4SDavid E. O'Brien Char * 450c80476e4SDavid E. O'Brien strip(cp) 451c80476e4SDavid E. O'Brien Char *cp; 452c80476e4SDavid E. O'Brien { 453c80476e4SDavid E. O'Brien register Char *dp = cp; 454c80476e4SDavid E. O'Brien 455c80476e4SDavid E. O'Brien if (!cp) 456c80476e4SDavid E. O'Brien return (cp); 457c80476e4SDavid E. O'Brien while ((*dp++ &= TRIM) != '\0') 458c80476e4SDavid E. O'Brien continue; 459c80476e4SDavid E. O'Brien return (cp); 460c80476e4SDavid E. O'Brien } 461c80476e4SDavid E. O'Brien 462c80476e4SDavid E. O'Brien Char * 463c80476e4SDavid E. O'Brien quote(cp) 464c80476e4SDavid E. O'Brien Char *cp; 465c80476e4SDavid E. O'Brien { 466c80476e4SDavid E. O'Brien register Char *dp = cp; 467c80476e4SDavid E. O'Brien 468c80476e4SDavid E. O'Brien if (!cp) 469c80476e4SDavid E. O'Brien return (cp); 470c80476e4SDavid E. O'Brien while (*dp != '\0') 471c80476e4SDavid E. O'Brien *dp++ |= QUOTE; 472c80476e4SDavid E. O'Brien return (cp); 473c80476e4SDavid E. O'Brien } 474c80476e4SDavid E. O'Brien 475c80476e4SDavid E. O'Brien Char * 476c80476e4SDavid E. O'Brien quote_meta(d, s) 477c80476e4SDavid E. O'Brien Char *d; 478c80476e4SDavid E. O'Brien const Char *s; 479c80476e4SDavid E. O'Brien { 480c80476e4SDavid E. O'Brien Char *r = d; 481c80476e4SDavid E. O'Brien while (*s != '\0') { 482c80476e4SDavid E. O'Brien if (cmap(*s, _META | _DOL | _QF | _QB | _ESC | _GLOB)) 483c80476e4SDavid E. O'Brien *d++ = '\\'; 484c80476e4SDavid E. O'Brien *d++ = *s++; 485c80476e4SDavid E. O'Brien } 486c80476e4SDavid E. O'Brien *d = '\0'; 487c80476e4SDavid E. O'Brien return r; 488c80476e4SDavid E. O'Brien } 489c80476e4SDavid E. O'Brien 490c80476e4SDavid E. O'Brien void 491c80476e4SDavid E. O'Brien udvar(name) 492c80476e4SDavid E. O'Brien Char *name; 493c80476e4SDavid E. O'Brien { 494c80476e4SDavid E. O'Brien 495c80476e4SDavid E. O'Brien setname(short2str(name)); 496c80476e4SDavid E. O'Brien stderror(ERR_NAME | ERR_UNDVAR); 497c80476e4SDavid E. O'Brien } 498c80476e4SDavid E. O'Brien 499c80476e4SDavid E. O'Brien int 500c80476e4SDavid E. O'Brien prefix(sub, str) 501c80476e4SDavid E. O'Brien register Char *sub, *str; 502c80476e4SDavid E. O'Brien { 503c80476e4SDavid E. O'Brien 504c80476e4SDavid E. O'Brien for (;;) { 505c80476e4SDavid E. O'Brien if (*sub == 0) 506c80476e4SDavid E. O'Brien return (1); 507c80476e4SDavid E. O'Brien if (*str == 0) 508c80476e4SDavid E. O'Brien return (0); 509c80476e4SDavid E. O'Brien if ((*sub++ & TRIM) != (*str++ & TRIM)) 510c80476e4SDavid E. O'Brien return (0); 511c80476e4SDavid E. O'Brien } 512c80476e4SDavid E. O'Brien } 513