| /* | |
| * 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; | |
| } |