Annotation of embedaddon/readline/shell.c, revision 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>