xref: /openbsd-src/gnu/lib/libreadline/examples/rlcat.c (revision 15b117eae8ea0caffec2fbd5cbd366a5ccee20ab)
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