alias.c revision dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0
1dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*	$NetBSD: alias.c,v 1.12 2003/08/07 09:05:29 agc Exp $	*/
2dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
3dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*-
4dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Copyright (c) 1993
5dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *	The Regents of the University of California.  All rights reserved.
6dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
7dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * This code is derived from software contributed to Berkeley by
8dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Kenneth Almquist.
9dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
10dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * Redistribution and use in source and binary forms, with or without
11dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * modification, are permitted provided that the following conditions
12dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * are met:
13dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 1. Redistributions of source code must retain the above copyright
14dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer.
15dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright
16dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    notice, this list of conditions and the following disclaimer in the
17dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    documentation and/or other materials provided with the distribution.
18dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * 3. Neither the name of the University nor the names of its contributors
19dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    may be used to endorse or promote products derived from this software
20dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *    without specific prior written permission.
21dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project *
22dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
23dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
24dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
25dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
26dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
27dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
28dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
29dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
30dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
31dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
32dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * SUCH DAMAGE.
33dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
34dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
35dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <sys/cdefs.h>
36dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifndef lint
37dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#if 0
38dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstatic char sccsid[] = "@(#)alias.c	8.3 (Berkeley) 5/4/95";
39dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else
40dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project__RCSID("$NetBSD: alias.c,v 1.12 2003/08/07 09:05:29 agc Exp $");
41dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
42dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif /* not lint */
43dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
44dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include <stdlib.h>
45dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "shell.h"
46dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "input.h"
47dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "output.h"
48dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "error.h"
49dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "memalloc.h"
50dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "mystring.h"
51dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "alias.h"
52dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "options.h"	/* XXX for argptr (should remove?) */
53dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#include "var.h"
54dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
55dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#define ATABSIZE 39
56dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
57dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct alias *atab[ATABSIZE];
58dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
59dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC void setalias(char *, char *);
60dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC int unalias(char *);
61dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC struct alias **hashalias(char *);
62dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
63dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC
64dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
65dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectsetalias(char *name, char *val)
66dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
67dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct alias *ap, **app;
68dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
69dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	app = hashalias(name);
70dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (ap = *app; ap; ap = ap->next) {
71dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (equal(name, ap->name)) {
72dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			INTOFF;
73dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ckfree(ap->val);
74dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ap->val	= savestr(val);
75dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			INTON;
76dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return;
77dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
78dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
79dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	/* not found */
80dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTOFF;
81dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap = ckmalloc(sizeof (struct alias));
82dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap->name = savestr(name);
83dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	/*
84dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * XXX - HACK: in order that the parser will not finish reading the
85dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * alias value off the input before processing the next alias, we
86dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * dummy up an extra space at the end of the alias.  This is a crock
87dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * and should be re-thought.  The idea (if you feel inclined to help)
88dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * is to avoid alias recursions.  The mechanism used is: when
89dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * expanding an alias, the value of the alias is pushed back on the
90dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * input as a string and a pointer to the alias is stored with the
91dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * string.  The alias is marked as being in use.  When the input
92dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * routine finishes reading the string, it markes the alias not
93dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * in use.  The problem is synchronization with the parser.  Since
94dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * it reads ahead, the alias is marked not in use before the
95dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * resulting token(s) is next checked for further alias sub.  The
96dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * H A C K is that we add a little fluff after the alias value
97dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * so that the string will not be exhausted.  This is a good
98dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 * idea ------- ***NOT***
99dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	 */
100dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef notyet
101dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap->val = savestr(val);
102dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#else /* hack */
103dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	{
104dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int len = strlen(val);
105dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap->val = ckmalloc(len + 2);
106dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	memcpy(ap->val, val, len);
107dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap->val[len] = ' ';	/* fluff */
108dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap->val[len+1] = '\0';
109dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
110dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
111dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap->next = *app;
112dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	*app = ap;
113dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTON;
114dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
115dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
116dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC int
117dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectunalias(char *name)
118dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
119dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct alias *ap, **app;
120dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
121dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	app = hashalias(name);
122dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
123dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (ap = *app; ap; app = &(ap->next), ap = ap->next) {
124dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (equal(name, ap->name)) {
125dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			/*
126dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			 * if the alias is currently in use (i.e. its
127dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			 * buffer is being used by the input routine) we
128dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			 * just null out the name instead of freeing it.
129dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			 * We could clear it out later, but this situation
130dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			 * is so rare that it hardly seems worth it.
131dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			 */
132dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (ap->flag & ALIASINUSE)
133dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				*ap->name = '\0';
134dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			else {
135dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				INTOFF;
136dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				*app = ap->next;
137dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				ckfree(ap->name);
138dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				ckfree(ap->val);
139dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				ckfree(ap);
140dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				INTON;
141dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
142dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return (0);
143dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
144dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
145dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
146dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return (1);
147dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
148dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
149dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#ifdef mkinit
150dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectMKINIT void rmaliases(void);
151dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
152dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSHELLPROC {
153dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	rmaliases();
154dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
155dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project#endif
156dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
157dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectvoid
158dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectrmaliases(void)
159dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
160dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct alias *ap, *tmp;
161dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
162dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
163dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTOFF;
164dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (i = 0; i < ATABSIZE; i++) {
165dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		ap = atab[i];
166dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		atab[i] = NULL;
167dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		while (ap) {
168dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ckfree(ap->name);
169dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ckfree(ap->val);
170dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			tmp = ap;
171dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ap = ap->next;
172dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			ckfree(tmp);
173dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
174dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
175dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	INTON;
176dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
177dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
178dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectstruct alias *
179dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectlookupalias(char *name, int check)
180dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
181dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct alias *ap = *hashalias(name);
182dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
183dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (; ap; ap = ap->next) {
184dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (equal(name, ap->name)) {
185dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if (check && (ap->flag & ALIASINUSE))
186dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				return (NULL);
187dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return (ap);
188dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
189dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
190dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
191dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return (NULL);
192dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
193dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
194dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectchar *
195dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectget_alias_text(char *name)
196dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
197dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct alias *ap;
198dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
199dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	ap = lookupalias(name, 0);
200dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (ap == NULL)
201dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return NULL;
202dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return ap->val;
203dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
204dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
205dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project/*
206dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project * TODO - sort output
207dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project */
208dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
209dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectaliascmd(int argc, char **argv)
210dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
211dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	char *n, *v;
212dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int ret = 0;
213dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	struct alias *ap;
214dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
215dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	if (argc == 1) {
216dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		int i;
217dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
218dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		for (i = 0; i < ATABSIZE; i++)
219dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			for (ap = atab[i]; ap; ap = ap->next) {
220dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				if (*ap->name != '\0') {
221dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					out1fmt("alias %s=", ap->name);
222dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					print_quoted(ap->val);
223dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project					out1c('\n');
224dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				}
225dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
226dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		return (0);
227dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
228dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while ((n = *++argv) != NULL) {
229dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if ((v = strchr(n+1, '=')) == NULL) { /* n+1: funny ksh stuff */
230dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			if ((ap = lookupalias(n, 0)) == NULL) {
231dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				outfmt(out2, "alias: %s not found\n", n);
232dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				ret = 1;
233dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			} else {
234dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				out1fmt("alias %s=", n);
235dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				print_quoted(ap->val);
236dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project				out1c('\n');
237dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			}
238dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		} else {
239dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			*v++ = '\0';
240dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			setalias(n, v);
241dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
242dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
243dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
244dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return (ret);
245dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
246dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
247dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectint
248dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projectunaliascmd(int argc, char **argv)
249dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
250dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	int i;
251dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
252dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while ((i = nextopt("a")) != '\0') {
253dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		if (i == 'a') {
254dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			rmaliases();
255dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project			return (0);
256dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		}
257dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	}
258dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	for (i = 0; *argptr; argptr++)
259dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		i = unalias(*argptr);
260dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
261dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return (i);
262dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
263dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
264dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source ProjectSTATIC struct alias **
265dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Projecthashalias(char *p)
266dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project{
267dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	unsigned int hashval;
268dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project
269dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	hashval = *p << 4;
270dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	while (*p)
271dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project		hashval+= *p++;
272dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project	return &atab[hashval % ATABSIZE];
273dd7bc3319deb2b77c5d07a51b7d6cd7e11b5beb0The Android Open Source Project}
274