Annotation of embedaddon/readline/shell.c, revision 1.1.1.1

1.1       misho       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-2009 Free Software Foundation, Inc.
                      5: 
                      6:    This file is part of the GNU Readline Library (Readline), a library
                      7:    for reading lines of text with interactive input and history editing.      
                      8: 
                      9:    Readline is free software: you can redistribute it and/or modify
                     10:    it under the terms of the GNU General Public License as published by
                     11:    the Free Software Foundation, either version 3 of the License, or
                     12:    (at your option) any later version.
                     13: 
                     14:    Readline is distributed in the hope that it will be useful,
                     15:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     16:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     17:    GNU General Public License for more details.
                     18: 
                     19:    You should have received a copy of the GNU General Public License
                     20:    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
                     21: */
                     22: 
                     23: #define READLINE_LIBRARY
                     24: 
                     25: #if defined (HAVE_CONFIG_H)
                     26: #  include <config.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 "rldefs.h"
                     63: 
                     64: #include "xmalloc.h"
                     65: 
                     66: #if defined (HAVE_GETPWUID) && !defined (HAVE_GETPW_DECLS)
                     67: extern struct passwd *getpwuid PARAMS((uid_t));
                     68: #endif /* HAVE_GETPWUID && !HAVE_GETPW_DECLS */
                     69: 
                     70: #ifndef NULL
                     71: #  define NULL 0
                     72: #endif
                     73: 
                     74: #ifndef CHAR_BIT
                     75: #  define CHAR_BIT 8
                     76: #endif
                     77: 
                     78: /* Nonzero if the integer type T is signed.  */
                     79: #define TYPE_SIGNED(t) (! ((t) 0 < (t) -1))
                     80: 
                     81: /* Bound on length of the string representing an integer value of type T.
                     82:    Subtract one for the sign bit if T is signed;
                     83:    302 / 1000 is log10 (2) rounded up;
                     84:    add one for integer division truncation;
                     85:    add one more for a minus sign if t is signed.  */
                     86: #define INT_STRLEN_BOUND(t) \
                     87:   ((sizeof (t) * CHAR_BIT - TYPE_SIGNED (t)) * 302 / 1000 \
                     88:    + 1 + TYPE_SIGNED (t))
                     89: 
                     90: /* All of these functions are resolved from bash if we are linking readline
                     91:    as part of bash. */
                     92: 
                     93: /* Does shell-like quoting using single quotes. */
                     94: char *
                     95: sh_single_quote (string)
                     96:      char *string;
                     97: {
                     98:   register int c;
                     99:   char *result, *r, *s;
                    100: 
                    101:   result = (char *)xmalloc (3 + (4 * strlen (string)));
                    102:   r = result;
                    103:   *r++ = '\'';
                    104: 
                    105:   for (s = string; s && (c = *s); s++)
                    106:     {
                    107:       *r++ = c;
                    108: 
                    109:       if (c == '\'')
                    110:        {
                    111:          *r++ = '\\';  /* insert escaped single quote */
                    112:          *r++ = '\'';
                    113:          *r++ = '\'';  /* start new quoted string */
                    114:        }
                    115:     }
                    116: 
                    117:   *r++ = '\'';
                    118:   *r = '\0';
                    119: 
                    120:   return (result);
                    121: }
                    122: 
                    123: /* Set the environment variables LINES and COLUMNS to lines and cols,
                    124:    respectively. */
                    125: static char setenv_buf[INT_STRLEN_BOUND (int) + 1];
                    126: static char putenv_buf1[INT_STRLEN_BOUND (int) + 6 + 1];       /* sizeof("LINES=") == 6 */
                    127: static char putenv_buf2[INT_STRLEN_BOUND (int) + 8 + 1];       /* sizeof("COLUMNS=") == 8 */
                    128: 
                    129: void
                    130: sh_set_lines_and_columns (lines, cols)
                    131:      int lines, cols;
                    132: {
                    133: #if defined (HAVE_SETENV)
                    134:   sprintf (setenv_buf, "%d", lines);
                    135:   setenv ("LINES", setenv_buf, 1);
                    136: 
                    137:   sprintf (setenv_buf, "%d", cols);
                    138:   setenv ("COLUMNS", setenv_buf, 1);
                    139: #else /* !HAVE_SETENV */
                    140: #  if defined (HAVE_PUTENV)
                    141:   sprintf (putenv_buf1, "LINES=%d", lines);
                    142:   putenv (putenv_buf1);
                    143: 
                    144:   sprintf (putenv_buf2, "COLUMNS=%d", cols);
                    145:   putenv (putenv_buf2);
                    146: #  endif /* HAVE_PUTENV */
                    147: #endif /* !HAVE_SETENV */
                    148: }
                    149: 
                    150: char *
                    151: sh_get_env_value (varname)
                    152:      const char *varname;
                    153: {
                    154:   return ((char *)getenv (varname));
                    155: }
                    156: 
                    157: char *
                    158: sh_get_home_dir ()
                    159: {
                    160:   static char *home_dir = (char *)NULL;
                    161:   struct passwd *entry;
                    162: 
                    163:   if (home_dir)
                    164:     return (home_dir);
                    165: 
                    166:   home_dir = (char *)NULL;
                    167: #if defined (HAVE_GETPWUID)
                    168: #  if defined (__TANDEM)
                    169:   entry = getpwnam (getlogin ());
                    170: #  else
                    171:   entry = getpwuid (getuid ());
                    172: #  endif
                    173:   if (entry)
                    174:     home_dir = savestring (entry->pw_dir);
                    175: #endif
                    176: 
                    177: #if defined (HAVE_GETPWENT)
                    178:   endpwent ();         /* some systems need this */
                    179: #endif
                    180: 
                    181:   return (home_dir);
                    182: }
                    183: 
                    184: #if !defined (O_NDELAY)
                    185: #  if defined (FNDELAY)
                    186: #    define O_NDELAY FNDELAY
                    187: #  endif
                    188: #endif
                    189: 
                    190: int
                    191: sh_unset_nodelay_mode (fd)
                    192:      int fd;
                    193: {
                    194: #if defined (HAVE_FCNTL)
                    195:   int flags, bflags;
                    196: 
                    197:   if ((flags = fcntl (fd, F_GETFL, 0)) < 0)
                    198:     return -1;
                    199: 
                    200:   bflags = 0;
                    201: 
                    202: #ifdef O_NONBLOCK
                    203:   bflags |= O_NONBLOCK;
                    204: #endif
                    205: 
                    206: #ifdef O_NDELAY
                    207:   bflags |= O_NDELAY;
                    208: #endif
                    209: 
                    210:   if (flags & bflags)
                    211:     {
                    212:       flags &= ~bflags;
                    213:       return (fcntl (fd, F_SETFL, flags));
                    214:     }
                    215: #endif
                    216: 
                    217:   return 0;
                    218: }

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>