File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / readline / examples / rlcat.c
Revision 1.1.1.2 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Wed Mar 17 01:01:01 2021 UTC (3 years, 3 months ago) by misho
Branches: readline, MAIN
CVS tags: v8_2p0, v8_1p0, HEAD
readline 8.1

    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) == EOF)
  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>