1/*
2 * rl - command-line interface to read a line from the standard input
3 *      (or another fd) using readline.
4 *
5 * usage: rl [-p prompt] [-u unit] [-d default] [-n nchars]
6 */
7
8/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
9
10   This file is part of the GNU Readline Library (Readline), a library for
11   reading lines of text with interactive input and history editing.
12
13   Readline is free software: you can redistribute it and/or modify
14   it under the terms of the GNU General Public License as published by
15   the Free Software Foundation, either version 3 of the License, or
16   (at your option) any later version.
17
18   Readline is distributed in the hope that it will be useful,
19   but WITHOUT ANY WARRANTY; without even the implied warranty of
20   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
21   GNU General Public License for more details.
22
23   You should have received a copy of the GNU General Public License
24   along with Readline.  If not, see <http://www.gnu.org/licenses/>.
25*/
26
27#if defined (HAVE_CONFIG_H)
28#  include <config.h>
29#endif
30
31#ifdef HAVE_UNISTD_H
32#  include <unistd.h>
33#else
34extern int getopt();
35extern int sleep();
36#endif
37
38#include <stdio.h>
39#include <sys/types.h>
40
41#ifdef HAVE_STDLIB_H
42#  include <stdlib.h>
43#else
44extern void exit();
45#endif
46
47#if defined (READLINE_LIBRARY)
48#  include "posixstat.h"
49#  include "readline.h"
50#  include "history.h"
51#else
52#  include <sys/stat.h>
53#  include <readline/readline.h>
54#  include <readline/history.h>
55#endif
56
57extern int optind;
58extern char *optarg;
59
60#if !defined (strchr) && !defined (__STDC__)
61extern char *strrchr();
62#endif
63
64static char *progname;
65static char *deftext;
66
67static int
68event_hook ()
69{
70  fprintf (stderr, "ding!\n");
71  sleep (1);
72  return 0;
73}
74
75static int
76set_deftext ()
77{
78  if (deftext)
79    {
80      rl_insert_text (deftext);
81      deftext = (char *)NULL;
82      rl_startup_hook = (rl_hook_func_t *)NULL;
83    }
84  return 0;
85}
86
87static void
88usage()
89{
90  fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n",
91		progname, progname);
92}
93
94int
95main (argc, argv)
96     int argc;
97     char **argv;
98{
99  char *temp, *prompt;
100  struct stat sb;
101  int opt, fd, nch;
102  FILE *ifp;
103
104  progname = strrchr(argv[0], '/');
105  if (progname == 0)
106    progname = argv[0];
107  else
108    progname++;
109
110  /* defaults */
111  prompt = "readline$ ";
112  fd = nch = 0;
113  deftext = (char *)0;
114
115  while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF)
116    {
117      switch (opt)
118	{
119	case 'p':
120	  prompt = optarg;
121	  break;
122	case 'u':
123	  fd = atoi(optarg);
124	  if (fd < 0)
125	    {
126	      fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg);
127	      exit (2);
128	    }
129	  break;
130	case 'd':
131	  deftext = optarg;
132	  break;
133	case 'n':
134	  nch = atoi(optarg);
135	  if (nch < 0)
136	    {
137	      fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg);
138	      exit (2);
139	    }
140	  break;
141	default:
142	  usage ();
143	  exit (2);
144	}
145    }
146
147  if (fd != 0)
148    {
149      if (fstat (fd, &sb) < 0)
150	{
151	  fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd);
152	  exit (1);
153	}
154      ifp = fdopen (fd, "r");
155      rl_instream = ifp;
156    }
157
158  if (deftext && *deftext)
159    rl_startup_hook = set_deftext;
160
161  if (nch > 0)
162    rl_num_chars_to_read = nch;
163
164  rl_event_hook = event_hook;
165  temp = readline (prompt);
166
167  /* Test for EOF. */
168  if (temp == 0)
169    exit (1);
170
171  printf ("%s\n", temp);
172  exit (0);
173}
174