Annotation of embedaddon/readline/examples/rlcat.c, revision 1.1.1.1
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);
140: if (fputs (x, stdout) != 0)
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>