Viewing file: rlcat.c (3.22 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* * rlcat - cat(1) using readline * * usage: rlcat */
/* Copyright (C) 1987-2009 Free Software Foundation, Inc.
This file is part of the GNU Readline Library (Readline), a library for reading lines of text with interactive input and history editing.
Readline is free software: you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, either version 3 of the License, or (at your option) any later version.
Readline is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License along with Readline. If not, see <http://www.gnu.org/licenses/>. */
#if defined (HAVE_CONFIG_H) # include <config.h> #endif
#ifdef HAVE_UNISTD_H # include <unistd.h> #endif
#include <sys/types.h> #include "posixstat.h"
#include <stdio.h> #include <ctype.h> #include <string.h> #include <errno.h>
#ifdef HAVE_STDLIB_H # include <stdlib.h> #else extern void exit(); #endif
#ifndef errno extern int errno; #endif
#if defined (READLINE_LIBRARY) # include "readline.h" # include "history.h" #else # include <readline/readline.h> # include <readline/history.h> #endif
extern int optind; extern char *optarg;
static int stdcat();
static char *progname; static int vflag;
static void usage() { fprintf (stderr, "%s: usage: %s [-vEVN] [filename]\n", progname, progname); }
int main (argc, argv) int argc; char **argv; { char *temp; int opt, Vflag, Nflag;
progname = strrchr(argv[0], '/'); if (progname == 0) progname = argv[0]; else progname++;
vflag = Vflag = Nflag = 0; while ((opt = getopt(argc, argv, "vEVN")) != EOF) { switch (opt) { case 'v': vflag = 1; break; case 'V': Vflag = 1; break; case 'E': Vflag = 0; break; case 'N': Nflag = 1; break; default: usage (); exit (2); } }
argc -= optind; argv += optind;
if (isatty(0) == 0 || argc || Nflag) return stdcat(argc, argv);
rl_variable_bind ("editing-mode", Vflag ? "vi" : "emacs"); while (temp = readline ("")) { if (*temp) add_history (temp); printf ("%s\n", temp); }
return (ferror (stdout)); }
static int fcopy(fp) FILE *fp; { int c; char *x;
while ((c = getc(fp)) != EOF) { if (vflag && isascii ((unsigned char)c) && isprint((unsigned char)c) == 0) { x = rl_untranslate_keyseq (c); if (fputs (x, stdout) != 0) return 1; } else if (putchar (c) == EOF) return 1; } return (ferror (stdout)); }
int stdcat (argc, argv) int argc; char **argv; { int i, fd, r; char *s; FILE *fp;
if (argc == 0) return (fcopy(stdin));
for (i = 0, r = 1; i < argc; i++) { if (*argv[i] == '-' && argv[i][1] == 0) fp = stdin; else { fp = fopen (argv[i], "r"); if (fp == 0) { fprintf (stderr, "%s: %s: cannot open: %s\n", progname, argv[i], strerror(errno)); continue; } } r = fcopy (fp); if (fp != stdin) fclose(fp); } return r; }
|