annotate readline/tilde.c @ 1523:c90e48a49a44

[project @ 1995-10-04 06:24:40 by jwe]
author jwe
date Wed, 04 Oct 1995 06:25:25 +0000
parents cd2b52fb9019
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
1432
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
1 /* tilde.c -- Tilde expansion code (~/foo := $HOME/foo). */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
2
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
3 /* Copyright (C) 1988,1989 Free Software Foundation, Inc.
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
4
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
5 This file is part of GNU Readline, a library for reading lines
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
6 of text with interactive input and history editing.
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
7
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
8 Readline is free software; you can redistribute it and/or modify it
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
9 under the terms of the GNU General Public License as published by the
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
10 Free Software Foundation; either version 1, or (at your option) any
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
11 later version.
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
12
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
13 Readline is distributed in the hope that it will be useful, but
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
14 WITHOUT ANY WARRANTY; without even the implied warranty of
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
15 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
16 General Public License for more details.
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
17
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
18 You should have received a copy of the GNU General Public License
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
19 along with Readline; see the file COPYING. If not, write to the Free
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
20 Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
21
1438
cd2b52fb9019 [project @ 1995-09-19 08:00:23 by jwe]
jwe
parents: 1432
diff changeset
22 #ifdef HAVE_CONFIG_H
cd2b52fb9019 [project @ 1995-09-19 08:00:23 by jwe]
jwe
parents: 1432
diff changeset
23 #include <config.h>
cd2b52fb9019 [project @ 1995-09-19 08:00:23 by jwe]
jwe
parents: 1432
diff changeset
24 #endif
cd2b52fb9019 [project @ 1995-09-19 08:00:23 by jwe]
jwe
parents: 1432
diff changeset
25
1432
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
26 #if defined (HAVE_STRING_H)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
27 # include <string.h>
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
28 #else /* !HAVE_STRING_H */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
29 # include <strings.h>
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
30 #endif /* !HAVE_STRING_H */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
31
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
32 #if defined (HAVE_STDLIB_H)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
33 # include <stdlib.h>
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
34 #else
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
35 # include "ansi_stdlib.h"
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
36 #endif /* HAVE_STDLIB_H */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
37
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
38 #include "tilde.h"
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
39 #include <sys/types.h>
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
40 #include <pwd.h>
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
41
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
42 #if defined (USG) && !defined (HAVE_GETPW_DECLS)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
43 extern struct passwd *getpwuid (), *getpwnam ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
44 #endif /* USG && !defined (HAVE_GETPW_DECLS) */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
45
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
46 #if !defined (savestring)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
47 extern char *xmalloc ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
48 # ifndef strcpy
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
49 extern char *strcpy ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
50 # endif
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
51 #define savestring(x) strcpy (xmalloc (1 + strlen (x)), (x))
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
52 #endif /* !savestring */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
53
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
54 #if !defined (NULL)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
55 # if defined (__STDC__)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
56 # define NULL ((void *) 0)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
57 # else
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
58 # define NULL 0x0
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
59 # endif /* !__STDC__ */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
60 #endif /* !NULL */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
61
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
62 #if defined (TEST) || defined (STATIC_MALLOC)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
63 static char *xmalloc (), *xrealloc ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
64 #else
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
65 extern char *xmalloc (), *xrealloc ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
66 #endif /* TEST || STATIC_MALLOC */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
67
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
68 /* The default value of tilde_additional_prefixes. This is set to
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
69 whitespace preceding a tilde so that simple programs which do not
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
70 perform any word separation get desired behaviour. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
71 static char *default_prefixes[] =
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
72 { " ~", "\t~", (char *)NULL };
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
73
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
74 /* The default value of tilde_additional_suffixes. This is set to
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
75 whitespace or newline so that simple programs which do not
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
76 perform any word separation get desired behaviour. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
77 static char *default_suffixes[] =
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
78 { " ", "\n", (char *)NULL };
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
79
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
80 /* If non-null, this contains the address of a function to call if the
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
81 standard meaning for expanding a tilde fails. The function is called
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
82 with the text (sans tilde, as in "foo"), and returns a malloc()'ed string
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
83 which is the expansion, or a NULL pointer if there is no expansion. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
84 CPFunction *tilde_expansion_failure_hook = (CPFunction *)NULL;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
85
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
86 /* When non-null, this is a NULL terminated array of strings which
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
87 are duplicates for a tilde prefix. Bash uses this to expand
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
88 `=~' and `:~'. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
89 char **tilde_additional_prefixes = default_prefixes;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
90
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
91 /* When non-null, this is a NULL terminated array of strings which match
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
92 the end of a username, instead of just "/". Bash sets this to
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
93 `:' and `=~'. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
94 char **tilde_additional_suffixes = default_suffixes;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
95
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
96 /* Find the start of a tilde expansion in STRING, and return the index of
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
97 the tilde which starts the expansion. Place the length of the text
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
98 which identified this tilde starter in LEN, excluding the tilde itself. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
99 static int
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
100 tilde_find_prefix (string, len)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
101 char *string;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
102 int *len;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
103 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
104 register int i, j, string_len;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
105 register char **prefixes = tilde_additional_prefixes;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
106
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
107 string_len = strlen (string);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
108 *len = 0;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
109
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
110 if (!*string || *string == '~')
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
111 return (0);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
112
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
113 if (prefixes)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
114 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
115 for (i = 0; i < string_len; i++)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
116 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
117 for (j = 0; prefixes[j]; j++)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
118 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
119 if (strncmp (string + i, prefixes[j], strlen (prefixes[j])) == 0)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
120 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
121 *len = strlen (prefixes[j]) - 1;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
122 return (i + *len);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
123 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
124 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
125 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
126 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
127 return (string_len);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
128 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
129
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
130 /* Find the end of a tilde expansion in STRING, and return the index of
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
131 the character which ends the tilde definition. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
132 static int
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
133 tilde_find_suffix (string)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
134 char *string;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
135 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
136 register int i, j, string_len;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
137 register char **suffixes = tilde_additional_suffixes;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
138
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
139 string_len = strlen (string);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
140
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
141 for (i = 0; i < string_len; i++)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
142 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
143 if (string[i] == '/' || !string[i])
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
144 break;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
145
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
146 for (j = 0; suffixes && suffixes[j]; j++)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
147 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
148 if (strncmp (string + i, suffixes[j], strlen (suffixes[j])) == 0)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
149 return (i);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
150 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
151 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
152 return (i);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
153 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
154
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
155 /* Return a new string which is the result of tilde expanding STRING. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
156 char *
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
157 tilde_expand (string)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
158 char *string;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
159 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
160 char *result, *tilde_expand_word ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
161 int result_size, result_index;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
162
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
163 result_size = result_index = 0;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
164 result = (char *)NULL;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
165
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
166 /* Scan through STRING expanding tildes as we come to them. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
167 while (1)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
168 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
169 register int start, end;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
170 char *tilde_word, *expansion;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
171 int len;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
172
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
173 /* Make START point to the tilde which starts the expansion. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
174 start = tilde_find_prefix (string, &len);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
175
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
176 /* Copy the skipped text into the result. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
177 if ((result_index + start + 1) > result_size)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
178 result = (char *)xrealloc (result, 1 + (result_size += (start + 20)));
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
179
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
180 strncpy (result + result_index, string, start);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
181 result_index += start;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
182
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
183 /* Advance STRING to the starting tilde. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
184 string += start;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
185
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
186 /* Make END be the index of one after the last character of the
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
187 username. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
188 end = tilde_find_suffix (string);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
189
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
190 /* If both START and END are zero, we are all done. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
191 if (!start && !end)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
192 break;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
193
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
194 /* Expand the entire tilde word, and copy it into RESULT. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
195 tilde_word = (char *)xmalloc (1 + end);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
196 strncpy (tilde_word, string, end);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
197 tilde_word[end] = '\0';
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
198 string += end;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
199
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
200 expansion = tilde_expand_word (tilde_word);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
201 free (tilde_word);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
202
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
203 len = strlen (expansion);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
204 if ((result_index + len + 1) > result_size)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
205 result = (char *)xrealloc (result, 1 + (result_size += (len + 20)));
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
206
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
207 strcpy (result + result_index, expansion);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
208 result_index += len;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
209 free (expansion);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
210 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
211
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
212 result[result_index] = '\0';
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
213
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
214 return (result);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
215 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
216
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
217 /* Do the work of tilde expansion on FILENAME. FILENAME starts with a
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
218 tilde. If there is no expansion, call tilde_expansion_failure_hook. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
219 char *
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
220 tilde_expand_word (filename)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
221 char *filename;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
222 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
223 char *dirname;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
224
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
225 dirname = filename ? savestring (filename) : (char *)NULL;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
226
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
227 if (dirname && *dirname == '~')
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
228 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
229 char *temp_name;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
230 if (!dirname[1] || dirname[1] == '/')
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
231 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
232 /* Prepend $HOME to the rest of the string. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
233 char *temp_home = (char *)getenv ("HOME");
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
234
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
235 /* If there is no HOME variable, look up the directory in
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
236 the password database. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
237 if (!temp_home)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
238 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
239 struct passwd *entry;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
240
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
241 entry = getpwuid (getuid ());
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
242 if (entry)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
243 temp_home = entry->pw_dir;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
244 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
245
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
246 temp_name = xmalloc (1 + strlen (&dirname[1])
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
247 + (temp_home ? strlen (temp_home) : 0));
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
248 temp_name[0] = '\0';
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
249 if (temp_home)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
250 strcpy (temp_name, temp_home);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
251 strcat (temp_name, dirname + 1);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
252 free (dirname);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
253 dirname = temp_name;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
254 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
255 else
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
256 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
257 char *username;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
258 struct passwd *user_entry;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
259 int i;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
260
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
261 username = xmalloc (strlen (dirname));
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
262 for (i = 1; dirname[i] && dirname[i] != '/'; i++)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
263 username[i - 1] = dirname[i];
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
264 username[i - 1] = '\0';
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
265
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
266 if ((user_entry = getpwnam (username)) == 0)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
267 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
268 /* If the calling program has a special syntax for
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
269 expanding tildes, and we couldn't find a standard
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
270 expansion, then let them try. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
271 if (tilde_expansion_failure_hook)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
272 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
273 char *expansion;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
274
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
275 expansion = (*tilde_expansion_failure_hook) (username);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
276
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
277 if (expansion)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
278 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
279 temp_name = xmalloc (1 + strlen (expansion)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
280 + strlen (&dirname[i]));
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
281 strcpy (temp_name, expansion);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
282 strcat (temp_name, &dirname[i]);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
283 free (expansion);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
284 free (dirname);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
285 dirname = temp_name;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
286 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
287 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
288 /* We shouldn't report errors. */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
289 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
290 else
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
291 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
292 temp_name = xmalloc (1 + strlen (user_entry->pw_dir)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
293 + strlen (&dirname[i]));
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
294 strcpy (temp_name, user_entry->pw_dir);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
295 strcat (temp_name, &dirname[i]);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
296 free (dirname);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
297 dirname = temp_name;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
298 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
299 endpwent ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
300 free (username);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
301 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
302 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
303 return (dirname);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
304 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
305
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
306
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
307 #if defined (TEST)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
308 #undef NULL
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
309 #include <stdio.h>
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
310
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
311 main (argc, argv)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
312 int argc;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
313 char **argv;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
314 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
315 char *result, line[512];
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
316 int done = 0;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
317
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
318 while (!done)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
319 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
320 printf ("~expand: ");
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
321 fflush (stdout);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
322
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
323 if (!gets (line))
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
324 strcpy (line, "done");
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
325
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
326 if ((strcmp (line, "done") == 0) ||
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
327 (strcmp (line, "quit") == 0) ||
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
328 (strcmp (line, "exit") == 0))
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
329 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
330 done = 1;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
331 break;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
332 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
333
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
334 result = tilde_expand (line);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
335 printf (" --> %s\n", result);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
336 free (result);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
337 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
338 exit (0);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
339 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
340
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
341 static void memory_error_and_abort ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
342
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
343 static char *
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
344 xmalloc (bytes)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
345 int bytes;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
346 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
347 char *temp = (char *)malloc (bytes);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
348
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
349 if (!temp)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
350 memory_error_and_abort ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
351 return (temp);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
352 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
353
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
354 static char *
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
355 xrealloc (pointer, bytes)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
356 char *pointer;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
357 int bytes;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
358 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
359 char *temp;
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
360
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
361 if (!pointer)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
362 temp = (char *)malloc (bytes);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
363 else
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
364 temp = (char *)realloc (pointer, bytes);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
365
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
366 if (!temp)
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
367 memory_error_and_abort ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
368
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
369 return (temp);
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
370 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
371
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
372 static void
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
373 memory_error_and_abort ()
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
374 {
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
375 fprintf (stderr, "readline: Out of virtual memory!\n");
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
376 abort ();
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
377 }
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
378
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
379 /*
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
380 * Local variables:
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
381 * compile-command: "gcc -g -DTEST -o tilde tilde.c"
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
382 * end:
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
383 */
4c3d46b02f99 [project @ 1995-09-19 07:20:14 by jwe]
jwe
parents:
diff changeset
384 #endif /* TEST */