]> git.ipfire.org Git - thirdparty/bash.git/blame - lib/readline/shell.c
Imported from ../bash-3.1.tar.gz.
[thirdparty/bash.git] / lib / readline / shell.c
CommitLineData
d166f048
JA
1/* shell.c -- readline utility functions that are normally provided by
2 bash when readline is linked as part of the shell. */
3
4/* Copyright (C) 1997 Free Software Foundation, Inc.
5
6 This file is part of the GNU Readline Library, a library for
7 reading lines of text with interactive input and history editing.
8
9 The GNU Readline Library is free software; you can redistribute it
10 and/or modify it under the terms of the GNU General Public License
bb70624e 11 as published by the Free Software Foundation; either version 2, or
d166f048
JA
12 (at your option) any later version.
13
14 The GNU Readline Library is distributed in the hope that it will be
15 useful, but WITHOUT ANY WARRANTY; without even the implied warranty
16 of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 The GNU General Public License is often shipped with GNU software, and
20 is generally kept in a file called COPYING or LICENSE. If you do not
21 have a copy of the license, write to the Free Software Foundation,
bb70624e 22 59 Temple Place, Suite 330, Boston, MA 02111 USA. */
d166f048
JA
23#define READLINE_LIBRARY
24
25#if defined (HAVE_CONFIG_H)
26# include <config.h>
27#endif
28
b72432fd
JA
29#include <sys/types.h>
30
d166f048
JA
31#if defined (HAVE_UNISTD_H)
32# include <unistd.h>
33#endif /* HAVE_UNISTD_H */
34
35#if defined (HAVE_STDLIB_H)
36# include <stdlib.h>
37#else
38# include "ansi_stdlib.h"
39#endif /* HAVE_STDLIB_H */
40
cce855bc
JA
41#if defined (HAVE_STRING_H)
42# include <string.h>
43#else
44# include <strings.h>
45#endif /* !HAVE_STRING_H */
46
f73dda09
JA
47#if defined (HAVE_LIMITS_H)
48# include <limits.h>
49#endif
50
95732b49 51#if defined (HAVE_FCNTL_H)
bb70624e 52#include <fcntl.h>
95732b49
JA
53#endif
54#if defined (HAVE_PWD_H)
b72432fd 55#include <pwd.h>
95732b49 56#endif
d166f048 57
bb70624e
JA
58#include <stdio.h>
59
28ef6c31 60#include "rlstdc.h"
bb70624e
JA
61#include "rlshell.h"
62#include "xmalloc.h"
63
95732b49 64#if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS)
f73dda09 65extern struct passwd *getpwuid PARAMS((uid_t));
95732b49 66#endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */
d166f048 67
bb70624e
JA
68#ifndef NULL
69# define NULL 0
70#endif
d166f048 71
f73dda09
JA
72#ifndef CHAR_BIT
73# define CHAR_BIT 8
74#endif
75
76/* Nonzero if the integer type T is signed. */
77#define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
78
79/* Bound on length of the string representing an integer value of type T.
80 Subtract one for the sign bit if T is signed;
81 302 / 1000 is log10 (2) rounded up;
82 add one for integer division truncation;
83 add one more for a minus sign if t is signed. */
84#define INT_STRLEN_BOUND(t) \
85 ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \
86 + 1 + TYPE_SIGNED (t))
87
b72432fd
JA
88/* All of these functions are resolved from bash if we are linking readline
89 as part of bash. */
d166f048
JA
90
91/* Does shell-like quoting using single quotes. */
92char *
28ef6c31 93sh_single_quote (string)
d166f048
JA
94 char *string;
95{
96 register int c;
97 char *result, *r, *s;
98
bb70624e 99 result = (char *)xmalloc (3 + (4 * strlen (string)));
d166f048
JA
100 r = result;
101 *r++ = '\'';
102
103 for (s = string; s && (c = *s); s++)
104 {
105 *r++ = c;
106
107 if (c == '\'')
108 {
109 *r++ = '\\'; /* insert escaped single quote */
110 *r++ = '\'';
111 *r++ = '\''; /* start new quoted string */
112 }
113 }
114
115 *r++ = '\'';
116 *r = '\0';
117
118 return (result);
119}
120
121/* Set the environment variables LINES and COLUMNS to lines and cols,
122 respectively. */
123void
28ef6c31 124sh_set_lines_and_columns (lines, cols)
d166f048
JA
125 int lines, cols;
126{
127 char *b;
128
95732b49 129#if defined (HAVE_SETENV)
f73dda09 130 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
d166f048
JA
131 sprintf (b, "%d", lines);
132 setenv ("LINES", b, 1);
b80f6443
JA
133 free (b);
134
f73dda09 135 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
d166f048
JA
136 sprintf (b, "%d", cols);
137 setenv ("COLUMNS", b, 1);
b80f6443 138 free (b);
95732b49
JA
139#else /* !HAVE_SETENV */
140# if defined (HAVE_PUTENV)
141 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("LINES=") + 1);
142 sprintf (b, "LINES=%d", lines);
143 putenv (b);
144
145 b = (char *)xmalloc (INT_STRLEN_BOUND (int) + sizeof ("COLUMNS=") + 1);
146 sprintf (b, "COLUMNS=%d", cols);
147 putenv (b);
148# endif /* HAVE_PUTENV */
149#endif /* !HAVE_SETENV */
d166f048
JA
150}
151
152char *
28ef6c31
JA
153sh_get_env_value (varname)
154 const char *varname;
d166f048
JA
155{
156 return ((char *)getenv (varname));
157}
158
d166f048 159char *
28ef6c31 160sh_get_home_dir ()
d166f048 161{
b72432fd
JA
162 char *home_dir;
163 struct passwd *entry;
164
165 home_dir = (char *)NULL;
95732b49 166#if defined (HAVE_GETPWUID)
b72432fd
JA
167 entry = getpwuid (getuid ());
168 if (entry)
169 home_dir = entry->pw_dir;
95732b49 170#endif
b72432fd
JA
171 return (home_dir);
172}
bb70624e
JA
173
174#if !defined (O_NDELAY)
175# if defined (FNDELAY)
176# define O_NDELAY FNDELAY
177# endif
178#endif
179
180int
28ef6c31 181sh_unset_nodelay_mode (fd)
bb70624e
JA
182 int fd;
183{
95732b49 184#if defined (HAVE_FCNTL)
bb70624e
JA
185 int flags, bflags;
186
187 if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
188 return -1;
189
190 bflags = 0;
191
192#ifdef O_NONBLOCK
193 bflags |= O_NONBLOCK;
194#endif
195
196#ifdef O_NDELAY
197 bflags |= O_NDELAY;
198#endif
199
200 if (flags & bflags)
201 {
202 flags &= ~bflags;
203 return (fcntl (fd, F_SETFL, flags));
204 }
95732b49 205#endif
bb70624e
JA
206
207 return 0;
208}