Annotation of embedaddon/readline/examples/rlcat.c, revision 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>