Annotation of embedaddon/readline/examples/rlcat.c, revision 1.1.1.2

1.1       misho       1: /*
                      2:  * rlcat - cat(1) using readline
                      3:  *
                      4:  * usage: rlcat
                      5:  */
                      6: 
                      7: /* Copyright (C) 1987-2009 Free Software Foundation, Inc.
                      8: 
                      9:    This file is part of the GNU Readline Library (Readline), a library for
                     10:    reading lines of text with interactive input and history editing.
                     11: 
                     12:    Readline is free software: you can redistribute it and/or modify
                     13:    it under the terms of the GNU General Public License as published by
                     14:    the Free Software Foundation, either version 3 of the License, or
                     15:    (at your option) any later version.
                     16: 
                     17:    Readline is distributed in the hope that it will be useful,
                     18:    but WITHOUT ANY WARRANTY; without even the implied warranty of
                     19:    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
                     20:    GNU General Public License for more details.
                     21: 
                     22:    You should have received a copy of the GNU General Public License
                     23:    along with Readline.  If not, see <http://www.gnu.org/licenses/>.
                     24: */
                     25: 
                     26: #if defined (HAVE_CONFIG_H)
                     27: #  include <config.h>
                     28: #endif
                     29: 
                     30: #ifdef HAVE_UNISTD_H
                     31: #  include <unistd.h>
                     32: #endif
                     33: 
                     34: #include <sys/types.h>
                     35: #include "posixstat.h"
                     36: 
                     37: #include <stdio.h>
                     38: #include <ctype.h>
                     39: #include <string.h>
                     40: #include <errno.h>
                     41: 
                     42: #ifdef HAVE_STDLIB_H
                     43: #  include <stdlib.h>
                     44: #else 
                     45: extern void exit();
                     46: #endif
                     47: 
                     48: #ifndef errno
                     49: extern int errno;
                     50: #endif
                     51: 
                     52: #if defined (READLINE_LIBRARY)
                     53: #  include "readline.h"
                     54: #  include "history.h"
                     55: #else
                     56: #  include <readline/readline.h>
                     57: #  include <readline/history.h>
                     58: #endif
                     59: 
                     60: extern int optind;
                     61: extern char *optarg;
                     62: 
                     63: static int stdcat();
                     64: 
                     65: static char *progname;
                     66: static int vflag;
                     67: 
                     68: static void
                     69: usage()
                     70: {
                     71:   fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname);
                     72: }
                     73: 
                     74: int
                     75: main (argc, argv)
                     76:      int argc;
                     77:      char **argv;
                     78: {
                     79:   char *temp;
                     80:   int opt, Vflag, Nflag;
                     81: 
                     82:   progname = strrchr(argv[0], '/');
                     83:   if (progname == 0)
                     84:     progname = argv[0];
                     85:   else
                     86:     progname++;
                     87: 
                     88:   vflag = Vflag = Nflag = 0;
                     89:   while ((opt = getopt(argc, argv, "vEVN")) != EOF)
                     90:     {
                     91:       switch (opt)
                     92:        {
                     93:        case 'v':
                     94:          vflag = 1;
                     95:          break;
                     96:        case 'V':
                     97:          Vflag = 1;
                     98:          break;
                     99:        case 'E':
                    100:          Vflag = 0;
                    101:          break;
                    102:        case 'N':
                    103:          Nflag = 1;
                    104:          break;
                    105:        default:
                    106:          usage ();
                    107:          exit (2);
                    108:        }
                    109:     }
                    110: 
                    111:   argc -= optind;
                    112:   argv += optind;
                    113: 
                    114:   if (isatty(0) == 0 || argc || Nflag)
                    115:     return stdcat(argc, argv);
                    116: 
                    117:   rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs");
                    118:   while (temp = readline (""))
                    119:     {
                    120:       if (*temp)
                    121:         add_history (temp);
                    122:       printf ("%s\n", temp);
                    123:     }
                    124: 
                    125:   return (ferror (stdout));
                    126: }
                    127: 
                    128: static int
                    129: fcopy(fp)
                    130:      FILE *fp;
                    131: {
                    132:   int c;
                    133:   char *x;
                    134: 
                    135:   while ((c = getc(fp)) != EOF)
                    136:     {
                    137:       if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0)
                    138:        {
                    139:          x = rl_untranslate_keyseq (c);
1.1.1.2 ! misho     140:          if (fputs (x, stdout) == EOF)
1.1       misho     141:            return 1;
                    142:        }
                    143:       else if (putchar (c) == EOF)
                    144:         return 1;
                    145:     }
                    146:   return (ferror (stdout));
                    147: }
                    148: 
                    149: int
                    150: stdcat (argc, argv)
                    151:      int argc;
                    152:      char **argv;
                    153: {
                    154:   int  i, fd, r;
                    155:   char *s;
                    156:   FILE *fp;
                    157: 
                    158:   if (argc == 0)
                    159:     return (fcopy(stdin));
                    160: 
                    161:   for (i = 0, r = 1; i < argc; i++)
                    162:     {
                    163:       if (*argv[i] == '-' && argv[i][1] == 0)
                    164:        fp = stdin;
                    165:       else
                    166:        {
                    167:          fp = fopen (argv[i], "r");
                    168:          if (fp == 0)
                    169:            {
                    170:              fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno));
                    171:              continue;
                    172:            }
                    173:         }
                    174:       r = fcopy (fp);
                    175:       if (fp != stdin)
                    176:        fclose(fp);
                    177:     }
                    178:   return r;
                    179: }

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