b4942413f8bebb6d08b83e035ce7dde3a9c52bf7
[deliverable/binutils-gdb.git] / readline / examples / rlcat.c
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);
140 if (fputs (x, stdout) == EOF)
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 }
This page took 0.062447 seconds and 3 git commands to generate.