| /* |
| * rlcat - cat(1) using readline |
| * |
| * usage: rlcat |
| */ |
| |
| /* Copyright (C) 1987-2009 Free Software Foundation, Inc. |
| |
| This file is part of the GNU Readline Library (Readline), a library for |
| reading lines of text with interactive input and history editing. |
| |
| Readline is free software: you can redistribute it and/or modify |
| it under the terms of the GNU General Public License as published by |
| the Free Software Foundation, either version 3 of the License, or |
| (at your option) any later version. |
| |
| Readline is distributed in the hope that it will be useful, |
| but WITHOUT ANY WARRANTY; without even the implied warranty of |
| MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
| GNU General Public License for more details. |
| |
| You should have received a copy of the GNU General Public License |
| along with Readline. If not, see <http://www.gnu.org/licenses/>. |
| */ |
| |
| #if defined (HAVE_CONFIG_H) |
| # include <config.h> |
| #endif |
| |
| #ifdef HAVE_UNISTD_H |
| # include <unistd.h> |
| #endif |
| |
| #include <sys/types.h> |
| #include "posixstat.h" |
| |
| #include <stdio.h> |
| #include <ctype.h> |
| #include <string.h> |
| #include <errno.h> |
| |
| #ifdef HAVE_STDLIB_H |
| # include <stdlib.h> |
| #else |
| extern void exit(); |
| #endif |
| |
| #ifndef errno |
| extern int errno; |
| #endif |
| |
| #if defined (READLINE_LIBRARY) |
| # include "readline.h" |
| # include "history.h" |
| #else |
| # include <readline/readline.h> |
| # include <readline/history.h> |
| #endif |
| |
| extern int optind; |
| extern char *optarg; |
| |
| static int stdcat(); |
| |
| static char *progname; |
| static int vflag; |
| |
| static void |
| usage() |
| { |
| fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname); |
| } |
| |
| int |
| main (argc, argv) |
| int argc; |
| char **argv; |
| { |
| char *temp; |
| int opt, Vflag, Nflag; |
| |
| progname = strrchr(argv[0], '/'); |
| if (progname == 0) |
| progname = argv[0]; |
| else |
| progname++; |
| |
| vflag = Vflag = Nflag = 0; |
| while ((opt = getopt(argc, argv, "vEVN")) != EOF) |
| { |
| switch (opt) |
| { |
| case 'v': |
| vflag = 1; |
| break; |
| case 'V': |
| Vflag = 1; |
| break; |
| case 'E': |
| Vflag = 0; |
| break; |
| case 'N': |
| Nflag = 1; |
| break; |
| default: |
| usage (); |
| exit (2); |
| } |
| } |
| |
| argc -= optind; |
| argv += optind; |
| |
| if (isatty(0) == 0 || argc || Nflag) |
| return stdcat(argc, argv); |
| |
| rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs"); |
| while (temp = readline ("")) |
| { |
| if (*temp) |
| add_history (temp); |
| printf ("%s\n", temp); |
| } |
| |
| return (ferror (stdout)); |
| } |
| |
| static int |
| fcopy(fp) |
| FILE *fp; |
| { |
| int c; |
| char *x; |
| |
| while ((c = getc(fp)) != EOF) |
| { |
| if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0) |
| { |
| x = rl_untranslate_keyseq (c); |
| if (fputs (x, stdout) != 0) |
| return 1; |
| } |
| else if (putchar (c) == EOF) |
| return 1; |
| } |
| return (ferror (stdout)); |
| } |
| |
| int |
| stdcat (argc, argv) |
| int argc; |
| char **argv; |
| { |
| int i, fd, r; |
| char *s; |
| FILE *fp; |
| |
| if (argc == 0) |
| return (fcopy(stdin)); |
| |
| for (i = 0, r = 1; i < argc; i++) |
| { |
| if (*argv[i] == '-' && argv[i][1] == 0) |
| fp = stdin; |
| else |
| { |
| fp = fopen (argv[i], "r"); |
| if (fp == 0) |
| { |
| fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno)); |
| continue; |
| } |
| } |
| r = fcopy (fp); |
| if (fp != stdin) |
| fclose(fp); |
| } |
| return r; |
| } |