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