~ubuntu-branches/ubuntu/precise/mysql-5.1/precise

« back to all changes in this revision

Viewing changes to cmd-line-utils/readline/shell.c

  • Committer: Bazaar Package Importer
  • Author(s): Norbert Tretkowski
  • Date: 2010-03-17 14:56:02 UTC
  • Revision ID: james.westby@ubuntu.com-20100317145602-x7e30l1b2sb5s6w6
Tags: upstream-5.1.45
ImportĀ upstreamĀ versionĀ 5.1.45

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
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
 
11
   as published by the Free Software Foundation; either version 2, or
 
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,
 
22
   59 Temple Place, Suite 330, Boston, MA 02111 USA. */
 
23
#define READLINE_LIBRARY
 
24
 
 
25
#if defined (HAVE_CONFIG_H)
 
26
#  include "config_readline.h"
 
27
#endif
 
28
 
 
29
#include <sys/types.h>
 
30
 
 
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
 
 
41
#if defined (HAVE_STRING_H)
 
42
#  include <string.h>
 
43
#else
 
44
#  include <strings.h>
 
45
#endif /* !HAVE_STRING_H */
 
46
 
 
47
#if defined (HAVE_LIMITS_H)
 
48
#  include <limits.h>
 
49
#endif
 
50
 
 
51
#if defined (HAVE_FCNTL_H)
 
52
#include <fcntl.h>
 
53
#endif
 
54
#if defined (HAVE_PWD_H)
 
55
#include <pwd.h>
 
56
#endif
 
57
 
 
58
#include <stdio.h>
 
59
 
 
60
#include "rlstdc.h"
 
61
#include "rlshell.h"
 
62
#include "xmalloc.h"
 
63
 
 
64
#if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS)
 
65
extern struct passwd *getpwuid PARAMS((uid_t));
 
66
#endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */
 
67
 
 
68
#ifndef NULL
 
69
#  define NULL 0
 
70
#endif
 
71
 
 
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
 
 
88
/* All of these functions are resolved from bash if we are linking readline
 
89
   as part of bash. */
 
90
 
 
91
/* Does shell-like quoting using single quotes. */
 
92
char *
 
93
sh_single_quote (string)
 
94
     char *string;
 
95
{
 
96
  register int c;
 
97
  char *result, *r, *s;
 
98
 
 
99
  result = (char *)xmalloc (3 + (4 * strlen (string)));
 
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. */
 
123
void
 
124
sh_set_lines_and_columns (lines, cols)
 
125
     int lines, cols;
 
126
{
 
127
  char *b;
 
128
 
 
129
#if defined (HAVE_SETENV)
 
130
  b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
 
131
  sprintf (b, "%d", lines);
 
132
  setenv ("LINES", b, 1);
 
133
  free (b);
 
134
 
 
135
  b = (char *)xmalloc (INT_STRLEN_BOUND (int) + 1);
 
136
  sprintf (b, "%d", cols);
 
137
  setenv ("COLUMNS", b, 1);
 
138
  free (b);
 
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 */
 
150
}
 
151
 
 
152
char *
 
153
sh_get_env_value (varname)
 
154
     const char *varname;
 
155
{
 
156
  return ((char *)getenv (varname));
 
157
}
 
158
 
 
159
char *
 
160
sh_get_home_dir ()
 
161
{
 
162
  char *home_dir;
 
163
  struct passwd *entry;
 
164
 
 
165
  home_dir = (char *)NULL;
 
166
#if defined (HAVE_GETPWUID)
 
167
  entry = getpwuid (getuid ());
 
168
  if (entry)
 
169
    home_dir = entry->pw_dir;
 
170
#endif
 
171
  return (home_dir);
 
172
}
 
173
 
 
174
#if !defined (O_NDELAY)
 
175
#  if defined (FNDELAY)
 
176
#    define O_NDELAY FNDELAY
 
177
#  endif
 
178
#endif
 
179
 
 
180
int
 
181
sh_unset_nodelay_mode (fd)
 
182
     int fd;
 
183
{
 
184
#if defined (HAVE_FCNTL)
 
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
    }
 
205
#endif
 
206
 
 
207
  return 0;
 
208
}