irnfx

gnu yes

Nov 13th, 2015
636
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.61 KB | None | 0 0
  1. /* yes - output a string repeatedly until killed
  2.    Copyright (C) 1991-2015 Free Software Foundation, Inc.
  3.  
  4.    This program is free software: you can redistribute it and/or modify
  5.    it under the terms of the GNU General Public License as published by
  6.    the Free Software Foundation, either version 3 of the License, or
  7.    (at your option) any later version.
  8.  
  9.    This program is distributed in the hope that it will be useful,
  10.    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11.    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12.    GNU General Public License for more details.
  13.  
  14.    You should have received a copy of the GNU General Public License
  15.    along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
  16.  
  17. /* David MacKenzie <[email protected]> */
  18.  
  19. #include <config.h>
  20. #include <stdio.h>
  21. #include <sys/types.h>
  22. #include <getopt.h>
  23.  
  24. #include "system.h"
  25.  
  26. #include "error.h"
  27. #include "long-options.h"
  28.  
  29. /* The official name of this program (e.g., no 'g' prefix).  */
  30. #define PROGRAM_NAME "yes"
  31.  
  32. #define AUTHORS proper_name ("David MacKenzie")
  33.  
  34. void
  35. usage (int status)
  36. {
  37.   if (status != EXIT_SUCCESS)
  38.     emit_try_help ();
  39.   else
  40.     {
  41.       printf (_("\
  42. Usage: %s [STRING]...\n\
  43.  or:  %s OPTION\n\
  44. "),
  45.               program_name, program_name);
  46.  
  47.       fputs (_("\
  48. Repeatedly output a line with all specified STRING(s), or 'y'.\n\
  49. \n\
  50. "), stdout);
  51.       fputs (HELP_OPTION_DESCRIPTION, stdout);
  52.       fputs (VERSION_OPTION_DESCRIPTION, stdout);
  53.       emit_ancillary_info (PROGRAM_NAME);
  54.     }
  55.   exit (status);
  56. }
  57.  
  58. int
  59. main (int argc, char **argv)
  60. {
  61.   char buf[BUFSIZ];
  62.   char *pbuf = buf;
  63.   int i;
  64.  
  65.   initialize_main (&argc, &argv);
  66.   set_program_name (argv[0]);
  67.   setlocale (LC_ALL, "");
  68.   bindtextdomain (PACKAGE, LOCALEDIR);
  69.   textdomain (PACKAGE);
  70.  
  71.   atexit (close_stdout);
  72.  
  73.   parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
  74.                       usage, AUTHORS, (char const *) NULL);
  75.   if (getopt_long (argc, argv, "+", NULL, NULL) != -1)
  76.     usage (EXIT_FAILURE);
  77.  
  78.   if (argc <= optind)
  79.     {
  80.       optind = argc;
  81.       argv[argc++] = bad_cast ("y");
  82.     }
  83.  
  84.   /* Buffer data locally once, rather than having the
  85.      large overhead of stdio buffering each item.  */
  86.   for (i = optind; i < argc; i++)
  87.     {
  88.       size_t len = strlen (argv[i]);
  89.       if (BUFSIZ < len || BUFSIZ - len <= pbuf - buf)
  90.         break;
  91.       memcpy (pbuf, argv[i], len);
  92.       pbuf += len;
  93.       *pbuf++ = i == argc - 1 ? '\n' : ' ';
  94.     }
  95.   if (i == argc)
  96.     {
  97.       size_t line_len = pbuf - buf;
  98.       size_t lines = BUFSIZ / line_len;
  99.       while (--lines)
  100.         {
  101.           memcpy (pbuf, pbuf - line_len, line_len);
  102.           pbuf += line_len;
  103.         }
  104.     }
  105.  
  106.   /* The normal case is to continuously output the local buffer.  */
  107.   while (i == argc)
  108.     {
  109.       if (write (STDOUT_FILENO, buf, pbuf - buf) == -1)
  110.         {
  111.           error (0, errno, _("standard output"));
  112.           return EXIT_FAILURE;
  113.         }
  114.     }
  115.  
  116.   /* If the data doesn't fit in BUFSIZ then output
  117.      what we've buffered, and iterate over the remaining items.  */
  118.   while (true /* i != argc */)
  119.     {
  120.       int j;
  121.       if ((pbuf - buf) && fwrite (buf, pbuf - buf, 1, stdout) != 1)
  122.         {
  123.           error (0, errno, _("standard output"));
  124.           return EXIT_FAILURE;
  125.         }
  126.       for (j = i; j < argc; j++)
  127.         if (fputs (argv[j], stdout) == EOF
  128.             || putchar (j == argc - 1 ? '\n' : ' ') == EOF)
  129.           {
  130.             error (0, errno, _("standard output"));
  131.             return EXIT_FAILURE;
  132.           }
  133.     }
  134. }
Advertisement
Add Comment
Please, Sign In to add comment