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 #if defined (HAVE_CONFIG_H) 9 # include <config.h> 10 #endif 11 12 #include <stdio.h> 13 #include <sys/types.h> 14 #include "posixstat.h" 15 16 #if defined (READLINE_LIBRARY) 17 # include "readline.h" 18 # include "history.h" 19 #else 20 # include <readline/readline.h> 21 # include <readline/history.h> 22 #endif 23 24 extern int optind; 25 extern char *optarg; 26 27 #if !defined (strchr) && !defined (__STDC__) 28 extern char *strrchr(); 29 #endif 30 31 static char *progname; 32 static char *deftext; 33 34 static int 35 set_deftext () 36 { 37 if (deftext) 38 { 39 rl_insert_text (deftext); 40 deftext = (char *)NULL; 41 rl_startup_hook = (Function *)NULL; 42 } 43 return 0; 44 } 45 46 static void 47 usage() 48 { 49 fprintf (stderr, "%s: usage: %s [-p prompt] [-u unit] [-d default] [-n nchars]\n", 50 progname, progname); 51 } 52 53 int 54 main (argc, argv) 55 int argc; 56 char **argv; 57 { 58 char *temp, *prompt; 59 struct stat sb; 60 int opt, fd, nch; 61 FILE *ifp; 62 63 progname = strrchr(argv[0], '/'); 64 if (progname == 0) 65 progname = argv[0]; 66 else 67 progname++; 68 69 /* defaults */ 70 prompt = "readline$ "; 71 fd = nch = 0; 72 deftext = (char *)0; 73 74 while ((opt = getopt(argc, argv, "p:u:d:n:")) != EOF) 75 { 76 switch (opt) 77 { 78 case 'p': 79 prompt = optarg; 80 break; 81 case 'u': 82 fd = atoi(optarg); 83 if (fd < 0) 84 { 85 fprintf (stderr, "%s: bad file descriptor `%s'\n", progname, optarg); 86 exit (2); 87 } 88 break; 89 case 'd': 90 deftext = optarg; 91 break; 92 case 'n': 93 nch = atoi(optarg); 94 if (nch < 0) 95 { 96 fprintf (stderr, "%s: bad value for -n: `%s'\n", progname, optarg); 97 exit (2); 98 } 99 break; 100 default: 101 usage (); 102 exit (2); 103 } 104 } 105 106 if (fd != 0) 107 { 108 if (fstat (fd, &sb) < 0) 109 { 110 fprintf (stderr, "%s: %d: bad file descriptor\n", progname, fd); 111 exit (1); 112 } 113 ifp = fdopen (fd, "r"); 114 rl_instream = ifp; 115 } 116 117 if (deftext && *deftext) 118 rl_startup_hook = set_deftext; 119 120 if (nch > 0) 121 rl_num_chars_to_read = nch; 122 123 temp = readline (prompt); 124 125 /* Test for EOF. */ 126 if (temp == 0) 127 exit (1); 128 129 puts (temp); 130 exit (0); 131 } 132