fork download
  1. /* yes - output a string repeatedly until killed
  2.   Copyright (C) 1991-2016 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://w...content-available-to-author-only...u.org/licenses/>. */
  16.  
  17. /* David MacKenzie <djm@gnu.ai.mit.edu> */
  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 "full-write.h"
  28. #include "long-options.h"
  29.  
  30. /* The official name of this program (e.g., no 'g' prefix). */
  31. #define PROGRAM_NAME "yes"
  32.  
  33. #define AUTHORS proper_name ("David MacKenzie")
  34.  
  35. void
  36. usage (int status)
  37. {
  38. if (status != EXIT_SUCCESS)
  39. emit_try_help ();
  40. else
  41. {
  42. printf (_("\
  43. Usage: %s [STRING]...\n\
  44. or: %s OPTION\n\
  45. "),
  46. program_name, program_name);
  47.  
  48. fputs (_("\
  49. Repeatedly output a line with all specified STRING(s), or 'y'.\n\
  50. \n\
  51. "), stdout);
  52. fputs (HELP_OPTION_DESCRIPTION, stdout);
  53. fputs (VERSION_OPTION_DESCRIPTION, stdout);
  54. emit_ancillary_info (PROGRAM_NAME);
  55. }
  56. exit (status);
  57. }
  58.  
  59. int
  60. main (int argc, char **argv)
  61. {
  62. initialize_main (&argc, &argv);
  63. set_program_name (argv[0]);
  64. setlocale (LC_ALL, "");
  65. bindtextdomain (PACKAGE, LOCALEDIR);
  66. textdomain (PACKAGE);
  67.  
  68. atexit (close_stdout);
  69.  
  70. parse_long_options (argc, argv, PROGRAM_NAME, PACKAGE_NAME, Version,
  71. usage, AUTHORS, (char const *) NULL);
  72. if (getopt_long (argc, argv, "+", NULL, NULL) != -1)
  73. usage (EXIT_FAILURE);
  74.  
  75. char **operands = argv + optind;
  76. char **operand_lim = argv + argc;
  77. if (optind == argc)
  78. *operand_lim++ = bad_cast ("y");
  79.  
  80. /* Buffer data locally once, rather than having the
  81.   large overhead of stdio buffering each item. */
  82. size_t bufalloc = 0;
  83. bool reuse_operand_strings = true;
  84. for (char **operandp = operands; operandp < operand_lim; operandp++)
  85. {
  86. size_t operand_len = strlen (*operandp);
  87. bufalloc += operand_len + 1;
  88. if (operandp + 1 < operand_lim
  89. && *operandp + operand_len + 1 != operandp[1])
  90. reuse_operand_strings = false;
  91. }
  92.  
  93. /* Improve performance by using a buffer size greater than BUFSIZ / 2. */
  94. if (bufalloc <= BUFSIZ / 2)
  95. {
  96. bufalloc = BUFSIZ;
  97. reuse_operand_strings = false;
  98. }
  99.  
  100. /* Fill the buffer with one copy of the output. If possible, reuse
  101.   the operands strings; this wins when the buffer would be large. */
  102. char *buf = reuse_operand_strings ? *operands : xmalloc (bufalloc);
  103. size_t bufused = 0;
  104. for (char **operandp = operands; operandp < operand_lim; operandp++)
  105. {
  106. size_t operand_len = strlen (*operandp);
  107. if (! reuse_operand_strings)
  108. memcpy (buf + bufused, *operandp, operand_len);
  109. bufused += operand_len;
  110. buf[bufused++] = ' ';
  111. }
  112. buf[bufused - 1] = '\n';
  113.  
  114. /* If a larger buffer was allocated, fill it by repeating the buffer
  115.   contents. */
  116. size_t copysize = bufused;
  117. for (size_t copies = bufalloc / copysize; --copies; )
  118. {
  119. memcpy (buf + bufused, buf, copysize);
  120. bufused += copysize;
  121. }
  122.  
  123. /* Repeatedly output the buffer until there is a write error; then fail. */
  124. while (full_write (STDOUT_FILENO, buf, bufused) == bufused)
  125. continue;
  126. error (0, errno, _("standard output"));
  127. return EXIT_FAILURE;
  128. }
  129.  
Compilation error #stdin compilation error #stdout 0s 0KB
stdin
Standard input is empty
compilation info
prog.c:19:10: fatal error: 'config.h' file not found
#include <config.h>
         ^~~~~~~~~~
1 error generated.
stdout
Standard output is empty